#include <Wire.h> #include "gw_grayscale_sensor.h" // SDA : A4 // SCL : A5 #define GW_GRAY_ADDR GW_GRAY_ADDR_DEF // 使用默认地址 void setup() { // 初始化I2C Wire.begin(); // 初始化串口 Serial.begin(115200); } void loop() { uint8_t recv_value = 0; uint8_t ping_rep = 0; uint8_t sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7, sensor8; // 循环 直到PING成功 while (ping_rep != GW_GRAY_PING_OK) { Wire.beginTransmission(GW_GRAY_ADDR); Wire.write(GW_GRAY_PING); Wire.endTransmission(); Wire.requestFrom(GW_GRAY_ADDR, 1); ping_rep = Wire.read(); delay(10); } /* ping 成功 */ /* 数字数据模式, 设置完毕之后, 每次读取一个8bit的数据, 每个位表示1-8探头的状态 */ Wire.beginTransmission(GW_GRAY_ADDR); Wire.write(GW_GRAY_DIGITAL_MODE); Wire.endTransmission(); // 打印8个探头的状态 while (1) { Wire.requestFrom(GW_GRAY_ADDR, 1); recv_value = Wire.read(); Serial.print("传感器数字数据:"); for (int i = 1; i <= 8; ++i) { //探头从1开始,不是0 Serial.print(" "); Serial.print(GET_NTH_BIT(recv_value, i)); } Serial.print("\n"); /* 如何使用得到的8bit数据: */ /* ----------------------直接查看单个探头数据---------------------- */ if (GET_NTH_BIT(recv_value, 1) == 0) { // 第1个探头数据为0 } else { // 第1个探头数据为1 } if (GET_NTH_BIT(recv_value, 2) == 0) { // 第2个探头数据为0 } else { // 第2个探头数据为1 } /* ... */ if (GET_NTH_BIT(recv_value, 8) == 0) { // 第8个探头数据为0 } else { // 第8个探头数据为1 } /* ----------------------对比整排探头数据------------------ */ if (recv_value == 0b11100111) { // 中间两个45探头数据为0 其他为1 } /* ----------------------把8个探头数据单独放进8个变量里---------------------- */ SEP_ALL_BIT8(recv_value, sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7, sensor8); /* 查看探头1数据 */ if (sensor1 == 0) { // 第1个探头数据为0 } else { // 第1个探头数据为1 } delay(100); } }