сравнить полученный символ от подчиненного устройства записи к главному читателю с помощью I2C
Я пытаюсь отправить данные от подчиненного устройства (записывающего устройства) к ведущему (считывающему устройству), а затем сравнить их с объявленным «char p[]», чтобы включить свет, но почему-то не могу заставить это работать.
////главный читатель
#include <Wire.h>
int LED = 13;
char p[] = "YES...";
void setup() {
pinMode(LED, OUTPUT);
Wire.begin(); // подключаемся к шине i2c (адрес для ведущего необязателен)
Serial.begin(9600); // запускаем последовательный порт для вывода
}
void loop() {
Wire.requestFrom(8, 6); // запрос 6 байт от ведомого устройства №8
while (Wire.available()) { // подчиненное устройство может отправить меньше, чем запрошено
char c= Wire.read(); // получаем байт как символ
Serial.print(c); // печатаем символ
if(c == p){
digitalWrite(LED, HIGH); // включаем светодиод (HIGH - уровень напряжения)
}else{
digitalWrite(LED, LOW); // включаем светодиод (HIGH - уровень напряжения)
}
}
delay(1500);
Раб
////////////// Подчиненный ///////////////////////
#include <Wire.h>
const int pingPin = 8; // Триггерный контакт ультразвукового датчика
const int echoPin = 9; // Эхо-контакт ультразвукового датчика
void setup() {
Serial.begin(9600); // Запуск последовательного терминала
Wire.begin(8); // подключаемся к шине i2c по адресу №8
}
void loop() {
long duration, inches, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1500);
if( inches <= 4){
Wire.onRequest(requestEvent); // регистрируем событие
Serial.print("Obstacle detected");
Serial.println();
}
else
{
Wire.onRequest(requestEvent1); // регистрируем событие
Serial.print("Nothing Detected");
Serial.println();
}
}
// функция, которая выполняется всякий раз, когда мастер запрашивает данные
// эта функция регистрируется как событие, см. setup()
void requestEvent() {
Wire.write("YES..."); // отвечаем сообщением размером 6 байт
// как и ожидал мастер
}
void requestEvent1() {
Wire.write("NO...."); // отвечаем сообщением размером 6 байт
// как и ожидал мастер
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
@Ror Schach, 👍0
1 ответ
▲ 1
- Улучшите отступы.
- Если вы хотите сравнить две строки, используйте для этого функцию
strcmp
. - В вашей основной части в функции
voidloop()
остались скобки, исправьте их. - В I2C вы получаете один
байт
за раз. Вы должны получать данные до последнего полученногобайта
. - В вашем сообщении должна быть какая-то идентификация, то есть вы отправляете его от подчиненного устройства к ведущему, указывая, что это последний символ. Это поможет вам выйти из цикла приема данных на стороне Master.
,
@Vaibhav
Смотрите также:
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом