Przykładowy program Arduino kod

#włączać <stdio.h>
#włączać <ciąg.h>
#włączać <inttypes.h>
#włączać “Arduino.h”
#włączać “XGZP6859D.h”
//Inicjalizacja magistrali IIC
nieważne XGZP6859D::IIC_Init(próżnia)
{
tryb pin(IIC_SCL, WYJŚCIE); //Ustaw pin w tryb wyjściowy
tryb pin(IIC_SDA, WYJŚCIE);
cyfrowy zapis(IIC_SCL, WYSOKI); //Wysoki poziom wyczynu
cyfrowy zapis(IIC_SDA, WYSOKI);
}
//Wygeneruj sygnał startu
nieważne XGZP6859D::IIC_Start(próżnia)
{
tryb pin(IIC_SDA, WYJŚCIE);
cyfrowy zapis(IIC_SDA, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME); //Opóźnienie o kilka mikrosekund
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SDA, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
//Wygeneruj sygnał stopu
nieważne XGZP6859D::IIC_Zatrzymaj(próżnia)
{
tryb pin(IIC_SDA, WYJŚCIE);
cyfrowy zapis(IIC_SDA, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SDA, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
//Poczekaj na sygnał ACK
//powrót 1 oznacza porażkę
//powrót 0 oznacza sukces
byte XGZP6859D::IIC_Wait_Ack(próżnia)
{
bajt ucErrTime=0;
tryb pin(IIC_SDA, WEJŚCIE);
cyfrowy zapis(IIC_SDA, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
chwila(cyfrowy odczyt(IIC_SDA)==WYSOKI)
{
ucErrTime++;
Jeśli(ucErrTime>250)
{
IIC_Zatrzymaj();
powrót 1;
}
}
cyfrowy zapis(IIC_SCL, NISKI);
powrót 0;
}
//Wygeneruj sygnał ACK
nieważne XGZP6859D::IIC_Potwierdzenie(próżnia)
{
cyfrowy zapis(IIC_SCL, NISKI);
tryb pin(IIC_SDA, WYJŚCIE);
cyfrowy zapis(IIC_SDA, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SDA, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
//Nie generuje sygnału ACK
nieważne XGZP6859D::IIC_NAck(próżnia)
{
cyfrowy zapis(IIC_SCL, NISKI);
tryb pin(IIC_SDA, WYJŚCIE);
cyfrowy zapis(IIC_SDA, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
//Wyślij jeden bajt przez magistralę IIC
//Wartość zwracana oznacza odpowiedź od urządzenia podrzędnego
//1 oznacza otrzymanie odpowiedzi
//0 oznacza brak odpowiedzi
nieważne XGZP6859D::IIC_Wyślij_bajt(bajt txd)
{
bajt t;
tryb pin(IIC_SDA, WYJŚCIE);
cyfrowy zapis(IIC_SCL, NISKI);
Do(t=0;T<8;t++)
{
Jeśli(txd & 0x80)
cyfrowy zapis(IIC_SDA, WYSOKI);
w przeciwnym razie
cyfrowy zapis(IIC_SDA, NISKI);
txd<<=1;
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
cyfrowy zapis(IIC_SCL, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SDA, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
//Przeczytaj jeden bajt, wyślij ACK podczas potwierdzenia = 1, wyślij nACK podczas potwierdzenia = 0
byte XGZP6859D::IIC_Read_Byte(zmienić niestety)
{
wymienić w,otrzymać=0;
tryb pin(IIC_SDA, WEJŚCIE);
Do(ja=0;I<8;ja++ )
{
cyfrowy zapis(IIC_SCL, NISKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
cyfrowy zapis(IIC_SCL, WYSOKI);
opóźnienieMikrosekundy(IIC_DELAY_TIME);
odbierać<<=1;
Jeśli(cyfrowy odczyt(IIC_SDA)==WYSOKI)
otrzymać++;
opóźnienieMikrosekundy(IIC_DELAY_TIME);
}
cyfrowy zapis(IIC_SDA, WYSOKI);
zwrócić, otrzymać;
}
//Zapisz jeden bajt pod podanym adresem
nieważne XGZP6859D::Zapisz_jeden_bajt(adres u8 ,dane u8)
{
IIC_Start();
IIC_Wyślij_bajt((bajt)(Adres_urządzenia + 0));
Serial.print(“Adres_urządzenia to “);
Serial.println(Adres_urządzenia + 0, KLĄTWA);
IIC_Wait_Ack();
IIC_Wyślij_bajt(adres);
IIC_Wait_Ack();
IIC_Wyślij_bajt(dane);
IIC_Wait_Ack();
IIC_Zatrzymaj();
}
//Odczytaj jeden bajt z określonego adresu
byte XGZP6859D::Odczyt_Jeden_bajt(adres u8)
{
bajt moich danych;
IIC_Start();
IIC_Wyślij_bajt((bajt)(Adres_urządzenia + 0));
IIC_Wait_Ack();
IIC_Wyślij_bajt(adres);
IIC_Wait_Ack();
IIC_Start();
IIC_Wyślij_bajt((bajt)(Adres_urządzenia + 1));
IIC_Wait_Ack();
mojedane = IIC_Read_Byte(0);
IIC_Zatrzymaj();
zwróć moje dane;
}
nieważne XGZP6859D::XGZP6859D_get_cal() //Działanie pomiarowe XGZP6859D
{
bajt i=0;
wzmocnienie bajtu[5]; //Zmienne pięciobajtowe, używany do zapisywania bajtów odczytanych z XGZP6859D
unsigned długie ciśnienie_ad,temperatura_ad; //Zmienne używane do zapisywania skalibrowanego ciśnienia i temperatury
Zapisz_jeden_bajt(0x30, 0x0A); //Wskaż konwersję łączoną
chwila ((Odczyt_Jeden_bajt(0x30) & 0x08) == 0x80) //Oceń, czy gromadzenie danych się zakończyło
{
Serial.println(“XGZP6859D nie jest gotowy”);; //Poczekaj, aż dane nie będą gotowe
opóźnienie(1000);
}
Do(ja=0;I<5;ja++) //Odczytaj dane wyjściowe ADC dotyczące ciśnienia i temperatury
polerować[I] = Odczyt_Jeden_bajt(0x06 + I);
Serial.print(“polerować[0…4] wynosi 0x”);
Serial.print(polerować[0], KLĄTWA);
Serial.print(“, 0X”);
Serial.print(polerować[1], KLĄTWA);
Serial.print(“, 0X”);
Serial.print(polerować[2], KLĄTWA);
Serial.print(“, 0X”);
Serial.print(polerować[3], KLĄTWA);
Serial.print(“, 0X”);
Serial.println(polerować[4], KLĄTWA);
//Oblicz wartość ciśnienia przeliczoną przez ADC
ciśnienie_ad = ((długi bez znaku)((długi bez znaku)(polerować[0] * 65536)) + ((bez znaku int)(polerować[1] * 256)) + ((bajt)polerować[2]));
Serial.print(“reklama ciśnieniowa jest “);
Serial.println(ciśnienie_reklama);
Jeśli (ciśnienie_reklama > 8388608) //
{
ciśnienie = (długi)(((długi)(ciśnienie_reklama – 16777216)) / 8192);
//Ponieważ rozpiętość wynosi -500Pa~+500Pa, więc k jest 8192;k należy zmienić w zależności od aktualnego stanu; jednostką ciśnienia jest Pa
}
w przeciwnym razie
{
ciśnienie = (długi)(ciśnienie_reklama / 8192);
}
//Oblicz wartość temperatury przeliczoną przez ADC
temperatura_reklama = ((bez znaku int)((bez znaku int)(polerować[3]<<8)) + ((bajt)polerować[4]));
Jeśli (temperatura_ad > 32768)
{
temperatura = (platforma)(((długi)(temperatura_ad – 65536)) / 256);
//Jednostką temperatury jest stopień Celsjusza
}
w przeciwnym razie
{
temperatura = (platforma)(temperatura_ad / 256);
}
}
XGZP6859D Mój_XGZP6859D; //Zdefiniuj obiekt o nazwie My_XGZP6859D klasy XGZP6859D
konfiguracja void()
{
Serial.begin(9600); //Inicjalizacja portu szeregowego
My_XGZP6859D.IIC_Init(); //Zainicjuj piny magistrali IIC My_XGZP6859D
}
Pętla void()
{
My_XGZP6859D.XGZP6859D_get_cal(); //Wywołaj funkcję XGZP6859D_get_cal() obiektu My_XGZP6859D do obliczenia ciśnienia i temperatury
Serial.print(Moje_XGZP6859D.ciśnienie);
Serial.println(” Rocznie”);
Serial.print(Moja_XGZP6859D.temperatura);
Serial.println(” Stustopniowy”);
Serial.println(“”);
opóźnienie(1000);
}