Exemple de programme Arduino Code
#inclure <stdio.h>
#inclure <chaîne.h>
#inclure <inttypes.h>
#inclure “Arduino.h”
#inclure “XGZP6859D.h”
//L'initialisation du BUS IIC
annuler XGZP6859D::IIC_Init(vide)
{
mode broche(IIC_SCL, SORTIR); //Réglez la broche en mode sortie
mode broche(IIC_SDA, SORTIR);
écriture numérique(IIC_SCL, HAUT); //Haut niveau de sortie
écriture numérique(IIC_SDA, HAUT);
}
//Générer un signal de démarrage
annuler XGZP6859D::IIC_Début(vide)
{
mode broche(IIC_SDA, SORTIR);
écriture numérique(IIC_SDA, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME); //Retarder plusieurs microsecondes
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SDA, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
}
//Générer un signal d'arrêt
annuler XGZP6859D::IIC_Arrêter(vide)
{
mode broche(IIC_SDA, SORTIR);
écriture numérique(IIC_SDA, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SDA, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
}
//Attendez le signal ACK
//retour 1 signifie un échec
//retour 0 signifie le succès
octet XGZP6859D::IIC_Wait_Ack(vide)
{
octet ucErrTime=0;
mode broche(IIC_SDA, SAISIR);
écriture numérique(IIC_SDA, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
alors que(lecture numérique(IIC_SDA)==ÉLEVÉ)
{
ucErrTime++;
si(ucErrTime>250)
{
IIC_Arrêter();
retour 1;
}
}
écriture numérique(IIC_SCL, FAIBLE);
retour 0;
}
//Générer un signal ACK
annuler XGZP6859D::IIC_Ack(vide)
{
écriture numérique(IIC_SCL, FAIBLE);
mode broche(IIC_SDA, SORTIR);
écriture numérique(IIC_SDA, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SDA, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
}
//Ne génère pas de signal ACK
annuler XGZP6859D::IIC_NAck(vide)
{
écriture numérique(IIC_SCL, FAIBLE);
mode broche(IIC_SDA, SORTIR);
écriture numérique(IIC_SDA, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
}
//Envoyer un octet sur le bus IIC
//La valeur de retour signifie la réponse de l'esclave
//1 signifie recevoir une réponse
//0 signifie ne pas recevoir de réponse
annuler XGZP6859D::IIC_Send_Byte(octet de transmission)
{
octet t;
mode broche(IIC_SDA, SORTIR);
écriture numérique(IIC_SCL, FAIBLE);
pour(t=0;t<8;t++)
{
si(txd & 0x80)
écriture numérique(IIC_SDA, HAUT);
autre
écriture numérique(IIC_SDA, FAIBLE);
txd<<=1;
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
}
écriture numérique(IIC_SCL, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SDA, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
}
//Lire un octet, envoyer ACK pendant ack = 1, envoyer nACK pendant ack = 0
octet XGZP6859D::IIC_Read_Byte(changement hélas)
{
échange en,recevoir=0;
mode broche(IIC_SDA, SAISIR);
pour(je = 0;je<8;je++ )
{
écriture numérique(IIC_SCL, FAIBLE);
délaiMicrosecondes(IIC_DELAY_TIME);
écriture numérique(IIC_SCL, HAUT);
délaiMicrosecondes(IIC_DELAY_TIME);
recevoir<<=1;
si(lecture numérique(IIC_SDA)==ÉLEVÉ)
recevoir++;
délaiMicrosecondes(IIC_DELAY_TIME);
}
écriture numérique(IIC_SDA, HAUT);
retourner recevoir;
}
//Écrire un octet à une adresse spécifiée
annuler XGZP6859D::Write_One_Byte(adresse u8 ,données u8)
{
IIC_Début();
IIC_Send_Byte((octet)(Adresse_appareil + 0));
Serial.print(“Device_Address est “);
Série.println(Adresse_appareil + 0, HEXAMEN);
IIC_Wait_Ack();
IIC_Send_Byte(adresse);
IIC_Wait_Ack();
IIC_Send_Byte(données);
IIC_Wait_Ack();
IIC_Arrêter();
}
//Lire un octet à partir d'une adresse spécifiée
octet XGZP6859D::Read_One_Byte(adresse u8)
{
octet mes données;
IIC_Début();
IIC_Send_Byte((octet)(Adresse_appareil + 0));
IIC_Wait_Ack();
IIC_Send_Byte(adresse);
IIC_Wait_Ack();
IIC_Début();
IIC_Send_Byte((octet)(Adresse_appareil + 1));
IIC_Wait_Ack();
mesdonnées = IIC_Read_Byte(0);
IIC_Arrêter();
renvoyer mes données;
}
annuler XGZP6859D::XGZP6859D_get_cal() //L'action de mesure du XGZP6859D
{
octet i=0;
buff d'octets[5]; //Variables à cinq octets, utilisé pour enregistrer les octets lus depuis XGZP6859D
pression_ad longue non signée,température_ad; //Variables utilisées pour enregistrer la pression et la température étalonnées
Write_One_Byte(0x30, 0x0A); //Indiquer une conversion combinée
alors que ((Read_One_Byte(0x30) & 0x08) == 0x80) //Juger si la collecte de données est terminée
{
Série.println(“XGZP6859D n'est pas prêt”);; //Attendez que les données ne soient pas prêtes
retard(1000);
}
pour(je = 0;je<5;je++) //Lire les données de sortie ADC de pression et de température
chamois[je] = Read_One_Byte(0x06 + je);
Serial.print(“chamois[0…4] est 0x”);
Serial.print(chamois[0], HEXAMEN);
Serial.print(“, 0X”);
Serial.print(chamois[1], HEXAMEN);
Serial.print(“, 0X”);
Serial.print(chamois[2], HEXAMEN);
Serial.print(“, 0X”);
Serial.print(chamois[3], HEXAMEN);
Serial.print(“, 0X”);
Série.println(chamois[4], HEXAMEN);
//Calculer la valeur de la pression convertie par ADC
pression_ad = ((non signé depuis longtemps)((non signé depuis longtemps)(chamois[0] * 65536)) + ((entier non signé)(chamois[1] * 256)) + ((octet)chamois[2]));
Serial.print(“pression_ad est “);
Série.println(pression_ad);
si (pression_ad > 8388608) //
{
pression = (long)(((long)(pression_ad – 16777216)) / 8192);
//Parce que la durée est de -500 Pa ~ + 500 Pa., donc k est 8192;k doit être modifié en fonction de la condition actuelle; l'unité de pression est Pa
}
autre
{
pression = (long)(pression_ad / 8192);
}
//Calculer la valeur de la température convertie par ADC
température_ad = ((entier non signé)((entier non signé)(chamois[3]<<8)) + ((octet)chamois[4]));
si (température_ad > 32768)
{
température = (flotter)(((long)(température_ad – 65536)) / 256);
//L'unité de température est le centigrade
}
autre
{
température = (flotter)(température_ad / 256);
}
}
XGZP6859D Mon_XGZP6859D; //Définir un objet nommé My_XGZP6859D de la classe XGZP6859D
void setup()
{
Série.begin(9600); //L'initialisation du port série
Mon_XGZP6859D.IIC_Init(); //Initialiser les broches du bus IIC de My_XGZP6859D
}
boucle vide()
{
Mon_XGZP6859D.XGZP6859D_get_cal(); //Appelez la fonction XGZP6859D_get_cal() de l'objet My_XGZP6859D pour calculer la pression et la température
Serial.print(My_XGZP6859D.pression);
Série.println(” Pennsylvanie”);
Serial.print(Ma_XGZP6859D.température);
Série.println(” Centigrade”);
Série.println(“”);
retard(1000);
}