Exemplo de programa de código Arduino
#incluir <stdio.h>
#incluir <string.h>
#incluir <inttypes.h>
#incluir “arduino.h”
#incluir “XGZP6859D.h”
//A inicialização do IIC BUS
vazio XGZP6859D::IIC_Init(vazio)
{
modo pin(IIC_SCL, SAÍDA); //Defina o pino para o modo de saída
modo pin(IIC_SDA, SAÍDA);
escrita digital(IIC_SCL, ALTO); //Saída de alto nível
escrita digital(IIC_SDA, ALTO);
}
//Gerar sinal de início
vazio XGZP6859D::IIC_Início(vazio)
{
modo pin(IIC_SDA, SAÍDA);
escrita digital(IIC_SDA, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME); //Atrasar vários microssegundos
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SDA, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
}
//Gerar sinal de parada
vazio XGZP6859D::IIC_Stop(vazio)
{
modo pin(IIC_SDA, SAÍDA);
escrita digital(IIC_SDA, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SDA, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
}
//Aguarde o sinal ACK
//retornar 1 significa fracasso
//retornar 0 significa sucesso
byte XGZP6859D::IIC_Wait_Ack(vazio)
{
byteucErrTime=0;
modo pin(IIC_SDA, ENTRADA);
escrita digital(IIC_SDA, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
enquanto(leitura digital(IIC_SDA)== ALTO)
{
ucErrTime++;
se(ucErrTime>250)
{
IIC_Stop();
retornar 1;
}
}
escrita digital(IIC_SCL, BAIXO);
retornar 0;
}
//Gerar sinal ACK
vazio XGZP6859D::IIC_Ack(vazio)
{
escrita digital(IIC_SCL, BAIXO);
modo pin(IIC_SDA, SAÍDA);
escrita digital(IIC_SDA, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SDA, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
}
//Não gera sinal ACK
vazio XGZP6859D::IIC_NAck(vazio)
{
escrita digital(IIC_SCL, BAIXO);
modo pin(IIC_SDA, SAÍDA);
escrita digital(IIC_SDA, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
}
//Envie um byte pelo barramento IIC
//O valor de retorno significa resposta do escravo
//1 significa receber resposta
//0 significa não receber resposta
vazio XGZP6859D::IIC_Send_Byte(byte txd)
{
byte t;
modo pin(IIC_SDA, SAÍDA);
escrita digital(IIC_SCL, BAIXO);
para(t=0;t<8;t++)
{
se(txd & 0x80)
escrita digital(IIC_SDA, ALTO);
outro
escrita digital(IIC_SDA, BAIXO);
txd<<=1;
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
}
escrita digital(IIC_SCL, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SDA, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
}
//Leia um byte, envie ACK enquanto ack = 1, envie nACK enquanto ack = 0
byte XGZP6859D::IIC_Read_Byte(mudar, infelizmente)
{
trocar em,receber=0;
modo pin(IIC_SDA, ENTRADA);
para(eu=0;eu<8;eu++ )
{
escrita digital(IIC_SCL, BAIXO);
atrasoMicrossegundos(IIC_DELAY_TIME);
escrita digital(IIC_SCL, ALTO);
atrasoMicrossegundos(IIC_DELAY_TIME);
receber<<=1;
se(leitura digital(IIC_SDA)== ALTO)
receber++;
atrasoMicrossegundos(IIC_DELAY_TIME);
}
escrita digital(IIC_SDA, ALTO);
devolver receber;
}
//Escreva um byte em um endereço especificado
vazio XGZP6859D::Write_One_Byte(endereço u8 ,dados u8)
{
IIC_Início();
IIC_Send_Byte((byte)(Endereço_do_dispositivo + 0));
Serial.print(“Endereço_do_dispositivo é “);
Serial.println(Endereço_do_dispositivo + 0, HEX);
IIC_Wait_Ack();
IIC_Send_Byte(endereço);
IIC_Wait_Ack();
IIC_Send_Byte(dados);
IIC_Wait_Ack();
IIC_Stop();
}
//Ler um byte de um endereço especificado
byte XGZP6859D::Leitura_Um_Byte(endereço u8)
{
byte meus dados;
IIC_Início();
IIC_Send_Byte((byte)(Endereço_do_dispositivo + 0));
IIC_Wait_Ack();
IIC_Send_Byte(endereço);
IIC_Wait_Ack();
IIC_Início();
IIC_Send_Byte((byte)(Endereço_do_dispositivo + 1));
IIC_Wait_Ack();
meus dados = IIC_Read_Byte(0);
IIC_Stop();
retornar meus dados;
}
vazio XGZP6859D::XGZP6859D_get_cal() //A ação de medição do XGZP6859D
{
byte i = 0;
buff de byte[5]; //Variáveis de cinco bytes, usado para salvar os bytes lidos do XGZP6859D
pressão longa não assinada_ad,temperatura_anúncio; //Variáveis usadas para salvar a pressão e temperatura calibradas
Write_One_Byte(0x30, 0x0A); //Indique uma conversão combinada
enquanto ((Leitura_Um_Byte(0x30) & 0x08) == 0x80) //Julgue se a coleta de dados terminou
{
Serial.println(“XGZP6859D não está pronto”);; //Espere enquanto os dados não estão prontos
atraso(1000);
}
para(eu=0;eu<5;eu++) //Leia dados de saída ADC de pressão e temperatura
lustre[eu] =Leitura_Um_Byte(0x06 + eu);
Serial.print(“lustre[0…4] é 0x”);
Serial.print(lustre[0], HEX);
Serial.print(“, 0x”);
Serial.print(lustre[1], HEX);
Serial.print(“, 0x”);
Serial.print(lustre[2], HEX);
Serial.print(“, 0x”);
Serial.print(lustre[3], HEX);
Serial.print(“, 0x”);
Serial.println(lustre[4], HEX);
//Calcule o valor da pressão convertido pelo ADC
pressão_ad = ((não assinado longo)((não assinado longo)(lustre[0] * 65536)) + ((int não assinado)(lustre[1] * 256)) + ((byte)lustre[2]));
Serial.print(“pressão_ad é “);
Serial.println(pressão_anúncio);
se (pressão_anúncio > 8388608) //
{
pressão = (longo)(((longo)(pressão_anúncio – 16777216)) / 8192);
//Porque a extensão é de -500Pa~+500Pa, então k é 8192;k deve ser alterado de acordo com a condição atual; a unidade de pressão é Pa
}
outro
{
pressão = (longo)(pressão_anúncio / 8192);
}
//Calcule o valor da temperatura convertido pelo ADC
temperatura_ad = ((int não assinado)((int não assinado)(lustre[3]<<8)) + ((byte)lustre[4]));
se (temperatura_anúncio > 32768)
{
temperatura = (flutuador)(((longo)(temperatura_anúncio – 65536)) / 256);
//A unidade de temperatura é Centígrados
}
outro
{
temperatura = (flutuador)(temperatura_anúncio / 256);
}
}
XGZP6859D Meu_XGZP6859D; //Defina um objeto denominado My_XGZP6859D da classe XGZP6859D
anular configuração()
{
Serial.begin(9600); //A inicialização da porta serial
Meu_XGZP6859D.IIC_Init(); //Inicialize os pinos do barramento IIC de My_XGZP6859D
}
loop vazio()
{
Meu_XGZP6859D.XGZP6859D_get_cal(); //Chame a função XGZP6859D_get_cal() do objeto My_XGZP6859D para calcular a pressão e temperatura
Serial.print(Minha_XGZP6859D.pressão);
Serial.println(” Pai”);
Serial.print(Minha_XGZP6859D.temperatura);
Serial.println(” Centígrado”);
Serial.println(“”);
atraso(1000);
}