Тема: Вопрос по скетчу

И снова требуется Ваша помощь потому как сам я не могу понять причину моих злоключений да и опыт этот у меня первый ввиду чего скорее всего я не вижу элементарной ошибки.
Собственно задумка следуеющая. Девайс мониторит температуру и приеё занчение меньше заданного включается релюха. Вместо релюхи пока юзается светодиод для тестов. Что имею сейчас. 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/ Корчое прошу вашей помощи потому как сам я уже не знаю что ещё можно сделать

Re: Вопрос по скетчу

дополню. Температуру с датчика получать начинает не сразу неправильную а спустя минуты три как начинает гореть светодиод. При чём может либо не получать значения либо же получаь но всякую чушь типа то минус пять градусов то минус 170 градусов покажет.

Re: Вопрос по скетчу

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

4

Re: Вопрос по скетчу

float f=tempSensor.getTemperature();
Serial.println(tempSensor.getTemperature());

странный кусок, учитывая что на взятие температуры надо время.

по моему вы с еепромом перемудрили где то.

попробуйте от простого к сложному?  запустите сперва просто мониторинг температуры в сериал порт с обработккой, но без езернетки..  и т.д.

5

Re: Вопрос по скетчу

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

6

Re: Вопрос по скетчу

Подскажите пожалуйста: компилятар, ругается, выдает следуующее сообщение:
clacc String has not member named 'append'
на выражение:
readString.append( c);

что моежет быть причиной и как это решается?

7

Re: Вопрос по скетчу

по всё просто. у стринга нет такого метода, о чём вами говорят.  как решается?  ну вроде  +=  есть
http://arduino.cc/en/Reference/StringObject

а вообще вот с чего вы взяли что такая функция есть, и удивляетесь что она не работает?