Тема: Вопрос по скетчу
И снова требуется Ваша помощь потому как сам я не могу понять причину моих злоключений да и опыт этот у меня первый ввиду чего скорее всего я не вижу элементарной ошибки.
Собственно задумка следуеющая. Девайс мониторит температуру и приеё занчение меньше заданного включается релюха. Вместо релюхи пока юзается светодиод для тестов. Что имею сейчас. Freeduino 2009 + Ethernet Shield v2 + DS18B20.
Собственно сам исходник
#include <DallasTemperature.h>
#include <Ethernet.h>
#include <EEPROM.h>
#include <WString.h>
//Подключаем описание библиотеки ethernet
//Здесь задается MAC адрес и IP адрес устройства.
//В данном примере предполагается, что IP адрес компьютера, с которого
//будем обращаться к устройству будет любым из сети 192.168.1.x,
//и маска 255.255.255.0
//MAC адрес можно задать любой, лишь бы он не пересекался с имеющимися в сети
int outputPin = 9;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 100, 100, 100, 174 };
Server server(80);
DallasTemperature tempSensor;
String readString = String(30); //string for fetching data from address
//Создаем сервер, слушающий 80й порт (80 – это порт HTTP)
void setup()
{
Ethernet.begin(mac, ip);
server.begin();
tempSensor.begin(8);
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
//EEPROM.write(1, 01);
//EEPROM.write(2, 10);
}
//Инициализируем Ethernet модуль
//Начинаем ожидать соединений на 80 порту
void loop()
{
float f=tempSensor.getTemperature();
Serial.println(tempSensor.getTemperature());
//Serial.println(tempSensor.getTemperature());
//часть отвечающая за подачу сигнала на реле
uint8_t start = EEPROM.read(1);
uint8_t stop = EEPROM.read(2);
if (f < start) {
digitalWrite(outputPin, HIGH);
EEPROM.write(0, 2);
}
else if (f > stop) {
digitalWrite(outputPin, LOW);
EEPROM.write(0, 1);
}
//uint8_t - тип данных, занимающий 1 байт,
//и хранящий значение от 0 до 255
//uint8_t status;
//считываем значение текущее
uint8_t status = EEPROM.read(0);
//Если кто-то установил соединение с нашим сервером, следующая строчка
//создаст объект-клиент.
Client client = server.available();
if (client) { //если client не нулевой (т.е. соединение есть)
//...значит кто-то подключился. Согласно протокола HTTP клиент
//шлет довольно сложный запрос, но мы не будет его разбирать -
//нам достаточно дождаться окончания запроса.
//Запрос заканчивается пустой строкой, поэтому мы просто дождемся
//получения символа '\n', перед которым тоже были получены '\n' и '\r'.
//current_line_is_blank - это переменная-флаг. Она равна true, если
//вновь полученная от клиента строка пустая, т.е. в полученных данных
//не встретилось символов отличных от '\n' и '\r'.
//Будем выставлять переменную current_line_is_blank в false при
//получении любого отличного от '\n' и '\r' символа
boolean current_line_is_blank = true;
while (client.connected()) {
//пока клиент подключен
if (client.available()) {
//если от него пришел символ
char c = client.read();
//читаем этот символ
if (readString.length() < 30) {
//store characters to string
readString.append( c);
}
//Serial.print( c);
//Если получен перевод строки ('\n') и current_line_is_blank == true,
//значит мы получили пустую строку, т.е. запрос клиента окончен –
//можно слать ответ
if (c == '\n' && current_line_is_blank) {
//температура включения завесы
if(readString.contains("Start=0")) {
EEPROM.write(1, 0);
} else
if(readString.contains("Start=1")) {
EEPROM.write(1, 1);
} else
if(readString.contains("Start=2")) {
EEPROM.write(1, 2);
} else
if(readString.contains("Start=3")) {
EEPROM.write(1, 3);
} else
if(readString.contains("Start=4")) {
EEPROM.write(1, 4);
}
if(readString.contains("Start=5")) {
EEPROM.write(1, 5);
}
//температура выключения завесы
if(readString.contains("Stop=6")) {
EEPROM.write(2, 6);
} else
if(readString.contains("Stop=7")) {
EEPROM.write(2, 7);
} else
if(readString.contains("Stop=8")) {
EEPROM.write(2, 8);
} else
if(readString.contains("Stop=9")) {
EEPROM.write(2, 9);
} else
if(readString.contains("Stop=10")) {
EEPROM.write(2, 10);
} else
if(readString.contains("Stop=11")) {
EEPROM.write(2, 11);
} else
if(readString.contains("Stop=12")) {
EEPROM.write(2, 12);
} else
if(readString.contains("Stop=13")) {
EEPROM.write(2, 13);
} else
if(readString.contains("Stop=14")) {
EEPROM.write(2, 14);
} else
if(readString.contains("Stop=15")) {
EEPROM.write(2, 15);
} else
if(readString.contains("Stop=16")) {
EEPROM.write(2, 16);
} else
if(readString.contains("Stop=17")) {
EEPROM.write(2, 17);
} else
if(readString.contains("Stop=18")) {
EEPROM.write(2, 18);
} else
if(readString.contains("Stop=19")) {
EEPROM.write(2, 19);
} else
if(readString.contains("Stop=20")) {
EEPROM.write(2, 20);
}
//шлем стандартный HTTP заголовок
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//он тоже заканчивается пустой строкой!
int temp1 = (f - (int)f) * 100;
int temp_start = EEPROM.read(1);
int temp_stop = EEPROM.read(2);
client.print("Т в экране ");
client.print((int)f);
//client.print(",");
//client.print((int)temp1);
client.println("<br>");
client.println("Т запуска завесы-");
client.print((int)temp_start);
client.println("<br>");
client.println("Т остановки завесы-");
client.print((int)temp_stop);
client.println("<br>");
//
//client.println("<br>");
//HTML тэг <br> - перевод строки
//Вывод состояния тепловой завесы
if (status == 1) {
client.print("Завеса ВЫКЛЮЧЕННА");
}
if (status == 2) {
client.print("Завеса ВКЛЮЧЕННА");
}
client.println("<br>");
client.println("<form method=get><input type=text name=Start>Start<br><input type=text name=Stop>Stop<br><input type=submit value=Применить></form>");
break;
//работа окончена – можно выходить из цикла while
}
if (c == '\n') { //если получен перевод строки, значит началась новая
//строка. Выставим флаг current_line_is_blank = true
current_line_is_blank = true;
} else if (c != '\r') { //если получен любой другой символ, отличный
//от возврата каретки ('\r'), значит получаемая строка непустая
current_line_is_blank = false;
}
}
}
//небольшая пауза, чтобы данные успели уйти
delay(1);
//разрываем соединение с клиентом
readString="";
client.stop();
}
}
Теперь суть проблемы. Всё прекрассно работает ровно до тех пор пока например температура не принила низкое значение и должен врубится светодиод. Он включается, но спустя некоторое время девай вести себя начинает чудно. Температуру перестаёю получать. То есть показывает 0.00 градуса и всё. Как только температура принимает значение при котором светодиод должен отрубится то девайс начинает работать нормально. То есть я так думаю сума сходить начинает эта весчь тогда когда outputPin, HIGH. Я вот только не пойму почему. И ещё почему то очень сильно греется микросхема W5100/ Корчое прошу вашей помощи потому как сам я уже не знаю что ещё можно сделать