Постоянно требуется перезагрузка
- Войдите на сайт для отправки комментариев
Ср, 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 часов престает отвечать на запросы.
Такое часто бывает при утечках памяти. Пока хватает - работает, а как переполнится - сдыхает.
Чтобы это исключить (или подтвердить), попроуйте подключить всё это хозяйство к сериалу и после каждого ответа печатайте объём свободной памяти. Ну и подгрузите его как следует запросами, чтобы эффект скорее проявился. Посмотрим, что получится.
Вот код:
int freeRam () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); }1137 Байт
ЗЫ Блок питания поменял всё равно перестаёт откликаться
Это при старте? Пробуйте загрузить запросами, поставте Serial.print(freeRam ())после 130 строки, и посмотреть где утечка озу.
1137 Байт
Что это значит? Вы в процессе наблюдайте, уменьшается или нет.
Не изменяется, Постоянно такое значение
... client.println("<br>Автоматизация="); client.println(st); client.println("<br>"); client.println("Freeram = "); client.println(freeRam()); client.println("<br>"); ...Значит, в процессе не меняется? Хорошо, будем считать, что память пока исключили.
Тогда давайте определять в каком именно месте она у Вас умирает при очередном запросе..
для этого понаставьте в программе как можно больше (хоть через строчку) таких конструкций:
Serial.println("#N"); Serial.flush();
Только N везде уникальные. С помощью этого в момент зависания мы сможем понять где и что она делает.
Нужно провести несколько экспериментов, т.к. очень важно - затыкается она в одном и том же месте или в разных.
Кстати, не помешает в одной и печатей (той что сразу после получения запроса) печатать текст запроса, чтобы стало ясно затыкается она на одном и том же запросе или на разных.
Что я сделал не так?
стек протокола не айс у этих балалаек
А эзернетшилд какой?
w5100
Вроде рещение проблемы нашлось. В сети 220 была нагрузка с диодом срезающая полупериоды.