Постоянно требуется перезагрузка

N1ntendo
Offline
Зарегистрирован: 04.01.2017
#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("&nbsp;Котел=");
			client.println(k);
			client.println("<br>Циркуляционный насос=");
			client.println(r1);
			client.println("&nbsp;Поддув=");
			client.println(r2);
			client.println("<br>Автоматизация=");
			client.println(st);
			client.println("<br>");
			//client.println("<a href='/$0'>R1</a>&nbsp;<a href='/$1'>R2</a>&nbsp;<a href='/$2'>At</a><br>");
			for(int x=1;x <= k/2;x++){
				client.print("&nbsp;");
			}
			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;
		   }
		   }
		
		
		
		
		
		
	}
}

Подскажите что не так.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы не могли бы объяснить что не так? Что означает фраза "Постоянно требуется перезагрузка"? Кем требуется? Террористы звонят по телефону? Или ведущий по телеку требует?

Что вообще не так с этим скетчем?

N1ntendo
Offline
Зарегистрирован: 04.01.2017

Данный код работает на Arduino UNO, и работет около 2-3 часов и перестаёт отвечать на запросы интернет клиента, а в течении этого времени запросы не поступают. Что я сделал не так?

N1ntendo
Offline
Зарегистрирован: 04.01.2017

Код херовый понимаю(т.к. 3 года назад писал, а переделывать лень).Так вот что с кодом может быть не так?

ЗЫ С блоком питания взял на заметку

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

N1ntendo пишет:

Данный код работает на Arduino UNO, и работет около 2-3 часов и перестаёт отвечать на запросы интернет клиента, а в течении этого времени запросы не поступают. Что я сделал не так?

Что значит "перестаёт отвечать на запросы интернет клиента, а в течении этого времени запросы не поступают". Уточните. Он сначала нормально отвечает, а потом перестаёт или "в течение 2-3 часов" не поступают, а потом как только первый поступил, так сразу и перестал отвечать?

N1ntendo
Offline
Зарегистрирован: 04.01.2017

Он сначала нормально отвечает, работает в течении 2-3 часов (т.е. если подать в этот промежуток времени запрос то он ответит), после 2-3 возможно и 4 часов престает отвечать на запросы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Такое часто бывает при утечках памяти. Пока хватает - работает, а как переполнится - сдыхает.

Чтобы это исключить (или подтвердить), попроуйте подключить всё это хозяйство к сериалу и после каждого ответа печатайте объём свободной памяти. Ну и подгрузите его как следует запросами, чтобы эффект скорее проявился. Посмотрим, что получится.

vitalikost
Offline
Зарегистрирован: 28.11.2014

Вот код:

int freeRam () {
  extern int __heap_start, *__brkval;  
  int v;  
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

 

N1ntendo
Offline
Зарегистрирован: 04.01.2017

1137 Байт

ЗЫ Блок питания поменял всё равно перестаёт откликаться

vitalikost
Offline
Зарегистрирован: 28.11.2014

Это при старте? Пробуйте загрузить запросами, поставте Serial.print(freeRam ())после 130 строки, и посмотреть где утечка озу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

N1ntendo пишет:

1137 Байт

Что это значит? Вы в процессе наблюдайте, уменьшается или нет.

N1ntendo
Offline
Зарегистрирован: 04.01.2017

Не изменяется, Постоянно такое значение

...
client.println("<br>Автоматизация=");
client.println(st);
client.println("<br>");
client.println("Freeram = ");
client.println(freeRam());
client.println("<br>");
...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит, в процессе не меняется? Хорошо, будем считать, что память пока исключили.

Тогда давайте определять в каком именно месте она у Вас умирает при очередном запросе..

для этого понаставьте в программе как можно больше (хоть через строчку) таких конструкций:

Serial.println("#N"); Serial.flush();

Только N везде уникальные. С помощью этого в момент зависания мы сможем понять где и что она делает.

Нужно провести несколько экспериментов, т.к. очень важно - затыкается она в одном и том же месте или в разных.

Кстати, не помешает в одной и печатей (той что сразу после получения запроса) печатать текст запроса, чтобы стало ясно затыкается она на одном и том же запросе или на разных.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

N1ntendo пишет:

 Что я сделал не так?

стек протокола не айс у этих балалаек

А эзернетшилд какой?

N1ntendo
Offline
Зарегистрирован: 04.01.2017

w5100

Вроде рещение проблемы нашлось. В сети 220 была нагрузка с диодом срезающая полупериоды.