main
This commit is contained in:
116
src/i2c_communication.cpp
Normal file
116
src/i2c_communication.cpp
Normal file
@ -0,0 +1,116 @@
|
||||
#include "i2c_communication.h"
|
||||
#include <TinyGPS++.h>
|
||||
#include "main.h"
|
||||
|
||||
extern uint16_t receive_cnt;
|
||||
|
||||
extern TinyGPSPlus gps;
|
||||
extern uint16_t distance;
|
||||
// 缓冲区用于发送结构体数据
|
||||
uint8_t i2c_tx_buffer[sizeof(hh3_slave_data)];
|
||||
|
||||
// 初始化 I2C 从机
|
||||
void init_i2c_slave() {
|
||||
Wire.setSDA(I2C_SDA_PIN);
|
||||
Wire.setSCL(I2C_SCL_PIN);
|
||||
//Wire.Pins(16,17);
|
||||
Wire.begin(SLAVE_ADDRESS); // 设置从机地址为 0x55
|
||||
Wire.onRequest(onRequestEvent); // 注册请求回调 ***改用主机命令0x01
|
||||
Wire.onReceive(onReceiveEvent); // 注册接收回调
|
||||
}
|
||||
|
||||
// 当主机请求数据时调用
|
||||
void onRequestEvent() {
|
||||
update_sensor_data(); // 确保数据是最新的
|
||||
memcpy(i2c_tx_buffer, &sensor_data, sizeof(sensor_data));
|
||||
Wire.write(i2c_tx_buffer, sizeof(sensor_data));
|
||||
}
|
||||
|
||||
void power_init(){
|
||||
pinMode(RANGING_POWER_PIN, OUTPUT);
|
||||
pinMode(GPS_POWER_PIN, OUTPUT);
|
||||
}
|
||||
|
||||
// 当主机发送命令时调用
|
||||
void onReceiveEvent(int bytes) {
|
||||
while (Wire.available()) {
|
||||
uint8_t cmd = Wire.read();
|
||||
switch (cmd) {
|
||||
case CMD_GPS_POWER_OFF:
|
||||
turn_off_gps();
|
||||
break;
|
||||
case CMD_RANGING_POWER_OFF:
|
||||
turn_off_ranging();
|
||||
break;
|
||||
case CMD_GPS_POWER_ON:
|
||||
turn_on_gps();
|
||||
break;
|
||||
case CMD_RANGING_POWER_ON:
|
||||
turn_on_ranging();
|
||||
break;
|
||||
case CMD_MASTER_GET_SLAVE_DATA:
|
||||
onRequestEvent(); // 主动调用一次数据发送
|
||||
break;
|
||||
default:
|
||||
Serial.printf("Unknown command received: 0x%02X\n", cmd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新传感器状态和数据
|
||||
static uint8_t last_receive_cnt = 0;
|
||||
void update_sensor_data() {
|
||||
//gps
|
||||
if (millis() > 5000 && gps.charsProcessed() < 10 && digitalRead(GPS_POWER_PIN) == HIGH) {
|
||||
sensor_data.gps_sta = 0x00; // 无设备
|
||||
sensor_data.gps_lat = 0.0f;
|
||||
sensor_data.gps_lon = 0.0f;
|
||||
} else if (digitalRead(GPS_POWER_PIN) == LOW){
|
||||
sensor_data.gps_sta = 0x01; // 关机
|
||||
sensor_data.gps_lat = 0.0f;
|
||||
sensor_data.gps_lon = 0.0f;
|
||||
}else if (!gps.location.isUpdated()) {
|
||||
sensor_data.gps_sta = 0x02; // 未搜到信号
|
||||
sensor_data.gps_lat = 0.0f;
|
||||
sensor_data.gps_lon = 0.0f;
|
||||
} else {
|
||||
sensor_data.gps_sta = 0x03; // 正常工作
|
||||
sensor_data.gps_lat = gps.location.lat();
|
||||
sensor_data.gps_lon = gps.location.lng();
|
||||
}
|
||||
|
||||
//测距
|
||||
if (receive_cnt == last_receive_cnt && digitalRead(RANGING_POWER_PIN) == HIGH) {
|
||||
sensor_data.height_sta = 0x00; // 无设备
|
||||
sensor_data.height = 0.0f;
|
||||
}else if (digitalRead(RANGING_POWER_PIN) == LOW){
|
||||
sensor_data.height_sta = 0x01; // 关机
|
||||
sensor_data.height = 0.0f;
|
||||
}else {
|
||||
last_receive_cnt = receive_cnt;
|
||||
sensor_data.height_sta = 0x02; // 有效高度
|
||||
sensor_data.height = (float)distance / 1000.0f; // mm -> m
|
||||
}
|
||||
}
|
||||
|
||||
// 电源控制
|
||||
void turn_off_gps() {
|
||||
digitalWrite(GPS_POWER_PIN, LOW);
|
||||
//Serial.println("Turning OFF GPS Power");
|
||||
}
|
||||
|
||||
void turn_on_gps() {
|
||||
digitalWrite(GPS_POWER_PIN, HIGH);
|
||||
//Serial.println("Turning ON GPS Power");
|
||||
}
|
||||
|
||||
void turn_off_ranging() {
|
||||
digitalWrite(RANGING_POWER_PIN, LOW);
|
||||
//Serial.println("Turning OFF Ranging Module");
|
||||
}
|
||||
|
||||
void turn_on_ranging() {
|
||||
digitalWrite(RANGING_POWER_PIN, HIGH);
|
||||
//Serial.println("Turning ON Ranging Module");
|
||||
}
|
||||
Reference in New Issue
Block a user