Hallsensor

Тема в разделе "ESP8266, ESP32", создана пользователем RaFish, 25 мар 2020.

  1. RaFish

    RaFish Нуб

    Код (Text):
    int hallSensorPin = 2;                // Задаем переменную hallSensorPin со значением 2
    int ledPin = 13;                      // Задаем переменную ledPin со значением 13
    int state = 0;                        // Задаем переменную state со значением 0
    int flag = 0;                         // Задаем переменную flag со значением 0

    void setup()
      {
      Serial.begin(115200);
      pinMode(hallSensorPin, INPUT);      // Назначаем значение переменной hallSensorPin == 2 как номер пина, т.е. PIN №2
      pinMode(ledPin, OUTPUT);            // Назначаем значение переменной ledPin == 13 как номер пина, т.е. PIN №13
      }

    void loop()

    {
    state = digitalRead(hallSensorPin);     // Считываем состояние с пина hallSensorPin и записываем в переменную state

    if(state==LOW&&flag==0)                 //если дверь открыта и  перемення flag равна 0 , то ...
         {
            digitalWrite(ledPin, HIGH);     // светодиод включаем
            flag=1;                         // переменной flag назначаем 1, чтобы отправить сообщение об открытии только один раз
            // sendMesage()                 //+ отправляем сообщение "дверь открылась"
            Serial.print("Дверь открылась: ");
            Serial.println(!state);
                                            // при этом будет state=0, flag=1
         }

    if(state==HIGH&&flag==1)                //если дверь закрыта и переменная flag равна 1 ,то ...
         {
            digitalWrite(ledPin, LOW);      // светодиод отключаем
             flag=0;                        // переменной flag назначаем 0, чтобы отправить сообщение об закрытии только один раз
            // sendMesage()                 //+ отправляем сообщение "дверь закрылась"
            Serial.print("Дверь закрылась: ");
            Serial.println(!state);                          
                                            // при этом будет state=1, flag=0
         }

                                           // если дверь все еще открыта, то мигаем светодиодом
    if(state==LOW&&flag==1)                //если дверь все еще открыта и переменная flag равна 1 ,то ...
         {
           delay(500);
           digitalWrite(ledPin, LOW);     // светодиод отключаем
           delay(500);
           digitalWrite(ledPin, HIGH);     // светодиод включаем
           Serial.print("Дверь все еще открыта");
           // sendMesage()                 //+ отправляем сообщение "дверь еще открыта"
         }

       
         delay(500);                 // Ждём 500 милисекунд
    }
     
    Последнее редактирование модератором: 26 мар 2020
  2. Daniil

    Daniil Гуру

    Вставьте код через теги, пожалуйста
     
    b707 нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Что ты такое?
     
  4. b707

    b707 Гуру

    и неплохо бы вопрос сформулировать
     
  5. Daniil

    Daniil Гуру

    я думал это надо в "глядите что я сделал"
     
  6. RaFish

    RaFish Нуб

    Добрый вечер!
    Схему подправил, комментарии добавляю.
    При открытии двери у меня включается свет над ней, собрано на транзисторах.
    Захотел перейти на ESP чтобы еще отправлялось сообщение на телефон по MQTT (типа сигнализация).
    Написал код проверить датчик Холла, и пока без Wifi и Mqtt.

    Код (C++):
    int hallSensorPin = 14; // Задаем переменную hallSensorPin со значением 14
    int ledPin = 15; // Задаем переменную ledPin со значением 15
    int state = 0; // Задаем переменную state со значением 0
    int flag = 0; // Задаем переменную flag со значением 0

    void setup()
    {
    Serial.begin(115200);
    pinMode(hallSensorPin, INPUT); // Назначаем значение переменной hallSensorPin =14 как номер пина, т.е. PIN №2
    pinMode(ledPin, OUTPUT); // Назначаем значение переменной ledPin =13 как номер пина, т.е. PIN №13
    }

    void loop()

    {
    state = digitalRead(hallSensorPin); // Считываем состояние с пина hallSensorPin и записываем в переменную state

    if(state==HIGH&&flag==0) //если дверь открыта и перемення flag равна 0 , то ...
    {
    digitalWrite(ledPin, HIGH); // светодиод включаем
    flag=1; // переменной flag назначаем 1, чтобы отправить сообщение об открытии только один раз
    // вставить КОД об отправки сообщения по MQTT -- "дверь открылась"
    Serial.print("Дверь открылась: ");
    Serial.println(!state);
    // при этом будет state=0, flag=1
    }

    if(state==LOW&&flag==1) //если дверь закрыта и переменная flag равна 1 ,то ...
    {
    digitalWrite(ledPin, LOW); // светодиод отключаем
    flag=0; // переменной flag назначаем 0, чтобы отправить сообщение об закрытии только один раз
    // вставить КОД об отправки сообщения по MQTT -- "дверь закрылась"
    Serial.print("Дверь закрылась: ");
    Serial.println(!state);
    // при этом будет state=1, flag=0
    }

    // если дверь все еще открыта, то мигаем светодиодом
    if(state==HIGH&&flag==1) //если дверь все еще открыта и переменная flag равна 1 ,то ...
    {
    delay(500);
    digitalWrite(ledPin, LOW); // светодиод отключаем
    delay(500);
    digitalWrite(ledPin, HIGH); // светодиод включаем
    Serial.print("Дверь все еще открыта");
    // вставить КОД об отправки сообщения по MQTT -- "дверь еще открыта"
    }


    delay(500); // Ждём 500 милисекунд
    }
     

    Принцип работы:
    Три состояния по трем If
    1 - магнит далеко от датчика. Включаем светодиод. После настройки MQTT добавляем сообщение "открылась".
    2 - магнит возле датчика. Отключаем светодиод. После настройки MQTT добавляем сообщение "закрылось".
    3 - мигаем светодиодом (чтобы была видна работа кода), что дверь еще открыта. После настройки MQTT добавляем сообщение "еще открыто" и убираем мигание.

    Схема подключения:
    Датчик Холла униполярный цифровой подключается
    + к пину VCC
    - к пину GND
    сигнальный к пину 14
    при этом между пином VCC и 14 стоит резистор 10кОм, чтобы при открытии двери на пин 14 был HIGH.

    Далее хочу прикрутить MQTT, но не знаю на каком облачном сервисе настроить брокер.
     
  7. parovoZZ

    parovoZZ Гуру

    А у датчика Холла разве не КМОП выход? Если так, то резистор лишний.
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Традиционный совет - поставьте между датчиком и пином Ардуины резистор в диапазоне 220-1000 ом. Если Ардуина вдруг переключит пин с режима входа на режим выход - резистор защитит от КЗ (из-за конфликта выходов). Закон Мерфи - если косяк может случиться - он случится.
     
  9. parovoZZ

    parovoZZ Гуру

    Это как?
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Короче - закон Мэрфи, и этого достаточно.
     
    alp69 нравится это.