Определение состояния датчиков холла при инициализации работы устройства

init.d
Offline
Зарегистрирован: 07.03.2019

Доброго дня комьюнити!

Дано: модуль датчика холла A3144 подключенный через I2C расширитель PCF8575 к UNO R3

Необзодимо контролировать наличие магнита и передавать информацию на сервер.

При инициализации устройства магниты поднесены к датчику Холла. 

Проблема: при старте устройства с поднесенными магнитом, скетчу "сносит" башню, ардуино не понимает состяние датчиков и не может отследивать их переключение.

Если изначально при старте магниты не поднесены, всё прекрасно работает.

HELP!

Код (часть связанную с сетью и передачей по mqtt-протоколу на брокер исключил):



#include <SPI.h>
#include <Wire.h>
#include <PCF8575.h>

#define PUB_DELAY 3000 // Частота передачи данных ото всех ключей
#define CHK_DELAY 500 // Частота проверки ключей
#define KEYS 3 // Кол-во ключей
#define ACT LOW // Состояние входа при активации
#define DIS !ACT

PCF8575 ex1;
 
long previousMillis, checkMillis;
boolean kst[KEYS] = {0};
 
void setup () {
  // setup serial communication
  Serial.begin(9600);
 
 
  // Адрес i2c расширителя pcf8575
  ex1.begin(0x20);
  
  for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT);
  for (int i = 0; i < KEYS; i++) kst[i] = DIS; // состояние датчика задается константой
 
  delay(1500); // Allow hardware to stabilize
 
  previousMillis = millis();
  checkMillis = millis();
  
}
 
void loop () {
  if (millis() - checkMillis > CHK_DELAY) { // проверка ключей
    for (int i = 0; i < 3; i++) kst[i] = ex1.digitalRead(i);
    for (int i = 0; i < 3; i++){
      if (kst[i] == ACT) { // если хотя бы 1 ключ активен 
        String state = "Active";
        Serial.println (state);
      }
    }
    checkMillis = millis();
  }
  if (millis() - previousMillis > PUB_DELAY) { // передача данных о ключах
    String request;
    for (int i = 0; i < 3; i++) {
       Serial.println (request);
    } 
    previousMillis = millis();
  }
    // mqttClient.loop();
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

спасибо за информацию. ТТеперь мы знаем, чтобы этот скетч правильно работал, не нужно подносить магниты при старте. 

init.d
Offline
Зарегистрирован: 07.03.2019

Выбраковка финно-угром продолжается

b707
Offline
Зарегистрирован: 26.05.2017

init.d - можете обьяснить, что вы печаете в строке 48?

init.d
Offline
Зарегистрирован: 07.03.2019

b707 пишет:

init.d - можете обьяснить, что вы печаете в строке 48?

Убрал, чтобы не "засорять" эфир ненужным:

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 }
 

 

init.d
Offline
Зарегистрирован: 07.03.2019

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

sadman41
Offline
Зарегистрирован: 19.10.2016
for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT);
delay(1500); // Allow hardware to stabilize
for (int i = 0; i < 3; i++) kst[i] =  ex1.digitalRead(i);

 

init.d
Offline
Зарегистрирован: 07.03.2019

sadman41 пишет:

for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT);
delay(1500); // Allow hardware to stabilize
for (int i = 0; i < 3; i++) kst[i] =  ex1.digitalRead(i);

 

Да. делал так только в таком порядке:

 

24 for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT);
25 for (int i = 0; i < 3; i++) kst[i] =  ex1.digitalRead(i);
26 delay(1500); // Allow hardware to stabilize

Не помогало

AlexanderNO
Offline
Зарегистрирован: 08.11.2018
24 for (int i = 0; i < 3; i++) ex1.pinMode(i, INPUT_PULLUP);

 

b707
Offline
Зарегистрирован: 26.05.2017

init.d пишет:

Убрал, чтобы не "засорять" эфир ненужным:

так у вас реально в этом коде не осталось ни малейшего смысла.

Опишите, пожалуйста, каким образом коду "сносит башню" и , самое интересное! - как вы это видите, если в коде нет вывода принятых с датчиков значений?

Не воспринимайте мои слова как глум, отнеситесь серьезно. Я склонен думать. что в погоне за выкидыванием лишнего вы удалили из кода и проблемный участок и исправлять в этих остатках попросту нечего.

init.d
Offline
Зарегистрирован: 07.03.2019

b707 пишет:

init.d пишет:

Убрал, чтобы не "засорять" эфир ненужным:

так у вас реально в этом коде не осталось ни малейшего смысла.

Опишите, пожалуйста, каким образом коду "сносит башню" и , самое интересное! - как вы это видите, если в коде нет вывода принятых с датчиков значений?

Не воспринимайте мои слова как глум, отнеситесь серьезно. Я склонен думать. что в погоне за выкидыванием лишнего вы удалили из кода и проблемный участок и исправлять в этих остатках попросту нечего.

Отправил на почту ded@cur-ex.ru

init.d
Offline
Зарегистрирован: 07.03.2019

AlexanderNO пишет:

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

 

Гуру AlexanderNO, Ваш лаконичный комментарий решил мою проблему. Спасибо за эффективный краудсорсинг!

Напишите, как можно кинуть вам небольшое вознаграждение за решение задачи.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Кидай мне, а то пить ненашта

init.d
Offline
Зарегистрирован: 07.03.2019

DetSimen пишет:

Кидай мне, а то пить ненашта

Судя по комментариям, вы философ и свободный художник) Не поленился посетить ваш профиль на гитхабе и читануть про таймеры. Если когда-нибудь буду в N-k (новороссийске? новосибирске?), обязательно налью... 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

init.d пишет:

DetSimen пишет:

Кидай мне, а то пить ненашта

Судя по комментариям, вы философ и свободный художник) Не поленился посетить ваш профиль на гитхабе и читануть про таймеры. Если когда-нибудь буду в N-k (новороссийске? новосибирске?), обязательно налью... 

У деда зимой минус 40 было....
Кипяток на лету замерзал!
Делайте выводы.....

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Наливка-то не замёрзнет, надеюсь...