Комьюнити, подскажите начинающему ардуинщику Дано: модуль датчика холла A3144 подключенный через I2C расширитель PCF8575 к UNO R3 Необходимо контролировать наличие магнита и передавать информацию на сервер по mqtt-протоколу При инициализации устройства магниты УЖЕ поднесены к датчику Холла. Проблема: при старте устройства с поднесенными магнитом, скетчу "сносит" башню и Ардуино не понимает состояние датчика и не может отслеживать их переключение. Если изначально при старте магниты не поднесены, всё прекрасно работает. Код (часть связанную с сетью и передачей по mqtt-протоколу на брокер исключил): Код (C++): 01 #include <SPI.h> 02 #include <Wire.h> 03 #include <PCF8575.h> 04 05 #define PUB_DELAY 3000 // Частота передачи данных ото всех ключей 06 #define CHK_DELAY 500 // Частота проверки ключей 07 #define KEYS 3 // Кол-во ключей 08 #define ACT LOW // Состояние входа при активации 09 #define DIS !ACT 10 11 PCF8575 ex1; 12 13 long previousMillis, checkMillis; 14 boolean kst[KEYS] = {0}; 15 16 void setup () { 17 // setup serial communication 18 Serial.begin(9600); 19 20 21 // Адрес i2c расширителя pcf8575 22 ex1.begin(0x20); 23 24 for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT); 25 for (int i = 0; i < KEYS; i++) kst = DIS; // состояние датчика задается константой 26 27 delay(1500); // Allow hardware to stabilize 28 29 previousMillis = millis(); 30 checkMillis = millis(); 31 32 } 33 34 void loop () { 35 if (millis() - checkMillis > CHK_DELAY) { // проверка ключей 36 for (int i = 0; i < 3; i++) kst = ex1.digitalRead(i); 37 for (int i = 0; i < 3; i++){ 38 if (kst == ACT) { // если хотя бы 1 ключ активен 39 String state = "Active"; 40 Serial.println (state); 41 } 42 } 43 checkMillis = millis(); 44 } 45 if (millis() - previousMillis > PUB_DELAY) { // передача данных о ключах 46 String request; 47 for (int i = 0; i < 3; i++) { 48 Serial.println (request); 49 } 50 previousMillis = millis(); 51 } 52 // mqttClient.loop(); 53 }
Для определения первоначального состояния датчиков. Предполагаю хрень, пробовал считать состояние: Код (C++): kst = ex1.digitalRead(i); прошу прощения "уплыла" часть : Код (C++): if (kst[i] == ACT) { // если хотя бы 1 ключ активен - передача события
Охохо. При копировании кода в редактор потерялся индекс. В исходнике есть. Поправил всюду: Код (C++): 01 #include <SPI.h> 02 #include <Wire.h> 03 #include <PCF8575.h> 04 05 #define PUB_DELAY 3000 // Частота передачи данных ото всех ключей 06 #define CHK_DELAY 500 // Частота проверки ключей 07 #define KEYS 3 // Кол-во ключей 08 #define ACT LOW // Состояние входа при активации 09 #define DIS !ACT 10 11 PCF8575 ex1; 12 13 long previousMillis, checkMillis; 14 boolean kst[KEYS] = {0}; 15 16 void setup () { 17 // setup serial communication 18 Serial.begin(9600); 19 20 21 // Адрес i2c расширителя pcf8575 22 ex1.begin(0x20); 23 24 for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT); 25 for (int i = 0; i < KEYS; i++) kst[i] = DIS; // состояние датчика задается константой 26 27 delay(1500); // Allow hardware to stabilize 28 29 previousMillis = millis(); 30 checkMillis = millis(); 31 32 } 33 34 void loop () { 35 if (millis() - checkMillis > CHK_DELAY) { // проверка ключей 36 for (int i = 0; i < 3; i++) kst[i] = ex1.digitalRead(i); 37 for (int i = 0; i < 3; i++){ 38 if (kst[i] == ACT) { // если хотя бы 1 ключ активен 39 String state = "Active"; 40 Serial.println (state); 41 } 42 } 43 checkMillis = millis(); 44 } 45 if (millis() - previousMillis > PUB_DELAY) { // передача данных о ключах 46 String request; 47 for (int i = 0; i < 3; i++) { 48 Serial.println (request); 49 } 50 previousMillis = millis(); 51 } 52 // mqttClient.loop(); 53 }
Опрашивается много датчиков, которые подключаются через расширители портов. В тесте оставил 1 расширитель и 3 датчика
Чтобы не засорять эфир, выкинул значительную кода связанную с подъемом сети, сериализацией данных в json-формат и передачей по mqtt протоколу на сервер. Что бы вас не смущать, выкину эту часть, проблема на уровне setup-а: Код (C++): 01 #include <SPI.h> 02 #include <Wire.h> 03 #include <PCF8575.h> 04 05 #define PUB_DELAY 3000 // Частота передачи данных ото всех ключей 06 #define CHK_DELAY 500 // Частота проверки ключей 07 #define KEYS 3 // Кол-во ключей 08 #define ACT LOW // Состояние входа при активации 09 #define DIS !ACT 10 11 PCF8575 ex1; 12 13 long previousMillis, checkMillis; 14 boolean kst[KEYS] = {0}; 15 16 void setup () { 17 // setup serial communication 18 Serial.begin(9600); 19 20 21 // Адрес i2c расширителя pcf8575 22 ex1.begin(0x20); 23 24 for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT); 25 for (int i = 0; i < KEYS; i++) kst[i] = DIS; // состояние датчика задается константой 26 27 delay(1500); // Allow hardware to stabilize 28 29 previousMillis = millis(); 30 checkMillis = millis(); 31 32 } 33 34 void loop () { 35 if (millis() - checkMillis > CHK_DELAY) { // проверка ключей 36 for (int i = 0; i < 3; i++) kst[i] = ex1.digitalRead(i); 37 for (int i = 0; i < 3; i++){ 38 if (kst[i] == ACT) { // если хотя бы 1 ключ активен 39 //передача информации на сервер 41 } 42 } 43 checkMillis = millis(); 44 } 45 if (millis() - previousMillis > PUB_DELAY) { // передача данных о ключах 46 String request; 47 for (int i = 0; i < 3; i++) { 4 //передача информации на сервер 49 } 50 previousMillis = millis(); 51 } 52 // mqttClient.loop(); 53 }
Как-то странно слышать, что в коде подъем сети, сериализация, ещё что-то там и затык в таком простом месте, как опрос гетерогенного датчика...