Постоянно требуется перезагрузка
- Войдите на сайт для отправки комментариев
Ср, 04/01/2017 - 14:36
#include <SPI.h> #include <Ethernet.h> #include "DHT.h" char cl; int i,timer,st; boolean v; boolean r1 = false; boolean r2 = false; boolean p = true; #define DHTPIN 4 #define DHTTYPE DHT11 DHT dht1(DHTPIN, DHTTYPE); float h; float t; float k; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 28); EthernetServer server(80); EthernetClient client; void setup() { st=1; pinMode(2, OUTPUT); pinMode(3, OUTPUT); digitalWrite(2,1); digitalWrite(3,1); Ethernet.begin(mac, ip); server.begin(); dht1.begin(); } void loop(){ h = dht1.readHumidity(); t = dht1.readTemperature(); k = (((analogRead(2) * 0.004882814)-0.54)*100); client = server.available(); if (client) { if (client.available()) { cl = ' '; while (cl != '\n') { cl = client.read(); //Serial.print(cl); if (v) { v = false; if(st == 0){ if (cl == '0') { if(r1){ digitalWrite(2,1); r1 = false; }else{ digitalWrite(2,0); r1 = true; } } if (cl == '1') { if(r2){ digitalWrite(3,1); r2 = false; }else{ digitalWrite(3,0); r2 = true; } } } if(cl == '2'){ if(st == 0){ st = 1; tone(8,50,500); delay(700); tone(8,50,100); delay(200); tone(8,50,100); digitalWrite(2,1); r1 = false; digitalWrite(3,1); r2 = false; delay(500); }else if(st == 1){ st = 2; tone(8,50,500); delay(700); tone(8,50,50); delay(200); tone(8,50,50); r2 = false; digitalWrite(3,1); }else st = 0; } } if (cl == '$') { v = true; } } } while (cl != ' ') cl = client.read(); client.println(" <!DOCTYPE HTML><meta charset='utf-8'> <html>Влажность= "); client.println(h); client.println("<br>Температура= "); client.println(t); client.println(" Котел="); client.println(k); client.println("<br>Циркуляционный насос="); client.println(r1); client.println(" Поддув="); client.println(r2); client.println("<br>Автоматизация="); client.println(st); client.println("<br>"); //client.println("<a href='/$0'>R1</a> <a href='/$1'>R2</a> <a href='/$2'>At</a><br>"); for(int x=1;x <= k/2;x++){ client.print(" "); } client.println("V"); client.println("<br><img src=http://ipic.su/img/img7/fs/gg.1442504892.jpg />"); client.println("</html>"); client.stop(); } timer+=1; if (st == 1) { if(k>105) { tone(8,500,1000); delay(1000); }else if(k>100) { digitalWrite(2,0); r1 = true; } if (timer >= 120) { timer=1; if(t<=24){ digitalWrite(2,0); r1 = true; }else if(t>=25){ digitalWrite(2,1); r1 = false; }} if(k<=80){ digitalWrite(3,0); r2 = true; }else if(k>=87){ digitalWrite(3,1); r2 = false; } }else if (st == 2){ if(k>105) { tone(8,500,1000); delay(1000); }else if(k>100) { digitalWrite(2,0); r1 = true; } if (timer >= 120) { timer=1; if(t<=24){ digitalWrite(2,0); r1 = true; }else if(t>=25){ digitalWrite(2,1); r1 = false; } } } }
Подскажите что не так.
А Вы не могли бы объяснить что не так? Что означает фраза "Постоянно требуется перезагрузка"? Кем требуется? Террористы звонят по телефону? Или ведущий по телеку требует?
Что вообще не так с этим скетчем?
Данный код работает на Arduino UNO, и работет около 2-3 часов и перестаёт отвечать на запросы интернет клиента, а в течении этого времени запросы не поступают. Что я сделал не так?
Код херовый понимаю(т.к. 3 года назад писал, а переделывать лень).Так вот что с кодом может быть не так?
ЗЫ С блоком питания взял на заметку
Данный код работает на Arduino UNO, и работет около 2-3 часов и перестаёт отвечать на запросы интернет клиента, а в течении этого времени запросы не поступают. Что я сделал не так?
Что значит "перестаёт отвечать на запросы интернет клиента, а в течении этого времени запросы не поступают". Уточните. Он сначала нормально отвечает, а потом перестаёт или "в течение 2-3 часов" не поступают, а потом как только первый поступил, так сразу и перестал отвечать?
Он сначала нормально отвечает, работает в течении 2-3 часов (т.е. если подать в этот промежуток времени запрос то он ответит), после 2-3 возможно и 4 часов престает отвечать на запросы.
Такое часто бывает при утечках памяти. Пока хватает - работает, а как переполнится - сдыхает.
Чтобы это исключить (или подтвердить), попроуйте подключить всё это хозяйство к сериалу и после каждого ответа печатайте объём свободной памяти. Ну и подгрузите его как следует запросами, чтобы эффект скорее проявился. Посмотрим, что получится.
Вот код:
1137 Байт
ЗЫ Блок питания поменял всё равно перестаёт откликаться
Это при старте? Пробуйте загрузить запросами, поставте Serial.print(freeRam ())после 130 строки, и посмотреть где утечка озу.
1137 Байт
Что это значит? Вы в процессе наблюдайте, уменьшается или нет.
Не изменяется, Постоянно такое значение
Значит, в процессе не меняется? Хорошо, будем считать, что память пока исключили.
Тогда давайте определять в каком именно месте она у Вас умирает при очередном запросе..
для этого понаставьте в программе как можно больше (хоть через строчку) таких конструкций:
Serial.println("#N"); Serial.flush();
Только N везде уникальные. С помощью этого в момент зависания мы сможем понять где и что она делает.
Нужно провести несколько экспериментов, т.к. очень важно - затыкается она в одном и том же месте или в разных.
Кстати, не помешает в одной и печатей (той что сразу после получения запроса) печатать текст запроса, чтобы стало ясно затыкается она на одном и том же запросе или на разных.
Что я сделал не так?
стек протокола не айс у этих балалаек
А эзернетшилд какой?
w5100
Вроде рещение проблемы нашлось. В сети 220 была нагрузка с диодом срезающая полупериоды.