Primer programske kode Arduino
#vključiti <stdio.h>
#vključiti <niz.h>
#vključiti <inttypes.h>
#vključiti “Arduino.h”
#vključiti “XGZP6859D.h”
//Inicializacija IIC BUS
ničen XGZP6859D::IIC_Init(praznina)
{
pinMode(IIC_SCL, IZHOD); //Nastavite pin v izhodni način
pinMode(IIC_SDA, IZHOD);
digitalWrite(IIC_SCL, VISOKA); //Izhod na visoki ravni
digitalWrite(IIC_SDA, VISOKA);
}
//Ustvari startni signal
ničen XGZP6859D::IIC_Začetek(praznina)
{
pinMode(IIC_SDA, IZHOD);
digitalWrite(IIC_SDA, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME); //Zakasnitev nekaj mikrosekund
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
}
//Ustvari stop signal
ničen XGZP6859D::IIC_Stop(praznina)
{
pinMode(IIC_SDA, IZHOD);
digitalWrite(IIC_SDA, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
}
//Počakajte na signal ACK
//vrnitev 1 pomeni neuspeh
//vrnitev 0 pomeni uspeh
bajt XGZP6859D::IIC_Wait_Ack(praznina)
{
bajt ucErrTime=0;
pinMode(IIC_SDA, VNOS);
digitalWrite(IIC_SDA, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
medtem ko(digitalRead(IIC_SDA)==VISOKA)
{
ucErrTime++;
če(ucErrTime>250)
{
IIC_Stop();
vrnitev 1;
}
}
digitalWrite(IIC_SCL, NIZKA);
vrnitev 0;
}
//Ustvari signal ACK
ničen XGZP6859D::IIC_Ack(praznina)
{
digitalWrite(IIC_SCL, NIZKA);
pinMode(IIC_SDA, IZHOD);
digitalWrite(IIC_SDA, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
}
//Ne ustvari signala ACK
ničen XGZP6859D::IIC_NAck(praznina)
{
digitalWrite(IIC_SCL, NIZKA);
pinMode(IIC_SDA, IZHOD);
digitalWrite(IIC_SDA, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
}
//Pošlji en bajt po vodilu IIC
//Vrnjena vrednost pomeni odgovor podrejenega
//1 pomeni prejeti odgovor
//0 pomeni, da ne prejmete odgovora
ničen XGZP6859D::IIC_Send_Byte(bajt txd)
{
bajt t;
pinMode(IIC_SDA, IZHOD);
digitalWrite(IIC_SCL, NIZKA);
za(t=0;t<8;t++)
{
če(txd & 0x80)
digitalWrite(IIC_SDA, VISOKA);
drugače
digitalWrite(IIC_SDA, NIZKA);
txd<<=1;
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
}
digitalWrite(IIC_SCL, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
}
//Preberi en bajt, pošlji ACK medtem ko ack = 1, pošlji nACK medtem ko ack = 0
bajt XGZP6859D::IIC_Read_Byte(sprememba žal)
{
menjava v,prejeti=0;
pinMode(IIC_SDA, VNOS);
za(i=0;i<8;i++ )
{
digitalWrite(IIC_SCL, NIZKA);
zamuda mikrosekund(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, VISOKA);
zamuda mikrosekund(IIC_DELAY_TIME);
prejemati<<=1;
če(digitalRead(IIC_SDA)==VISOKA)
prejmi++;
zamuda mikrosekund(IIC_DELAY_TIME);
}
digitalWrite(IIC_SDA, VISOKA);
vrniti prejemati;
}
//Zapišite en bajt na določen naslov
ničen XGZP6859D::Write_One_Byte(naslov u8 ,podatki u8)
{
IIC_Začetek();
IIC_Send_Byte((bajt)(Naslov_naprave + 0));
Serijski.natis(“Device_Address je “);
Serial.println(Naslov_naprave + 0, HEX);
IIC_Wait_Ack();
IIC_Send_Byte(naslov);
IIC_Wait_Ack();
IIC_Send_Byte(podatke);
IIC_Wait_Ack();
IIC_Stop();
}
//Preberi en bajt z določenega naslova
bajt XGZP6859D::Read_One_Byte(naslov u8)
{
bajt moji podatki;
IIC_Začetek();
IIC_Send_Byte((bajt)(Naslov_naprave + 0));
IIC_Wait_Ack();
IIC_Send_Byte(naslov);
IIC_Wait_Ack();
IIC_Začetek();
IIC_Send_Byte((bajt)(Naslov_naprave + 1));
IIC_Wait_Ack();
mydata = IIC_Read_Byte(0);
IIC_Stop();
vrni moje podatke;
}
ničen XGZP6859D::XGZP6859D_get_cal() //Merilno delovanje XGZP6859D
{
bajt i=0;
bajt buff[5]; //Pet bajtnih spremenljivk, uporablja se za shranjevanje bajtov, prebranih iz XGZP6859D
nepredznačen dolg pritisk_oglas,temperature_ad; //Spremenljivke, ki se uporabljajo za shranjevanje kalibartiranega tlaka in temperature
Write_One_Byte(0x30, 0x0A); //Označite kombinirano pretvorbo
medtem ko ((Read_One_Byte(0x30) & 0x08) == 0x80) //Presodite, ali je zbiranje podatkov končano
{
Serial.println(“XGZP6859D ni pripravljen”);; //Počakajte, da podatki niso pripravljeni
zamuda(1000);
}
za(i=0;i<5;i++) //Preberite izhodne podatke ADC o tlaku in temperaturi
buff[i] = Preberi en bajt(0x06 + i);
Serijski.natis(“buff[0…4] je 0x”);
Serijski.natis(buff[0], HEX);
Serijski.natis(“, 0x”);
Serijski.natis(buff[1], HEX);
Serijski.natis(“, 0x”);
Serijski.natis(buff[2], HEX);
Serijski.natis(“, 0x”);
Serijski.natis(buff[3], HEX);
Serijski.natis(“, 0x”);
Serial.println(buff[4], HEX);
//Izračunajte vrednost tlaka, pretvorjenega z ADC
tlak_oglas = ((nepodpisano dolgo)((nepodpisano dolgo)(buff[0] * 65536)) + ((nepodpisano int)(buff[1] * 256)) + ((bajt)buff[2]));
Serijski.natis(“tlak_oglas je “);
Serial.println(tlak_oglas);
če (tlak_oglas > 8388608) //
{
tlak = (dolgo)(((dolgo)(tlak_oglas – 16777216)) / 8192);
//Ker je razpon -500Pa~+500Pa, torej k je 8192;k je treba spremeniti glede na dejansko stanje; enota tlaka je Pa
}
drugače
{
tlak = (dolgo)(tlak_oglas / 8192);
}
//Izračunajte vrednost temperature, pretvorjeno z ADC
temperatura_oglas = ((nepodpisano int)((nepodpisano int)(buff[3]<<8)) + ((bajt)buff[4]));
če (temperature_ad > 32768)
{
temperatura = (lebdi)(((dolgo)(temperature_ad – 65536)) / 256);
//Enota za temperaturo je Celzijus
}
drugače
{
temperatura = (lebdi)(temperature_ad / 256);
}
}
XGZP6859D Moj_XGZP6859D; //Definirajte objekt z imenom My_XGZP6859D razreda XGZP6859D
nastavitev praznine()
{
Serial.begin(9600); //Inicializacija serijskih vrat
Moj_XGZP6859D.IIC_Init(); //Inicializirajte zatiče IIC vodila My_XGZP6859D
}
prazna zanka()
{
Moj_XGZP6859D.XGZP6859D_get_cal(); //Pokličite funkcijo XGZP6859D_get_cal() objekta My_XGZP6859D za izračun tlaka in temperature
Serijski.natis(Moj_XGZP6859D.tlak);
Serial.println(” oče”);
Serijski.natis(Moj_XGZP6859D.temperatura);
Serial.println(” Celzija”);
Serial.println(“”);
zamuda(1000);
}