Eksempel på program Arduino-kode
#omfatte <stdio.h>
#omfatte <streng.h>
#omfatte <inttypes.h>
#omfatte “Arduino.h”
#omfatte “XGZP6859D.h”
//Initieringen af IIC BUS
ugyldig XGZP6859D::IIC_Init(ugyldig)
{
pinMode(IIC_SCL, PRODUKTION); //Indstil stiften til udgangstilstand
pinMode(IIC_SDA, PRODUKTION);
digitalSkriv(IIC_SCL, HØJ); //Putout højt niveau
digitalSkriv(IIC_SDA, HØJ);
}
//Generer startsignal
ugyldig XGZP6859D::IIC_Start(ugyldig)
{
pinMode(IIC_SDA, PRODUKTION);
digitalSkriv(IIC_SDA, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME); //Forsink flere mikrosekunder
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SDA, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
//Generer stopsignal
ugyldig XGZP6859D::IIC_Stop(ugyldig)
{
pinMode(IIC_SDA, PRODUKTION);
digitalSkriv(IIC_SDA, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SDA, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
//Vent på ACK-signalet
//Vend tilbage 1 betyder fiasko
//Vend tilbage 0 betyder succes
byte XGZP6859D::IIC_Vent_Ack(ugyldig)
{
byte ucErrTime=0;
pinMode(IIC_SDA, INPUT);
digitalSkriv(IIC_SDA, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
mens(digitallæs(IIC_SDA)==HØJ)
{
ucErrTime++;
hvis(ucErrTime>250)
{
IIC_Stop();
Vend tilbage 1;
}
}
digitalSkriv(IIC_SCL, LAV);
Vend tilbage 0;
}
//Generer ACK-signal
ugyldig XGZP6859D::IIC_Ack(ugyldig)
{
digitalSkriv(IIC_SCL, LAV);
pinMode(IIC_SDA, PRODUKTION);
digitalSkriv(IIC_SDA, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SDA, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
//Generer ikke ACK-signal
ugyldig XGZP6859D::IIC_NAck(ugyldig)
{
digitalSkriv(IIC_SCL, LAV);
pinMode(IIC_SDA, PRODUKTION);
digitalSkriv(IIC_SDA, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
//Send en byte over IIC-bussen
//Returværdien betyder svar fra slaven
//1 betyder at modtage svar
//0 betyder ikke at modtage svar
ugyldig XGZP6859D::IIC_Send_Byte(byte txd)
{
byte t;
pinMode(IIC_SDA, PRODUKTION);
digitalSkriv(IIC_SCL, LAV);
til(t=0;t<8;t++)
{
hvis(txd & 0x80)
digitalSkriv(IIC_SDA, HØJ);
andet
digitalSkriv(IIC_SDA, LAV);
txd<<=1;
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
digitalSkriv(IIC_SCL, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SDA, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
//Læs en byte, send ACK, mens ack = 1, send nACK mens ack = 0
byte XGZP6859D::IIC_Read_Byte(ændre desværre)
{
bytte ind,modtage=0;
pinMode(IIC_SDA, INPUT);
til(i=0;jeg<8;i++ )
{
digitalSkriv(IIC_SCL, LAV);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
digitalSkriv(IIC_SCL, HØJ);
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
modtage<<=1;
hvis(digitallæs(IIC_SDA)==HØJ)
modtage++;
forsinkelse Mikrosekunder(IIC_DELAY_TIME);
}
digitalSkriv(IIC_SDA, HØJ);
retur modtage;
}
//Skriv en byte til en specificeret adresse
ugyldig XGZP6859D::Write_One_Byte(u8 adresse ,u8 data)
{
IIC_Start();
IIC_Send_Byte((byte)(Device_Address + 0));
Seriel.print(“Device_Address er “);
Serial.println(Device_Address + 0, HEX);
IIC_Vent_Ack();
IIC_Send_Byte(adresse);
IIC_Vent_Ack();
IIC_Send_Byte(data);
IIC_Vent_Ack();
IIC_Stop();
}
//Læs en byte fra en specificeret adresse
byte XGZP6859D::Read_One_Byte(u8 adresse)
{
byte mine data;
IIC_Start();
IIC_Send_Byte((byte)(Device_Address + 0));
IIC_Vent_Ack();
IIC_Send_Byte(adresse);
IIC_Vent_Ack();
IIC_Start();
IIC_Send_Byte((byte)(Device_Address + 1));
IIC_Vent_Ack();
mine data = IIC_Read_Byte(0);
IIC_Stop();
returnere mine data;
}
ugyldig XGZP6859D::XGZP6859D_get_cal() //Målevirkningen af XGZP6859D
{
byte i=0;
byte buff[5]; //Fem byte variable, bruges til at gemme bytes læst fra XGZP6859D
usigneret lang tryk_ad,temperatur_ad; //Variabler bruges til at gemme det kalibrerede tryk og temperatur
Write_One_Byte(0x30, 0x0A); //Angiv en kombineret konvertering
mens ((Read_One_Byte(0x30) & 0x08) == 0x80) //Vurder, om dataindsamlingen er slut
{
Serial.println(“XGZP6859D er ikke klar”);; //Vent, mens dataene ikke er klar
forsinke(1000);
}
til(i=0;jeg<5;i++) //Læs ADC-udgangsdata for tryk og temperatur
buff[jeg] = Read_One_Byte(0x06 + jeg);
Seriel.print(“buff[0…4] er 0x”);
Seriel.print(buff[0], HEX);
Seriel.print(“, 0x”);
Seriel.print(buff[1], HEX);
Seriel.print(“, 0x”);
Seriel.print(buff[2], HEX);
Seriel.print(“, 0x”);
Seriel.print(buff[3], HEX);
Seriel.print(“, 0x”);
Serial.println(buff[4], HEX);
//Beregn værdien af tryk konverteret af ADC
tryk_ad = ((usigneret lang)((usigneret lang)(buff[0] * 65536)) + ((usigneret int)(buff[1] * 256)) + ((byte)buff[2]));
Seriel.print(“tryk_annonce er “);
Serial.println(tryk_annonce);
hvis (tryk_annonce > 8388608) //
{
tryk = (lang)(((lang)(tryk_annonce – 16777216)) / 8192);
//Fordi spændvidden er -500Pa~+500Pa, så k er 8192;k bør ændres i henhold til aktuantilstanden; trykenheden er Pa
}
andet
{
tryk = (lang)(tryk_annonce / 8192);
}
//Beregn værdien af temperaturen konverteret af ADC
temperatur_ad = ((usigneret int)((usigneret int)(buff[3]<<8)) + ((byte)buff[4]));
hvis (temperatur_ad > 32768)
{
temperatur = (flyde)(((lang)(temperatur_ad – 65536)) / 256);
//Temperaturenheden er Celsius
}
andet
{
temperatur = (flyde)(temperatur_ad / 256);
}
}
XGZP6859D My_XGZP6859D; //Definer et objekt ved navn My_XGZP6859D af klassen XGZP6859D
ugyldig opsætning()
{
Serial.begin(9600); //Initialisering af seriel port
My_XGZP6859D.IIC_Init(); //Initialiser benene på IIC-bussen på My_XGZP6859D
}
ugyldig løkke()
{
My_XGZP6859D.XGZP6859D_get_cal(); //Kald funktionen XGZP6859D_get_cal() af objektet My_XGZP6859D til at beregne trykket og temperaturen
Seriel.print(My_XGZP6859D.tryk);
Serial.println(” Pa”);
Seriel.print(Min_XGZP6859D.temperatur);
Serial.println(” Celsius”);
Serial.println(“”);
forsinke(1000);
}