예제 프로그램 Arduino 코드

#포함 <stdio.h>
#포함 <문자열.h>
#포함 <inttypes.h>
#포함 “Arduino.h”
#포함 “XGZP6859D.h”
//IIC BUS 초기화
무효 XGZP6859D::IIC_초기화(무효의)
{
핀모드(IIC_SCL, 산출); //핀을 출력 모드로 설정
핀모드(IIC_SDA, 산출);
디지털 쓰기(IIC_SCL, 높은); //Putout 높은 수준
디지털 쓰기(IIC_SDA, 높은);
}
//시작 신호 생성
무효 XGZP6859D::IIC_시작(무효의)
{
핀모드(IIC_SDA, 산출);
디지털 쓰기(IIC_SDA, 높은);
지연마이크로초(IIC_DELAY_TIME); //몇 마이크로초 지연
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SDA, 낮은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 낮은);
지연마이크로초(IIC_DELAY_TIME);
}
//정지 신호 생성
무효 XGZP6859D::IIC_정지(무효의)
{
핀모드(IIC_SDA, 산출);
디지털 쓰기(IIC_SDA, 낮은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SDA, 높은);
지연마이크로초(IIC_DELAY_TIME);
}
//ACK 신호를 기다립니다
//반품 1 실패를 의미
//반품 0 성공을 의미한다
바이트 XGZP6859D::IIC_Wait_Ack(무효의)
{
바이트 ucErrTime=0;
핀모드(IIC_SDA, 입력);
디지털 쓰기(IIC_SDA, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
동안(디지털읽기(IIC_SDA)==높음)
{
ucErrTime++;
만약(ucErrTime>250)
{
IIC_정지();
반품 1;
}
}
디지털 쓰기(IIC_SCL, 낮은);
반품 0;
}
//ACK 신호 생성
무효 XGZP6859D::IIC_Ack(무효의)
{
디지털 쓰기(IIC_SCL, 낮은);
핀모드(IIC_SDA, 산출);
디지털 쓰기(IIC_SDA, 낮은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 낮은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SDA, 높은);
지연마이크로초(IIC_DELAY_TIME);
}
//ACK 신호를 생성하지 않음
무효 XGZP6859D::IIC_Nack(무효의)
{
디지털 쓰기(IIC_SCL, 낮은);
핀모드(IIC_SDA, 산출);
디지털 쓰기(IIC_SDA, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 낮은);
지연마이크로초(IIC_DELAY_TIME);
}
//IIC 버스를 통해 1바이트 보내기
//반환 값은 슬레이브의 응답을 의미합니다.
//1 답을 얻는다는 뜻
//0 답변을 받지 못했다는 뜻
무효 XGZP6859D::IIC_Send_Byte(바이트 TXD)
{
바이트 t;
핀모드(IIC_SDA, 산출);
디지털 쓰기(IIC_SCL, 낮은);
~을 위한(티=0;티<8;티++)
{
만약(TXD & 0x80)
디지털 쓰기(IIC_SDA, 높은);
또 다른
디지털 쓰기(IIC_SDA, 낮은);
TXD<<=1;
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 낮은);
지연마이크로초(IIC_DELAY_TIME);
}
디지털 쓰기(IIC_SCL, 낮은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SDA, 높은);
지연마이크로초(IIC_DELAY_TIME);
}
//1바이트 읽기, ack 동안 ACK 보내기 = 1, ack 동안 nACK 보내기 = 0
바이트 XGZP6859D::IIC_Read_Byte(아아, 변화해라)
{
교환하다,수신=0;
핀모드(IIC_SDA, 입력);
~을 위한(나는=0;나<8;나++ )
{
디지털 쓰기(IIC_SCL, 낮은);
지연마이크로초(IIC_DELAY_TIME);
디지털 쓰기(IIC_SCL, 높은);
지연마이크로초(IIC_DELAY_TIME);
받다<<=1;
만약(디지털읽기(IIC_SDA)==높음)
수신++;
지연마이크로초(IIC_DELAY_TIME);
}
디지털 쓰기(IIC_SDA, 높은);
반환 수신;
}
//지정된 주소에 1바이트 쓰기
무효 XGZP6859D::Write_One_Byte(u8 주소 ,u8 데이터)
{
IIC_시작();
IIC_Send_Byte((바이트)(장치_주소 + 0));
직렬.인쇄(“Device_Address는 다음과 같습니다. “);
Serial.println(장치_주소 + 0, 마녀);
IIC_Wait_Ack();
IIC_Send_Byte(주소);
IIC_Wait_Ack();
IIC_Send_Byte(데이터);
IIC_Wait_Ack();
IIC_정지();
}
//지정된 주소에서 1바이트 읽기
바이트 XGZP6859D::읽기_원_바이트(u8 주소)
{
바이트 마이데이터;
IIC_시작();
IIC_Send_Byte((바이트)(장치_주소 + 0));
IIC_Wait_Ack();
IIC_Send_Byte(주소);
IIC_Wait_Ack();
IIC_시작();
IIC_Send_Byte((바이트)(장치_주소 + 1));
IIC_Wait_Ack();
mydata = IIC_Read_Byte(0);
IIC_정지();
내 데이터 반환;
}
무효 XGZP6859D::XGZP6859D_get_cal() //XGZP6859D의 측정 동작
{
바이트 i=0;
바이트 버프[5]; //5바이트 변수, XGZP6859D에서 읽은 바이트를 저장하는 데 사용됩니다.
서명되지 않은 긴 압력_광고,온도_광고; //교정된 압력과 온도를 저장하는 데 사용되는 변수
Write_One_Byte(0x30, 0x0A); //결합된 전환을 나타냅니다.
동안 ((읽기_원_바이트(0x30) & 0x08) == 0x80) //데이터 수집 완료 여부 판단
{
Serial.println(“XGZP6859D가 준비되지 않았습니다.”);; //데이터가 준비되지 않은 동안 기다려 주세요.
지연(1000);
}
~을 위한(나는=0;나<5;나++) //압력 및 온도의 ADC 출력 데이터 읽기
버프[나] = Read_One_Byte(0x06 + 나);
직렬.인쇄(“버프[0…4] 0x이다”);
직렬.인쇄(버프[0], 마녀);
직렬.인쇄(“, 0엑스”);
직렬.인쇄(버프[1], 마녀);
직렬.인쇄(“, 0엑스”);
직렬.인쇄(버프[2], 마녀);
직렬.인쇄(“, 0엑스”);
직렬.인쇄(버프[3], 마녀);
직렬.인쇄(“, 0엑스”);
Serial.println(버프[4], 마녀);
//ADC에서 변환된 압력값을 계산합니다.
압력_광고 = ((부호 없는 긴)((부호 없는 긴)(버프[0] * 65536)) + ((부호 없는 정수)(버프[1] * 256)) + ((바이트)버프[2]));
직렬.인쇄(“Pressure_ad는 “);
Serial.println(압력_광고);
만약 (압력_광고 > 8388608) //
{
압력 = (긴)(((긴)(압력_광고 – 16777216)) / 8192);
//스팬이 -500Pa~+500Pa이기 때문에, 그래서 k는 8192;k는 실제 조건에 따라 변경되어야 합니다.; 압력의 단위는 Pa입니다
}
또 다른
{
압력 = (긴)(압력_광고 / 8192);
}
//ADC에서 변환된 온도 값을 계산합니다.
온도_광고 = ((부호 없는 정수)((부호 없는 정수)(버프[3]<<8)) + ((바이트)버프[4]));
만약 (온도_광고 > 32768)
{
온도 = (뜨다)(((긴)(온도_광고 – 65536)) / 256);
//온도의 단위는 섭씨입니다
}
또 다른
{
온도 = (뜨다)(온도_광고 / 256);
}
}
XGZP6859D My_XGZP6859D; //XGZP6859D 클래스의 My_XGZP6859D라는 개체를 정의합니다.
무효 설정()
{
직렬 시작(9600); //직렬 포트 초기화
My_XGZP6859D.IIC_Init(); //My_XGZP6859D의 IIC 버스 핀을 초기화합니다.
}
무효 루프()
{
My_XGZP6859D.XGZP6859D_get_cal(); //XGZP6859D_get_cal 함수 호출() 압력과 온도를 계산하기 위한 객체 My_XGZP6859D
직렬.인쇄(My_XGZP6859D.압력);
Serial.println(” 아빠”);
직렬.인쇄(My_XGZP6859D.온도);
Serial.println(” 섭씨”);
Serial.println(“”);
지연(1000);
}