Помогите накодить проект на ардуине

Разговоры обо всем
Відповісти
Автор
Повідомлення
Zzzz
Member
Аватар користувача
Звідки: Київ

Повідомлення

В общем, есть небольшая задумка для ардуины, вернее уже реализованный проект, но хотелось бы разобраться более детально, так как не знаю тонкостей кодинга на C.
Есть ардуина + датчик температуры + датчик движения. Всё это дело отдает по интернет шилду данные о температуре воздуха + данные о фиксации движения по запросу в zabbix или же выводит http страницу в браузер и отсчитывает время от последнего зафиксированного движения.
Но, случаются зависания и хотелось бы понять почему (где-то косяк в коде?), а также, реализовать автоматический перезапуск ардуины в случае, если она зависла.
Читал о функции watchdog в загрузчике, но для её запуска на nano v3 надо перешивать бутлоадер программатором :insane:
Может кому будет не лень, гляньте код и ткните, где поправить и как :shuffle:

Код: Виділити все

//Инициализация
#include <dht.h>
#include <UIPEthernet.h>

#define PIR 5
#define DHT11_PIN 6

dht DHT;

byte mac[] = { 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 }; // random MAC
byte ip[] = { 10, 4, 1, 42 }; // IP address in local network
String readString = String(20);
byte addr[8];
int buzzer = 3;
unsigned long timestart;
unsigned long timep = 0;

EthernetServer server(10050); // Zabbix port

void setup() {
  Serial.begin(9600);
  pinMode(buzzer, OUTPUT); //объявляем пин как выход
  pinMode(PIR, INPUT);
  Ethernet.begin(mac, ip);
  server.begin();
  delay(10000); //задержка в минуту, инициализация датчиков
  Serial.println("Настройки инициализированы");
}

void loop() {
  int pirVal = digitalRead(PIR);
  byte data[2];
  float celsius;
  if (pirVal == HIGH) {
    timestart = millis();
  }
  timep = (millis() - timestart) / 60000;
  //пуск опроса заббикс
  readString = "";
  if (EthernetClient client = server.available())
  {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n') // end of query from zabbix server
        {
          //Монитор температуры в заббикс//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
          if (readString == "env.temp") {
            //цикл вывода температуры
            int chk = DHT.read11(DHT11_PIN); //инициализация датчика температуры
            delay(1200);
            client.print(DHT.temperature); //температуру в заббикс
            Serial.print("Temperature = ");  //вывод в серийный порт
            Serial.println(DHT.temperature);  //вывод в серийный порт
            if (DHT.temperature > 32) {
              analogWrite(buzzer, 100); //включаем звук
              delay(1000);
              analogWrite(buzzer, 0); //выключаем звук
            }
          }
          //Монитор температуры в заббикс//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

          else {
            //Монитор движения в заббикс//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            if (readString == "env.close")
              if (pirVal == HIGH) {
                client.print("1");
                Serial.println("Motion detected!");
              }
              else
              {
                client.print("0");
                Serial.println("Noone detected!");
              }
            ////Монитор движения в заббикс////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            else {
              //http client//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: text/html");
              client.println("Connection: close");  // the connection will be closed after completion of the response
              client.println("Refresh: 5");  // refresh the page automatically every 5 sec
              client.println();
              client.println("<!DOCTYPE HTML>");
              client.println("<html>");
              client.print("<html><head><title>Temperature</title> </head>");
              client.print("<body><CENTER><H2>Temperature</H2></BR><H1>");
              int chk = DHT.read11(DHT11_PIN); //инициализация датчика температуры
              delay(1200);
              if (DHT.temperature < -50)
              {
                client.print("ERR");
              }
              else {
                client.print(DHT.temperature); client.print(" C");
              }
              client.println("<br />");
              if (pirVal == HIGH) {
                Serial.println("Motion detected!");
                client.println("Motion detected!");
                client.println("<br />");
              }
              if (timep > 0) {
                if (timep < 60) {
                  client.println(timep + "asdasd");
                  client.print(" min ago");
                  client.println("<br />");
                }
                else {
                  if (timep < 1440)
                  {
                    client.println(timep / 60);
                    client.print(" h ago");
                    client.println("<br />");
                  }
                  else {
                    client.println(timep / 1440);
                    client.print(" d ago");
                    client.println("<br />");
                  }
                }
              }
              client.println("</html>");
              //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            }
          }
          break;
        }
        else if (readString.length() < 20) {
          readString = readString + c;
        }
      }
    }
    delay(10);
    client.stop();
  }
}
c0013r
Member
Аватар користувача
Звідки: UA

Повідомлення

Zzzz
так смотри по порту на чем вешается, мелкие задержки лучше не использовать, типа последняя.
перезапуск можно организовать другой ардуиной + реле.
Zzzz
Member
Аватар користувача
Звідки: Київ

Повідомлення

c0013r по порту не могу, так как виснет раз в сутки\пару часов, когда ардуина в шкафу на отдельном питании, мониторить порт просто нет возможности.
Слишком объемно получиться, в идеале корпус чем меньше, тем лучше. А если зависнет и вторая ардуина? :gigi:
А что с мелкими задержками? В чём суть?
c0013r
Member
Аватар користувача
Звідки: UA

Повідомлення

Zzzz
тогда, я бы шилд проверил, на момент потери интернета на роутере.
ПС: по другому(проще) аварийный перезапуск не организовать, обычный watchdog это лишь перезапуск по таймеру, но если ардуина повисла, то и watchdog работать не будет, вероятность что повиснет вторая это почти фантастика - она будет только один цикл обрабатывать.
taxi911
Member
Аватар користувача
Звідки: Киев

Повідомлення

Запилить внешний вотчдог
https://mysku.ru/blog/aliexpress/52212.html
На старых платах шкафов освещения применяли эти даллосовские чипы, но то было давно.
Відповісти