Официальный сайт компании Arduino по адресу arduino.cc
Web-сервер на arduino с контроллером температуры.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 16/08/2015 - 13:38
Что получилось:
Данные брал из интернета, сам в программировании не силен((
В основном отсюда источник: http://www.cyberforum.ru/post5915692.html
И отсюда: http://forum.arduino.cc/index.php?topic=114436.msg1008272#msg1008272
Код результата:
/* * контроллер тёплого пола */ #include <EtherCard.h> // Библиотека для сетевой карты #include <OneWire.h> // Бибилиотека для датчика температуты D18B20 #include <EEPROM.h> // Библиотека энергонезависимой памяти static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // MAC адрес const byte PinTemp = 9; // Датчики Dallas DS18B20 Temperature Sensors const byte PinSSR1 = 3; // Реле Pin for SSR 1 const byte PinSSR2 = 4; // Реле Pin for SSR 2 const byte PinSSR3 = 5; // Реле Pin for SSR 3 const byte PinSSR4 = 6; const byte pirPin = 1; const byte pirPin2 = 2; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; long unsigned int pause = 0; //Пауза, после которой движение считается оконченным //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime; char TargetTemperarureTextbox[10]; byte sensor1[8] = {0x28, 0x26, 0xBE, 0xC6, 0x02, 0x00, 0x00, 0x88}; // Адрес первого сенсора byte sensor2[8] = {0x28, 0x34, 0x96, 0xDD, 0x03, 0x00, 0x00, 0x7C}; // Адрес второго сенсора float temp1; float temp2; char chartemp1[10]; char chartemp2[10]; char* page1; char* page2; byte Mode1, Mode2; byte TargetTemp1; byte TargetTemp2; byte SSR1on = 0; // 0 is Off, 1 is On byte SSR2on = 1; // 0 is Off, 1 is On byte Ethernet::buffer[1120]; // if you increase the size of the HTML code you may need to increase the buffer size (or it will stop working) //TODO BufferFiller bfill; OneWire ds(PinTemp); // пин подключения термодатчика void setup () { Serial.begin(57600); Serial.println( "BlackSnow Heated floor"); pinMode(PinTemp, INPUT); pinMode(PinSSR1, OUTPUT); // sets the digital pin as input pinMode(PinSSR2, OUTPUT); // sets the digital pin as input pinMode(PinSSR3, OUTPUT); // sets the digital pin as input pinMode(PinSSR4, OUTPUT); // sets the digital pin as input Mode1 = EEPROM.read(0); Mode2 = EEPROM.read(1); TargetTemp1 = EEPROM.read(2); TargetTemp2 = EEPROM.read(3); if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) Serial.println( "Failed to access Ethernet controller"); Serial.println("Setting up DHCP"); if (!ether.dhcpSetup()) Serial.println( "DHCP failed"); ether.printIp("My IP: ", ether.myip); ether.printIp("Netmask: ", ether.netmask); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); } const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n" "<!DOCTYPE html>" "<html><head>" "<meta http-equiv='refresh' content='5'/>" "<meta charset='utf-8'>" "<title>Тёплые полы</title>" "<body>" "<center><font size=\"4\">" "<table border=\"1\" cellpadding=\"5\" style=\"width: 600px; border-collapse: collapse; border: 1px solid black;\">" "<tr style=\"background-color: silver\"><td>Помещение:</td>" "<td>Ванна</td>" "<td>Прихожая</td></tr>"; const char http_Found[] PROGMEM = "HTTP/1.0 302 Found\r\n" "Location: /\r\n\r\n"; const char http_Unauthorized[] PROGMEM = "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n\r\n" "<h1>401 Unauthorized</h1>"; //$D = word data type //$L = long data type //$S = c string //$F = progmem string //$E = byte from the eeprom. static word homePage() { bfill.emit_p(http_OK); bfill.emit_p(PSTR( "<tr><td>Температура:</td>" "<td>$S °C</td>" "<td>$S °C</td></tr>"), chartemp1, chartemp2); char* SSR1stat; if ( digitalRead(PinSSR1) == LOW ) { SSR1stat = "<font color=green><b>ВКЛ</b></font>" ; } else { SSR1stat = "<font color=red><b>ВЫКЛ</b></font>"; } char* SSR2stat; if ( digitalRead(PinSSR2) == LOW ) { SSR2stat = "<font color=green><b>ВКЛ</b></font>" ; } else { SSR2stat = "<font color=red><b>ВЫКЛ</b></font>"; } bfill.emit_p(PSTR("<tr><td>Обогрев:</td>" "<td>$S</td>" "<td>$S</td></tr><tr><td>Цель:</td>" ), SSR1stat, SSR2stat); if (Mode1 == 1) { bfill.emit_p(PSTR("<td>$D °C</td>"), TargetTemp1); } else { bfill.emit_p(PSTR("<td>-</td>")); } if (Mode2 == 1) { bfill.emit_p(PSTR("<td>$D °C</td>"), TargetTemp2); } else { bfill.emit_p(PSTR("<td>-</td>")); } bfill.emit_p(PSTR("</tr><tr><td>Установить:</td>")); if (Mode1 == 1) { bfill.emit_p(PSTR("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>")); } else { bfill.emit_p(PSTR("<td>-</td>")); } if (Mode2 == 1) { bfill.emit_p(PSTR("<td><form><input type=text name=ttemp2 size=10> <input type=submit value=ОК> </form></td>")); } else { bfill.emit_p(PSTR("<td>-</td>")); } bfill.emit_p(PSTR("</tr></table>" "</font></center></body></html>")); return bfill.position(); } void loop(void) { if(analogRead(pirPin2) > 500) { digitalWrite(PinSSR3, LOW); delay(50); } if(analogRead(pirPin2) < 500) { digitalWrite(PinSSR3, HIGH); delay(50); } if(analogRead(pirPin) > 500) { digitalWrite(PinSSR4, LOW); delay(50); } if(analogRead(pirPin) < 500) { digitalWrite(PinSSR4, HIGH); delay(50); } Serial.println(analogRead(pirPin)); temp1=tempread(sensor1); dtostrf(temp1, 4, 2, chartemp1); temp2=tempread(sensor2); dtostrf(temp2, 4, 2, chartemp2); if (Mode1 == 1) { if (temp1<TargetTemp1-1) { digitalWrite(PinSSR1, LOW); SSR1on = 1; } else if (temp1>TargetTemp1+1) { digitalWrite(PinSSR1, HIGH); SSR1on = 0; } } if (Mode2 == 1) { if (temp2<TargetTemp2-1) { digitalWrite(PinSSR2, LOW); SSR2on = 1; } else if (temp2>TargetTemp2+1){ digitalWrite(PinSSR2, HIGH); SSR2on = 0; } } word len = ether.packetReceive(); word pos = ether.packetLoop(len); if (pos) { bfill = ether.tcpOffset(); char *data = (char *) Ethernet::buffer + pos; if (strncmp("GET /", data, 5) != 0) { bfill.emit_p(http_Unauthorized); } else { data += 5; if (data[0] == ' ') { homePage(); } else if (strncmp( "?toggle1" , data, 8 ) == 0) { if (Mode1 == 0) { Mode1=1; EEPROM.write(0, Mode1); SSR1on = 0; bfill.emit_p(http_Found); } else { Mode1=0; EEPROM.write(0, Mode1); SSR1on = 0; bfill.emit_p(http_Found); } } else if (strncmp( "?toggle2" , data, 8 ) == 0) { if (Mode2 == 0) { Mode2=1; EEPROM.write(1, Mode2); SSR2on = 0; bfill.emit_p(http_Found); } else { Mode2=0; EEPROM.write(1, Mode2); SSR2on = 0; bfill.emit_p(http_Found); } } else if (strncmp( "?ttemp1=" , data , 8 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "ttemp1") > 0) { byte value = atoi(TargetTemperarureTextbox); // command to convert a string to number if ((value >=0) && (value <=100)) //if the temperature entered is within the range of 0-100 { TargetTemp1 = value; EEPROM.write(2, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?ttemp2=" , data , 8 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "ttemp2") > 0) { byte value = atoi(TargetTemperarureTextbox); // command to convert a string to number if ((value >=0) && (value <=100)) //if the temperature entered is within the range of 0-100 { TargetTemp2 = value; EEPROM.write(3, value); } } bfill.emit_p(http_Found); } } ether.httpServerReply(bfill.position()); } } float tempread(byte sensoraddr[]) // error codes: // -1 no sensors found // -2 invalid CRC // -3 not a DS1820 { byte i; byte present = 0; byte data[12]; byte addr[8]; //int HighByte, LowByte, TReading, SignBit, Tc_100, Tf_100, Whole, Fract; for ( i = 0; i < 8; i++) { addr[i]=sensoraddr[i]; } ds.reset(); // pulse the pins and wait for a response to reset the DS1820 ds.select(addr); // 0x55 (MATCH_ROM) followed by the address of the 1820 to talk to. // ds.write(0x44,1); // start conversion, with parasite power on at the end ds.write(0x44,0); //PARASITE POWER OFF // delay(800); present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; float temp = (float)raw / 16.0; return temp; }
Сейчас потребовалось добавить еще 2 датчика... Но, видимо, не хватает памяти((
Прошу у вас помощи в оптимизации кода:
/* * BlackSnow контроллер тёплого пола * v0.1a 09/03/2014 */ #include <EtherCard.h> // Библиотека для сетевой карты #include <OneWire.h> // Бибилиотека для датчика температуты D18B20 #include <EEPROM.h> // Библиотека энергонезависимой памяти static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // MAC адрес const byte PinTemp = 9; // Датчики Dallas DS18B20 Temperature Sensors const byte PinSSR1 = 3; // Реле Pin for SSR 1 const byte PinSSR2 = 4; // Реле Pin for SSR 2 const byte PinSSR3 = 5; // Реле Pin for SSR 3 const byte PinSSR4 = 6; const byte PinSSR5 = 7; const byte pirPin = 1; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; long unsigned int pause = 0; //Пауза, после которой движение считается оконченным //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime; char TargetTemperarureTextbox[10]; byte sensor1[8] = {0x28, 0x26, 0xBE, 0xC6, 0x02, 0x00, 0x00, 0x88}; // Адрес первого сенсора byte sensor2[8] = {0x28, 0x34, 0x96, 0xDD, 0x03, 0x00, 0x00, 0x7C}; // Адрес второго сенсора byte sensor3[8] = {0x28, 0x26, 0xBE, 0xC6, 0x02, 0x00, 0x00, 0x88}; // Адрес третьего сенсора byte sensor4[8] = {0x28, 0x34, 0x96, 0xDD, 0x03, 0x00, 0x00, 0x7C}; // Адрес четвертого сенсора float temp1; float temp2; float temp3; float temp4; char chartemp1[10]; char chartemp2[10]; char chartemp3[10]; char chartemp4[10]; /*char* page1; char* page2; char* page3; char* page4;*/ byte TargetTemp1; byte TargetTemp2; byte TargetTemp3; byte TargetTemp4; byte SSR1on = 0; // 0 is Off, 1 is On byte SSR2on = 1; // 0 is Off, 1 is On byte SSR3on = 1; // 0 is Off, 1 is On byte SSR4on = 1; // 0 is Off, 1 is On byte SSR5on = 1; // 0 is Off, 1 is On byte Ethernet::buffer[1120]; // if you increase the size of the HTML code you may need to increase the buffer size (or it will stop working) //TODO BufferFiller bfill; OneWire ds(PinTemp); // пин подключения термодатчика void setup () { Serial.begin(57600); Serial.println( "BlackSnow Heated floor"); pinMode(PinTemp, INPUT); pinMode(PinSSR1, OUTPUT); // sets the digital pin as input pinMode(PinSSR2, OUTPUT); // sets the digital pin as input pinMode(PinSSR3, OUTPUT); // sets the digital pin as input pinMode(PinSSR4, OUTPUT); // sets the digital pin as input pinMode(PinSSR5, OUTPUT); // sets the digital pin as input TargetTemp1 = EEPROM.read(1); TargetTemp2 = EEPROM.read(2); TargetTemp3 = EEPROM.read(3); TargetTemp3 = EEPROM.read(4); if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) Serial.println( "Failed to access Ethernet controller"); Serial.println("Setting up DHCP"); if (!ether.dhcpSetup()) Serial.println( "DHCP failed"); ether.printIp("My IP: ", ether.myip); ether.printIp("Netmask: ", ether.netmask); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); } const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n" "<!DOCTYPE html>" "<html><head>" "<meta http-equiv='refresh' content='120'/>" "<meta charset='utf-8'>" "<title>Тёплые полы</title>" "<body>" "<center><font size=\"4\">" "<table border=\"1\" cellpadding=\"5\" style=\"width: 600px; border-collapse: collapse; border: 1px solid black;\">"; /* "<tr style=\"background-color: silver\"><td>Помещение:</td>" "<td>Ванна</td>" "<td>Прихожая</td>" "<td>Зал</td></tr>" "<td>Кухня</td></tr>";*/ const char http_Found[] PROGMEM = "HTTP/1.0 302 Found\r\n" "Location: /\r\n\r\n"; const char http_Unauthorized[] PROGMEM = "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n\r\n" "<h1>401 Unauthorized</h1>"; //$D = word data type //$L = long data type //$S = c string //$F = progmem string //$E = byte from the eeprom. static word homePage() { bfill.emit_p(http_OK); bfill.emit_p(PSTR( "<tr><td>Температура:</td>" "<td>$S °C</td>" "<td>$S °C</td>" "<td>$S °C</td></tr>"), chartemp1, chartemp2, chartemp3, chartemp4); char* SSR1stat; if ( digitalRead(PinSSR1) == LOW ) { SSR1stat = "<font color=green><b>ВКЛ</b></font>" ; } else { SSR1stat = "<font color=red><b>ВЫКЛ</b></font>"; } char* SSR2stat; if ( digitalRead(PinSSR2) == LOW ) { SSR2stat = "<font color=green><b>ВКЛ</b></font>" ; } else { SSR2stat = "<font color=red><b>ВЫКЛ</b></font>"; } char* SSR3stat; if ( digitalRead(PinSSR3) == LOW ) { SSR3stat = "<font color=green><b>ВКЛ</b></font>" ; } else { SSR3stat = "<font color=red><b>ВЫКЛ</b></font>"; } char* SSR4stat; if ( digitalRead(PinSSR4) == LOW ) { SSR4stat = "<font color=green><b>ВКЛ</b></font>" ; } else { SSR4stat = "<font color=red><b>ВЫКЛ</b></font>"; } bfill.emit_p(PSTR("<tr><td>Обогрев:</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td></tr><tr><td>Цель:</td>" ), SSR1stat, SSR2stat, SSR3stat, SSR4stat); bfill.emit_p(PSTR("<td>$D °C</td>"), TargetTemp1); bfill.emit_p(PSTR("<td>$D °C</td>"), TargetTemp2); bfill.emit_p(PSTR("<td>$D °C</td>"), TargetTemp3); bfill.emit_p(PSTR("<td>$D °C</td>"), TargetTemp4); bfill.emit_p(PSTR("</tr><tr><td>Установить:</td>")); bfill.emit_p(PSTR("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=ttemp2 size=10> <input type=submit value=ОК> </form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=ttemp3 size=10> <input type=submit value=ОК> </form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=ttemp4 size=10> <input type=submit value=ОК> </form></td>")); bfill.emit_p(PSTR("</tr></table></font></center></body></html>")); return bfill.position(); } void loop(void) { if(analogRead(pirPin) > 500) { digitalWrite(PinSSR5, LOW); delay(50); } if(analogRead(pirPin) < 500) { digitalWrite(PinSSR5, HIGH); delay(50); } temp1=tempread(sensor1); dtostrf(temp1, 4, 2, chartemp1); temp2=tempread(sensor2); dtostrf(temp2, 4, 2, chartemp2); temp3=tempread(sensor3); dtostrf(temp3, 4, 2, chartemp3); temp4=tempread(sensor4); dtostrf(temp4, 4, 2, chartemp4); if (temp1<TargetTemp1-1) { digitalWrite(PinSSR1, LOW); SSR1on = 1; } else if (temp1>TargetTemp1+1) { digitalWrite(PinSSR1, HIGH); SSR1on = 0; } if (temp2<TargetTemp2-1) { digitalWrite(PinSSR2, LOW); SSR2on = 1; } else if (temp2>TargetTemp2+1){ digitalWrite(PinSSR2, HIGH); SSR2on = 0; } if (temp3<TargetTemp3-1) { digitalWrite(PinSSR3, LOW); SSR3on = 1; } else if (temp3>TargetTemp3+1){ digitalWrite(PinSSR3, HIGH); SSR3on = 0; } if (temp4<TargetTemp4-1) { digitalWrite(PinSSR4, LOW); SSR4on = 1; } else if (temp4>TargetTemp4+1){ digitalWrite(PinSSR4, HIGH); SSR4on = 0; } word len = ether.packetReceive(); word pos = ether.packetLoop(len); if (pos) { bfill = ether.tcpOffset(); char *data = (char *) Ethernet::buffer + pos; if (strncmp("GET /", data, 5) != 0) { bfill.emit_p(http_Unauthorized); } else { data += 5; if (data[0] == ' ') { homePage(); } else if (strncmp( "?ttemp1=" , data , 8 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "ttemp1") > 0) { byte value = atoi(TargetTemperarureTextbox); // command to convert a string to number if ((value >=0) && (value <=100)) //if the temperature entered is within the range of 0-100 { TargetTemp1 = value; EEPROM.write(1, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?ttemp2=" , data , 8 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "ttemp2") > 0) { byte value = atoi(TargetTemperarureTextbox); // command to convert a string to number if ((value >=0) && (value <=100)) //if the temperature entered is within the range of 0-100 { TargetTemp2 = value; EEPROM.write(2, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?ttemp3=" , data , 8 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "ttemp3") > 0) { byte value = atoi(TargetTemperarureTextbox); // command to convert a string to number if ((value >=0) && (value <=100)) //if the temperature entered is within the range of 0-100 { TargetTemp3 = value; EEPROM.write(3, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?ttemp4=" , data , 8 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "ttemp4") > 0) { byte value = atoi(TargetTemperarureTextbox); // command to convert a string to number if ((value >=0) && (value <=100)) //if the temperature entered is within the range of 0-100 { TargetTemp4 = value; EEPROM.write(4, value); } } bfill.emit_p(http_Found); } } ether.httpServerReply(bfill.position()); } } float tempread(byte sensoraddr[]) // error codes: // -1 no sensors found // -2 invalid CRC // -3 not a DS1820 { byte i; byte present = 0; byte data[12]; byte addr[8]; //int HighByte, LowByte, TReading, SignBit, Tc_100, Tf_100, Whole, Fract; for ( i = 0; i < 8; i++) { addr[i]=sensoraddr[i]; } ds.reset(); // pulse the pins and wait for a response to reset the DS1820 ds.select(addr); // 0x55 (MATCH_ROM) followed by the address of the 1820 to talk to. // ds.write(0x44,1); // start conversion, with parasite power on at the end ds.write(0x44,0); //PARASITE POWER OFF // delay(800); present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; float temp = (float)raw / 16.0; return temp; }
Основная проблема, видимо, здесь:
byte Ethernet::buffer[1120];
При увеличении размера - не хватает памяти, а при таком размере - не хватает места для html кода... Всё это на Arduino Nano
Кое-как получилось...
Посмотрим на сколько стабильно...
Спасибо, очень нужный проект! Как со стабильностью?
Последний код - офигенно работает, ни разу не перезагружал =)
а не мог бы ты объяснить начинающему что это за переменные:
//Время, в которое был принят сигнал отсутствия движения(LOW)
018
long
unsigned
int
lowIn;
019
long
unsigned
int
pause = 0;
//Пауза, после которой движение считается оконченным
020
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
021
boolean lockLow =
true
;
022
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
023
boolean takeLowTime;
и это
if
(analogRead(pirPin) > 500)
163
{
164
digitalWrite(PinSSR5, LOW);
165
delay(50);
166
}
167
168
if
(analogRead(pirPin) < 500)
169
{
170
digitalWrite(PinSSR5, HIGH);
171
delay(50);
172
}
А это датчик движения у меня там еще есть, свет в ванной включает-выключает =)
Проект достиг логического завершения, или есть развитие?
А смог бы кто переделать этот скетч под W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.
А смог бы кто переделать этот скетч под W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.
Это как, управление 8-ю устройствами по сети?
Было-б интересно, я ищу схему на устройство которое управляет 16-ю нагрузками по усб,
к компу включаюсь через Тайм Вьювер, можен есть более изящьное решение?
А смог бы кто переделать этот скетч под W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.
Выкладывай, в любом случае будет кому то полезным, я сейчас пытаюсь доработать скейтч для того чтобы можно было указывать отрицательные значения температур, может кто подскажет)
Это как, управление 8-ю устройствами по сети?
Да, терморегулирование 8ю нагрузками по сети. НО только при использовании Меги и ENC28J60.
Выкладывай, в любом случае будет кому то полезным, я сейчас пытаюсь доработать скейтч для того чтобы можно было указывать отрицательные значения температур, может кто подскажет)
А для каких целей такое нужно?
И напоминаю тем, кто будет использовать код: переименовывая наименования помещений, укладывайтесь в 1279 символов, включая пробелы, в HTML коде! Иначе скетч не будет работать.
А для каких целей такое нужно?
поддерживать отрицательную температуру на даче например -5...-10 когда на улице мороз -30.
НО только при использовании Меги и ENC28J60.
а я подумал что Вы соединили NANO и W5100 :)
укладывайтесь в 1279 символов
с чем связано данное ограничение? при использовании Mega такое же ограничение?
поддерживать отрицательную температуру на даче например -5...-10 когда на улице мороз -30.
с чем связано данное ограничение? при использовании Mega такое же ограничение?
А есть разница, -10 или -30 на даче??? минус, имхо, он и в африке минус.
Ограничение не в Меге, а в ENC. с чем связано не знаю. выяснил опытным путем. в библиотеке не нашел упоминания, но может плохо искал.
А есть разница, -10 или -30 на даче??? минус, имхо, он и в африке минус.
В Африке то дА, а когда греешь к выходным проще нагреть с -5...-10 чем с -30 ;)
В Африке то дА, а когда греешь к выходным проще нагреть с -5...-10 чем с -30 ;)
Ну так греть-то надо не до -10, а до положительных температур. (если я правильно логику понимаю). ну да не суть. Выяснил, что мой код (равно как и исходный) работает только с датчиками DS18B20. Если подсунуть DS18S20 показания будут не правильные. пытаюсь переделать код под всю серию этих датчиков. если у кого есть варианты куда копать - поделитесь, плз.
если у кого есть варианты куда копать - поделитесь, плз.
может сюда http://research.andbas.com/2012/02/1-wire-ds18s20.html
вот мой код под два датчика DHT11 и два 18B20 -
вот мой код под два датчика DHT11 и два 18B20 -
вот мой код под два датчика DHT11 и два 18B20 -
Так у меня как раз с DS18B20 все работает нормально. не работает с DS18S20
У S20 код 0x10, а не 0x28, как у B20.
У S20 код 0x10, а не 0x28, как у B20.
Код с 8ю B20 я приводил выше. он работает нормально. если вместо одного из восьми В20 поставить S20 (с изменением адреса разумеется), то температура показывается неправильно.
В итоге удалось победить и эту проблему. Код будет работать с датчиками B20 и S20. Кому понадобится - забирайте:
Ого спасибо ща попробуем!
Подключил датчики DHT21 вместо нормально работающих DHT11, отображается NAN, уже все перепробывал, может кто поможет разобраться?
Подключил датчики DHT21 вместо нормально работающих DHT11, отображается NAN, уже все перепробывал, может кто поможет разобраться?
строка #28, #29 в скетче
Подключил датчики DHT21 вместо нормально работающих DHT11, отображается NAN, уже все перепробывал, может кто поможет разобраться?
строка #28, #29 в скетче
не все так просто, к сожалению)
резистор на вывод data и 5v 1К поставьте
резистор на вывод data и 5v 1К поставьте
Пробовал, спасибо. В тестовом скетче все нормально отображается, думаю проблема в виде данных которые идут с датчика
Разобрался, проблема была создана мною же, еще когда "причесывал" скетч, а именно переменные "temp" изменил на локальные для освобождения памяти, ну и пришлось методом тыка подобрать размер буффера в строке: byte Ethernet::buffer[1280]. Теперь все работает как надо.
Здравствуйте. Кто может добавить в скетч упраление 8 реле, вкючать выключать, как описано в этом видео? http://www.youtube.com/watch?v=PPB2Xvubt4s
Здравствуйте. Кто может добавить в скетч упраление 8 реле, вкючать выключать, как описано в этом видео? http://www.youtube.com/watch?v=PPB2Xvubt4s
Если вы имеете ввиду объединение обеих скетчей, я думаю возникнут проблемы с размером программы, а именно с глобальнимы переменнаями, сейчас попробую добавить хотя бы управление одним реле.
добавлено в 9:52
у меня не вышло, после добавления на веб-страницу ссылки даже одного реле страничка не открывается, на меге думаю будет нормально работать, а уно/нано уж больно мало памяти имеют для работы с данным шилдом.
Можете скинуть, что получило для Мега? Спасибо.
Подскажите можно поменять дельту на влючение и на выключение 0.5 градуса, сейчас стоит 2 градуса, дом сильно остывает.
Можете скинуть, что получило для Мега? Спасибо.
Кому адресован вопрос?
А может html вынести на SD карту?
2BlackSnow генератор HTML кода выполнен неудачно, для создания другой странички нужно переписывать половину проекта. HTML код порван на мелкие кусочки, с целью вставки в него значений. Я в таком случае размещаю HTML страничку не кусочками, а целиком, в нужных местах вставляю свои теги. Во время выдачи странички просматриваю её на предмет моих тегов, и в этот момент заменяю теги значениями.
И в качестве идеи. Страничка выглядит красивее с использованием картинок, стилей, скриптов. Что бы не заморачиваться их хранением в ардуине, их можно разместить на внешнем ресурсе. Тогда браузер, закачав HTML страничку с ардуинки, подгрузит картинки, стили, скрипты с внешнего ресурса.
Как вариант, можно вообще всю страничку разместить на внешнем ресурсе, а в ардуинке только значения параметров.
html на карте наверное возможно.
Я думаю основная проблемма будет с величиной буфера ( RAM )
Хотя ведь уже сделали, нет времени посмотреть эту сказку.....
http://geektimes.ru/post/260682/
http://forum.amperka.ru/threads/arduino-mega-server.6850/
2BlackSnow генератор HTML кода выполнен неудачно, для создания другой странички нужно переписывать половину проекта. HTML код порван на мелкие кусочки, с целью вставки в него значений. Я в таком случае размещаю HTML страничку не кусочками, а целиком, в нужных местах вставляю свои теги. Во время выдачи странички просматриваю её на предмет моих тегов, и в этот момент заменяю теги значениями.
Займитесь ;) Я не ас в программировании, скетч стырен с какого-то иностранного сайта и подправлен для моих целей ;)
И в качестве идеи. Страничка выглядит красивее с использованием картинок, стилей, скриптов. Что бы не заморачиваться их хранением в ардуине, их можно разместить на внешнем ресурсе. Тогда браузер, закачав HTML страничку с ардуинки, подгрузит картинки, стили, скрипты с внешнего ресурса.
Как вариант, можно вообще всю страничку разместить на внешнем ресурсе, а в ардуинке только значения параметров.
Плохая идея, это устройство все-в-одном и не нужно его разделять, да и далеко не у всех есть внешний ресурс...
1
byte
Ethernet::buffer[1120];
При увеличении размера - не хватает памяти, а при таком размере - не хватает места для html кода... Всё это на Arduino Nano
Как заметили выше - вебстраницы сжирают драгоценную память в таких слабых микроконтроллерах - для вебсервера можно взять какой нибудь планшет на андроиде, а ардуинам оставить только основную рабочую логику - а все настройки выполнять через веб-запросы.
Планшет и компьюте это не надёжно, сегодня он работает завтра нет и т.д. В чём пороблема всять МЕГА там памяти хватит.
Посмотрите на мой проект
http://robocraft.ru/blog/3126.html
Все странички на sd карте.
Основано на библиотеке arduino tiny web server.
Сейчас уже есть вторая версия, в которой добавлено кое-что новое и оптимизирован немного код.
По ссылке из статьи есть папка V2.0
Web морду можно переписывать без компиляции скетча.
Планшет и компьюте это не надёжно, сегодня он работает завтра нет и т.д. В чём пороблема всять МЕГА там памяти хватит.
А мега надежней планшета???
Тоже делал сервер на меге, но... код такой грамоздкий получается. В итоге сделал управление и с планшета по блютузу и с удаленного сервера с красивым интерфейсом и динамическим обнавлением.
GraninDm,
что-то ваш проект не захотел компилироваться - выдаёт ошибки
armlive,
можно взглянуть на ваш проект?
Вот аналогично http://cxem.net/arduino/arduino174.php
Какие ошибки?
Вы все библиотеки установили?
Желательно вторую версию компилировать
Security000
Долго не мог победить.
Пока не установил библиотеку отсюда:
https://github.com/jcw/ethercard.git
После этого завелось
Это для кого сообщение?
Переделка скетча под W5100 застопорилась на моменте ввода требуемой температуры. Выкладываю то, что есть на данный момент, вдруг кто поможет довести до конца. Скетч переделывается путем "подгона" старого, под новую сетевуху.
Переделка скетча под W5100 застопорилась на моменте ввода требуемой температуры. Выкладываю то, что есть на данный момент, вдруг кто поможет довести до конца. Скетч переделывается путем "подгона" старого, под новую сетевуху.
Тоже застопорился, не знаю как из формы ввода требуемой температуры вытащить переменную. Может поднимем тему и кто то знающий подскажет как это делать.
Переделка скетча под W5100 застопорилась на моменте ввода требуемой температуры. Выкладываю то, что есть на данный момент, вдруг кто поможет довести до конца. Скетч переделывается путем "подгона" старого, под новую сетевуху.
Тоже застопорился, не знаю как из формы ввода требуемой температуры вытащить переменную. Может поднимем тему и кто то знающий подскажет как это делать.
Всё просто: надо у тэга FORM описать атрибуты TARGET и METHOD, чтобы браузер знал, куда и каким методом засунуть данные, введённые пользователем. Затем - при отправке формы по кнопке <input type="submit"...> на URI, указанный в TARGET, методом, указанном в METHOD, придут данные, закодированные в соответствии с указанием кодировки, это описывается аттрибутом ENCTYPE формы. Принимаете HTTP-запрос для этого URI, разбираете переданные значения, декодируете их, если потребуется - и вуаля: вы получили значение, введённое пользователем.
Есть такой чудный RFC по HTTP - советую ознакомиться хотя бы с основами.
З.Ы. А код, что вы привели - в помойку. Память ардуине ещё не жмёт? Не волнуйтесь - скоро начнёт давить в талии, и тогда - жопа.