Проблема с инициализацией состояния датчиков холла

Тема в разделе "Arduino & Shields", создана пользователем init.d, 11 апр 2019.

  1. init.d

    init.d Нуб

    Комьюнити, подскажите начинающему ардуинщику :)

    Дано: модуль датчика холла 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 }
     
  2. KindMan

    KindMan Гуру

    Это зачем?
    И как работает это
     
  3. init.d

    init.d Нуб

    Для определения первоначального состояния датчиков. Предполагаю хрень, пробовал считать состояние:

    Код (C++):
    kst = ex1.digitalRead(i);
    прошу прощения "уплыла" часть :
    Код (C++):
    if (kst[i] == ACT) { // если хотя бы 1 ключ активен - передача события
     
  4. fogary

    fogary Гик

    Интересно Вы присваиваете значения массу. Индекс не забыли: kst[ i ]?
     
  5. init.d

    init.d Нуб

    Охохо. При копировании кода в редактор потерялся индекс. В исходнике есть. Поправил всюду:

    Код (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 }
     
  6. b707

    b707 Гуру

    да вы откуда этот код взяли? - скопировали без понятия?
    Что, например, печает строка 48. по вашему?
     
    Последнее редактирование: 11 апр 2019
  7. parovoZZ

    parovoZZ Гуру

    А зачем цифровому датчику расширитель, да ещё и I2C?
     
  8. init.d

    init.d Нуб

    Опрашивается много датчиков, которые подключаются через расширители портов. В тесте оставил 1 расширитель и 3 датчика
     
  9. init.d

    init.d Нуб

    Чтобы не засорять эфир, выкинул значительную кода связанную с подъемом сети, сериализацией данных в 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 }
     
  10. init.d

    init.d Нуб

    С благодарностью и признательностью кину донат тому, кто решит траблу и поправит код
     
  11. b707

    b707 Гуру

    по-моему, тут уже просто нечего "поправлять", после того как вы всю обработку датчиков выкинули...
     
  12. parovoZZ

    parovoZZ Гуру

    Как-то странно слышать, что в коде подъем сети, сериализация, ещё что-то там и затык в таком простом месте, как опрос гетерогенного датчика...
     
  13. init.d

    init.d Нуб

    отправил на ded@cur-ex.ru
     
  14. init.d

    init.d Нуб

    ;)
     
  15. init.d

    init.d Нуб

    Решено:

    24 for(inti = 0; i < 3; i++) ex1.pinMode(i, INPUT_PULLUP);