Датчик движения перестаёт слать данные

Тема в разделе "Arduino & Shields", создана пользователем Gelezako, 23 сен 2017.

  1. Gelezako

    Gelezako Нерд

    Здравствуйте уважаемые ардуинщики. Столкнулся с проблемой, через некоторый перод времени, бывет через несколько часов, бывает через сутки, датчик движения HC-SR501 перестаёт слать данные о том что есть движение, но возможно и что сам датчик перестаёт определять сам факт движения (апаратная проблема), но я грешу на код, потому как если перегрузить ардуинку, то всё начинает работать.

    Датчик движения HC-SR501 подключён к андуино нано + Ethernet шилд, когда фиксирует движене через mqtt шлю еденичку.

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

    REm Гик

    Попробуй понаблюдать за датчиком, не используя отправки сообщений на минимальном коде.
    У меня были проблемы с датчиком, когда температура в помещении за +30 уходила.
     
  3. Gelezako

    Gelezako Нерд

    а что значит
    На счёт температуры, максимальные колебания у меня это 5 градусов. Так что не думаю что темпертатура тут виновата.
     
  4. REm

    REm Гик

    в любом случае я бы начал проверять с самого просто - проверки (длительной) датчика движения.
    Минимальный код - это демонстрация работы датчика, без излишеств.
    Код (C++):
    int ledPin = 13;  // Светодиод на 13 порту
    int inPin = 3;  //   ИК Датчик движения
    void setup()
    {
    pinMode (ledPin, OUTPUT);
    pinMode (inPin, INPUT);
    }
    void loop()
    {
    if (digitalRead(inPin) ==HIGH) // if язык.инструк.управл.Читается так: если выполняется условие ( в скобках) то выполняется блок программы, в фигурных скобках.
    {
    digitalWrite(ledPin, HIGH);

    digitalWrite (ledPin, LOW);
    }
    }
     
    Gelezako нравится это.
  5. Gelezako

    Gelezako Нерд

    ясно, спасибо
     
  6. ORLENOK

    ORLENOK Гик

    Вообще проблем много может быть. А в Serial он шлёт данные? Или и так тоже перестаёт слать? Как вариант, что-то где-то переполняется. Что именно не могу подсказать.
     
  7. DIYMan

    DIYMan Guest

    Первый симптом утечки памяти. Щас гляну код и отпишусь.

    Первое: вот эти дёрганья зачем, если можно напрямую позвать?
    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length)
    {
      byte* p = (byte*)malloc(length);
      memcpy(p, payload, length);
      client.publish("data/HCSR501", p, length);
      free(p);
    }
    Достаточно позвать client.publish("data/HCSR501", payload, length); - и не дёргать лишний раз память.

    Второе: уверены, что в буфер всё влазит?
    Код (C++):
    static char char_hc[10];
          dtostrf(sensorValue, 3, 0, char_hc);
    Попробуйте увеличить буфер под преобразование ;)
     
    Gelezako нравится это.
  8. Gelezako

    Gelezako Нерд

    т.е. с учётом ваших рекомендаций, функция должна иметь такой вид?
    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length)
    {
      client.publish("data/HCSR501", p, length);
    }
    Не понимаю почему у вас возникли сомнения? Переменная sensorValue может быть либо '0' либо '1', а я выделяю 10 символов, хотя в принципе достаточно и 1 символа. Если я что-то не так понял, поправьте плиз.
     
  9. DIYMan

    DIYMan Guest

    Да, только не p, а payload:
    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length)
    {
      client.publish("data/HCSR501",payload, length);
    }
    Не, всё норм, это я промахнулся, чуть выше не увидел, что там digitalRead.

    В общем, если результаты изменений в первой части успеха не принесут - надо смотреть, чего там творится в коде используемых библиотек, кмк ;)
     
    Gelezako нравится это.
  10. Gelezako

    Gelezako Нерд

    понял, залил скеч, буду тестить, спасибо!
     
  11. DIYMan

    DIYMan Guest

    Да и строго говоря, от dtostrf тоже можно отказаться - оно там ни к чему. Вместо:
    Код (C++):
      static char char_hc[10];
          dtostrf(sensorValue, 3, 0, char_hc);
          Serial.println("publish");
          client.publish("data/HCSR501", char_hc);
    Можно:
    Код (C++):
          Serial.println("publish");
          client.publish("data/HCSR501", sensorValue ? "1" : "0");
     
    Gelezako нравится это.
  12. Gelezako

    Gelezako Нерд

    никогда не понимал этот "? :" оператор ))
    вставил - работает, спасибо!
     
  13. ostrov

    ostrov Гуру

    Если sensorValue == true, то подставить "1", иначе "0".
     
    Gelezako нравится это.
  14. DIYMan

    DIYMan Guest

    Код (C++):
    client.publish("data/HCSR501", sensorValue ? "1" : "0");
    короткая форма записи вот этого:
    Код (C++):
    if(sensorValue)
    client.publish("data/HCSR501", "1");
    else
    client.publish("data/HCSR501", "0");
    Тернарный оператор, можете загуглить, если интересно ;)
     
    Gelezako нравится это.
  15. Gelezako

    Gelezako Нерд

    да, когда читаешь про него всё понятно, но когда доходит дело до применения всё равно используешь иф-элз ))
    --
    в общем, после ночи работы, утром проблема снова проявилась, но на этот раз я датчик оставил в ноуте что бы можно было смотреть в сериал порт. Выяснилось что сам датчик исправно срабатывал, но по какой-то причине сам паблишь не проходил т.е. на сервере mqtt новых данных не было.
    Возможно ли что новая конструкция
    Код (C++):
    client.publish("data/HCSR501", sensorValue ? "1" : "0");
    как-то не так начинает работать с течением времени? Ещё интересен тот факт что ресет уже не спасал. Я просто перезалил тот же скеч без изменений и всё сразу стало работать. У меня просто исчерпались идеи. :(
     
  16. DIYMan

    DIYMan Guest

    Нет, с этой конструкцией всё ок ;) Надо смотреть библиотеки на предмет возможных ошибок. И, конечно, исключить помехи по питанию, от которых дунька может сходить с ума ;)
     
  17. Gelezako

    Gelezako Нерд

    в качестве питанияя использую стандартный юсб кабель, подскажите что можно предпринять чтобы исключить возможные помехи?
     
  18. DIYMan

    DIYMan Guest

    Схему бы вашу посмотреть, плюс - что за БП?
     
  19. Gelezako

    Gelezako Нерд

    вот вся моя схема, ардуинка, датчик и ethernet шилд, только на картинкt уно, а у меня нано.
    [​IMG]

    БП как таковой не использую, я использую переходник 220в -> usb с выходом на 1 ампер. В этот переходник вставляю стандартный usb кабел, который шёл вместе с ардуино нано.
    [​IMG]
     
  20. DIYMan

    DIYMan Guest

    Короче, всё питается от встроенного в дуньку стаба, я правильно понял? Уверены, что тока всему добру хватает? Имею в виду потребление датчика и шилда? Надо смотреть, сколько они кушают - вполне возможно, что стабу дунькиному плохо. Необязательно, конечно, но и этот вариант надо исключить прежде, чем сходу пенять на библиотеки.

    Стаб, кстати, не греется ли сильно случаем после долгой работы?