Есть ардуина + датчик температуры + датчик движения. Всё это дело отдает по интернет шилду данные о температуре воздуха + данные о фиксации движения по запросу в zabbix или же выводит http страницу в браузер и отсчитывает время от последнего зафиксированного движения.
Но, случаются зависания и хотелось бы понять почему (где-то косяк в коде?), а также, реализовать автоматический перезапуск ардуины в случае, если она зависла.
Читал о функции watchdog в загрузчике, но для её запуска на nano v3 надо перешивать бутлоадер программатором
Может кому будет не лень, гляньте код и ткните, где поправить и как
Код: Выделить всё
//Инициализация
#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();
}
}