Programma di esempio codice Arduino
#includere <stdio.h>
#includere <stringa.h>
#includere <inttypes.h>
#includere “Arduino.h”
#includere “XGZP6859D.h”
//L'inizializzazione di IIC BUS
vuoto XGZP6859D::IIC_Init(vuoto)
{
pinMode(IIC_SCL, PRODUZIONE); //Imposta il pin sulla modalità di output
pinMode(IIC_SDA, PRODUZIONE);
digitalWrite(IIC_SCL, ALTO); //Emissione di alto livello
digitalWrite(IIC_SDA, ALTO);
}
//Genera il segnale di inizio
vuoto XGZP6859D::IIC_Avvio(vuoto)
{
pinMode(IIC_SDA, PRODUZIONE);
digitalWrite(IIC_SDA, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME); //Ritarda diversi microsecondi
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
}
//Genera il segnale di arresto
vuoto XGZP6859D::IIC_Stop(vuoto)
{
pinMode(IIC_SDA, PRODUZIONE);
digitalWrite(IIC_SDA, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
}
//Attendi il segnale ACK
//ritorno 1 significa fallimento
//ritorno 0 significa successo
byteXGZP6859D::IIC_Wait_Ack(vuoto)
{
byte ucErrTime=0;
pinMode(IIC_SDA, INGRESSO);
digitalWrite(IIC_SDA, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
Mentre(digitalLeggi(IIC_SDA)==ALTO)
{
ucErrTime++;
Se(ucErrTime>250)
{
IIC_Stop();
ritorno 1;
}
}
digitalWrite(IIC_SCL, BASSO);
ritorno 0;
}
//Genera segnale ACK
vuoto XGZP6859D::IIC_Ack(vuoto)
{
digitalWrite(IIC_SCL, BASSO);
pinMode(IIC_SDA, PRODUZIONE);
digitalWrite(IIC_SDA, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
}
//Non generare segnale ACK
vuoto XGZP6859D::IIC_NAck(vuoto)
{
digitalWrite(IIC_SCL, BASSO);
pinMode(IIC_SDA, PRODUZIONE);
digitalWrite(IIC_SDA, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
}
//Invia un byte sul bus IIC
//Il valore restituito indica la risposta dello slave
//1 significa ricevere risposta
//0 significa non ricevere risposta
vuoto XGZP6859D::IIC_Send_Byte(byte txd)
{
byte t;
pinMode(IIC_SDA, PRODUZIONE);
digitalWrite(IIC_SCL, BASSO);
per(t=0;T<8;t++)
{
Se(txd & 0x80)
digitalWrite(IIC_SDA, ALTO);
altro
digitalWrite(IIC_SDA, BASSO);
txd<<=1;
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
}
digitalWrite(IIC_SCL, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SDA, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
}
//Leggi un byte, invia ACK mentre ack = 1, invia nACK mentre ack = 0
byteXGZP6859D::IIC_Leggi_Byte(cambiare ahimè)
{
scambiare,ricevere=0;
pinMode(IIC_SDA, INGRESSO);
per(io=0;io<8;io++ )
{
digitalWrite(IIC_SCL, BASSO);
ritardoMicrosecondi(IIC_DELAY_TIME);
digitalWrite(IIC_SCL, ALTO);
ritardoMicrosecondi(IIC_DELAY_TIME);
ricevere<<=1;
Se(digitalLeggi(IIC_SDA)==ALTO)
ricevere++;
ritardoMicrosecondi(IIC_DELAY_TIME);
}
digitalWrite(IIC_SDA, ALTO);
ritorno ricevere;
}
//Scrive un byte a un indirizzo specificato
vuoto XGZP6859D::Scrivi_Un_Byte(indirizzo u8 ,dati u8)
{
IIC_Avvio();
IIC_Send_Byte((byte)(Indirizzo_dispositivo + 0));
Stampa.seriale(“Indirizzo_dispositivo è “);
Serial.println(Indirizzo_dispositivo + 0, ESAGONALE);
IIC_Wait_Ack();
IIC_Send_Byte(indirizzo);
IIC_Wait_Ack();
IIC_Send_Byte(dati);
IIC_Wait_Ack();
IIC_Stop();
}
//Legge un byte da un indirizzo specificato
byteXGZP6859D::Leggi_Un_Byte(indirizzo u8)
{
byte mieidati;
IIC_Avvio();
IIC_Send_Byte((byte)(Indirizzo_dispositivo + 0));
IIC_Wait_Ack();
IIC_Send_Byte(indirizzo);
IIC_Wait_Ack();
IIC_Avvio();
IIC_Send_Byte((byte)(Indirizzo_dispositivo + 1));
IIC_Wait_Ack();
mieidati = IIC_Read_Byte(0);
IIC_Stop();
restituire i miei dati;
}
vuoto XGZP6859D::XGZP6859D_get_cal() //L'azione di misurazione di XGZP6859D
{
byte i=0;
potenziamento dei byte[5]; //Cinque variabili byte, utilizzato per salvare i byte letti da XGZP6859D
pressione_ad lunga non firmata,temperatura_ad; //Variabili utilizzate per salvare la pressione e la temperatura calibrate
Scrivi_Un_Byte(0x30, 0x0A); //Indicare una conversione combinata
Mentre ((Leggi_Un_Byte(0x30) & 0x08) == 0x80) //Giudica se la raccolta dei dati è terminata
{
Serial.println(“XGZP6859D non è pronto”);; //Attendi che i dati non siano pronti
ritardo(1000);
}
per(io=0;io<5;io++) //Leggere i dati di uscita ADC di pressione e temperatura
appassionato[io] = Leggi_Un_Byte(0x06 + io);
Stampa.seriale(“appassionato[0…4] è 0x”);
Stampa.seriale(appassionato[0], ESAGONALE);
Stampa.seriale(“, 0X”);
Stampa.seriale(appassionato[1], ESAGONALE);
Stampa.seriale(“, 0X”);
Stampa.seriale(appassionato[2], ESAGONALE);
Stampa.seriale(“, 0X”);
Stampa.seriale(appassionato[3], ESAGONALE);
Stampa.seriale(“, 0X”);
Serial.println(appassionato[4], ESAGONALE);
//Calcolare il valore della pressione convertito dall'ADC
pressione_annuncio = ((non firmato lungo)((non firmato lungo)(appassionato[0] * 65536)) + ((intero senza segno)(appassionato[1] * 256)) + ((byte)appassionato[2]));
Stampa.seriale(“pressione_annuncio è “);
Serial.println(pressione_ad);
Se (pressione_ad > 8388608) //
{
pressione = (lungo)(((lungo)(pressione_ad – 16777216)) / 8192);
//Perché l'intervallo è -500Pa~+500Pa, quindi k è 8192;k dovrebbe essere modificato in base alla condizione attuale; l'unità di pressione è Pa
}
altro
{
pressione = (lungo)(pressione_ad / 8192);
}
//Calcolare il valore della temperatura convertito dall'ADC
temperatura_ad = ((intero senza segno)((intero senza segno)(appassionato[3]<<8)) + ((byte)appassionato[4]));
Se (temperatura_ad > 32768)
{
temperatura = (galleggiante)(((lungo)(temperatura_ad – 65536)) / 256);
//L'unità di temperatura è centigradi
}
altro
{
temperatura = (galleggiante)(temperatura_ad / 256);
}
}
XGZP6859D Mio_XGZP6859D; //Definisci un oggetto denominato My_XGZP6859D della classe XGZP6859D
configurazione nulla()
{
Serial.begin(9600); //L'inizializzazione della porta seriale
My_XGZP6859D.IIC_Init(); //Inizializza i pin del bus IIC di My_XGZP6859D
}
ciclo vuoto()
{
My_XGZP6859D.XGZP6859D_get_cal(); //Chiama la funzione XGZP6859D_get_cal() dell'oggetto My_XGZP6859D per calcolare la pressione e la temperatura
Stampa.seriale(My_XGZP6859D.pressione);
Serial.println(” papà”);
Stampa.seriale(My_XGZP6859D.temperatura);
Serial.println(” Centigrado”);
Serial.println(“”);
ritardo(1000);
}