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
Кое-как получилось...
Посмотрим на сколько стабильно...
/* * контроллер тёплого пола */ #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]; byte TargetTemp1; byte TargetTemp2; byte TargetTemp3; byte TargetTemp4; byte SSR1on = 0; // 0 is Off, 1 is On byte SSR2on = 0; // 0 is Off, 1 is On byte SSR3on = 0; // 0 is Off, 1 is On byte SSR4on = 0; // 0 is Off, 1 is On byte Ethernet::buffer[1420]; // 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 () { 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(0); TargetTemp2 = EEPROM.read(2); TargetTemp3 = EEPROM.read(4); TargetTemp4 = EEPROM.read(6); ether.begin(sizeof Ethernet::buffer, mymac, 10); ether.dhcpSetup(); } 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: 800px; border-collapse: collapse; border: 1px solid black;\">" "<tr style=\"background-color: silver\"><td>Помещение:</td>" "<td>Ванна</td>" "<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>" "<td>$S °C</td>" "<td>$S °C</td></tr>"), chartemp1, chartemp2, chartemp3, chartemp4); bfill.emit_p(PSTR("<tr><td>Обогрев:</td>")); if ( digitalRead(PinSSR1) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR2) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR3) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR4) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } bfill.emit_p(PSTR("</tr><tr><td>Цель:</td>")); 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); } Serial.println(analogRead(pirPin)); 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(0, 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(4, 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(6, 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; }Спасибо, очень нужный проект! Как со стабильностью?
Последний код - офигенно работает, ни разу не перезагружал =)
а не мог бы ты объяснить начинающему что это за переменные:
//Время, в которое был принят сигнал отсутствия движения(LOW)018longunsignedintlowIn;019longunsignedintpause = 0;//Пауза, после которой движение считается оконченным020//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет021boolean lockLow =true;022//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения023boolean takeLowTime;и это
if(analogRead(pirPin) > 500)163{164digitalWrite(PinSSR5, LOW);165delay(50);166}167168if(analogRead(pirPin) < 500)169{170digitalWrite(PinSSR5, HIGH);171delay(50);172}А это датчик движения у меня там еще есть, свет в ванной включает-выключает =)
Проект достиг логического завершения, или есть развитие?
А смог бы кто переделать этот скетч под W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.
А смог бы кто переделать этот скетч под W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.
Это как, управление 8-ю устройствами по сети?
Было-б интересно, я ищу схему на устройство которое управляет 16-ю нагрузками по усб,
к компу включаюсь через Тайм Вьювер, можен есть более изящьное решение?
А смог бы кто переделать этот скетч под W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.
Выкладывай, в любом случае будет кому то полезным, я сейчас пытаюсь доработать скейтч для того чтобы можно было указывать отрицательные значения температур, может кто подскажет)
Это как, управление 8-ю устройствами по сети?
Да, терморегулирование 8ю нагрузками по сети. НО только при использовании Меги и ENC28J60.
#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 = 31; // Реле Pin for SSR 1 const byte PinSSR2 = 33; // Реле Pin for SSR 2 const byte PinSSR3 = 35; // Реле Pin for SSR 3 const byte PinSSR4 = 37; // Реле Pin for SSR 4 const byte PinSSR5 = 39; // Реле Pin for SSR 5 const byte PinSSR6 = 41; // Реле Pin for SSR 6 const byte PinSSR7 = 43; // Реле Pin for SSR 7 const byte PinSSR8 = 45; // Реле Pin for SSR 8 char TargetTemperarureTextbox[10]; byte sensor1[8] = {0x28, 0xFF, 0xE0, 0x8C, 0x11, 0x14, 0x00, 0x6F}; // Адрес первого сенсора byte sensor2[8] = {0x28, 0xFF, 0xAE, 0x92, 0x10, 0x14, 0x00, 0xA2}; // Адрес второго сенсора byte sensor3[8] = {0x28, 0xFF, 0xC9, 0x4D, 0x11, 0x14, 0x00, 0xD2}; // Адрес третьего сенсора byte sensor4[8] = {0x28, 0xFF, 0xE7, 0x8C, 0x11, 0x14, 0x00, 0x3E}; // Адрес четвертого сенсора byte sensor5[8] = {0x28, 0xFF, 0xB2, 0x48, 0x11, 0x14, 0x00, 0x4E}; // Адрес пятого сенсора byte sensor6[8] = {0x28, 0xFF, 0x6A, 0xD4, 0x10, 0x14, 0x00, 0x76}; // Адрес шестого сенсора byte sensor7[8] = {0x28, 0xFF, 0x9E, 0x8A, 0x11, 0x14, 0x00, 0xA9}; // Адрес седьмого сенсора byte sensor8[8] = {0x28, 0xFF, 0xEB, 0x8B, 0x10, 0x14, 0x00, 0x32}; // Адрес восьмого сенсора float temp1; float temp2; float temp3; float temp4; float temp5; float temp6; float temp7; float temp8; char chartemp1[10]; char chartemp2[10]; char chartemp3[10]; char chartemp4[10]; char chartemp5[10]; char chartemp6[10]; char chartemp7[10]; char chartemp8[10]; byte TargetTemp1; byte TargetTemp2; byte TargetTemp3; byte TargetTemp4; byte TargetTemp5; byte TargetTemp6; byte TargetTemp7; byte TargetTemp8; byte SSR1on = 0; // 0 is Off, 1 is On byte SSR2on = 0; // 0 is Off, 1 is On byte SSR3on = 0; // 0 is Off, 1 is On byte SSR4on = 0; // 0 is Off, 1 is On byte SSR5on = 0; // 0 is Off, 1 is On byte SSR6on = 0; // 0 is Off, 1 is On byte SSR7on = 0; // 0 is Off, 1 is On byte SSR8on = 0; // 0 is Off, 1 is On byte Ethernet::buffer[1600]; // 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 () { 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 pinMode(PinSSR6, OUTPUT); // sets the digital pin as input pinMode(PinSSR7, OUTPUT); // sets the digital pin as input pinMode(PinSSR8, OUTPUT); // sets the digital pin as input TargetTemp1 = EEPROM.read(0); TargetTemp2 = EEPROM.read(2); TargetTemp3 = EEPROM.read(4); TargetTemp4 = EEPROM.read(6); TargetTemp5 = EEPROM.read(20); TargetTemp6 = EEPROM.read(22); TargetTemp7 = EEPROM.read(24); TargetTemp8 = EEPROM.read(26); ether.begin(sizeof Ethernet::buffer, mymac, 53); ether.dhcpSetup(); } 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" "<html><head>" "<meta http-equiv='refresh' content='120'/>" "<meta charset='utf-8'>" "<title>Control</title>" "<body>" "<table border>" "<tr><td>Прихожая</td>" "<td>Спальня</td>" "<td>Гостевая</td>" "<td>Детская</td>" "<td>Зал</td>" "<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>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td></tr>"), chartemp1, chartemp2, chartemp3, chartemp4, chartemp5, chartemp6, chartemp7, chartemp8); bfill.emit_p(PSTR("<tr>")); if ( digitalRead(PinSSR1) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR2) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR3) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR4) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR5) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR6) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR7) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR8) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } bfill.emit_p(PSTR("</tr><tr>")); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp1); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp2); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp3); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp4); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp5); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp6); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp7); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp8); bfill.emit_p(PSTR("</tr><tr>")); 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=t2 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t3 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t4 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t5 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t6 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t7 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t8 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("</tr></table>" "</body></html>")); return bfill.position(); } void loop(void) { 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); temp5=tempread(sensor5); dtostrf(temp5, 4, 2, chartemp5); temp6=tempread(sensor6); dtostrf(temp6, 4, 2, chartemp6); temp7=tempread(sensor7); dtostrf(temp7, 4, 2, chartemp7); temp8=tempread(sensor8); dtostrf(temp8, 4, 2, chartemp8); if (temp1<TargetTemp1-0.5) { digitalWrite(PinSSR1, LOW); SSR1on = 1; } else if (temp1>TargetTemp1+0.5) { digitalWrite(PinSSR1, HIGH); SSR1on = 0; } if (temp2<TargetTemp2-0.5) { digitalWrite(PinSSR2, LOW); SSR2on = 1; } else if (temp2>TargetTemp2+0.5){ digitalWrite(PinSSR2, HIGH); SSR2on = 0; } if (temp3<TargetTemp3-0.5) { digitalWrite(PinSSR3, LOW); SSR3on = 1; } else if (temp3>TargetTemp3+0.5){ digitalWrite(PinSSR3, HIGH); SSR3on = 0; } if (temp4<TargetTemp4-0.5) { digitalWrite(PinSSR4, LOW); SSR4on = 1; } else if (temp4>TargetTemp4+0.5){ digitalWrite(PinSSR4, HIGH); SSR4on = 0; } if (temp5<TargetTemp5-0.5) { digitalWrite(PinSSR5, LOW); SSR5on = 1; } else if (temp5>TargetTemp5+0.5){ digitalWrite(PinSSR5, HIGH); SSR5on = 0; } if (temp6<TargetTemp6-0.5) { digitalWrite(PinSSR6, LOW); SSR6on = 1; } else if (temp6>TargetTemp6+0.5){ digitalWrite(PinSSR6, HIGH); SSR6on = 0; } if (temp7<TargetTemp7-0.5) { digitalWrite(PinSSR7, LOW); SSR7on = 1; } else if (temp7>TargetTemp7+0.5){ digitalWrite(PinSSR7, HIGH); SSR7on = 0; } if (temp8<TargetTemp8-0.5) { digitalWrite(PinSSR8, LOW); SSR8on = 1; } else if (temp8>TargetTemp8+0.5){ digitalWrite(PinSSR8, HIGH); SSR8on = 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( "?t1=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t1") > 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(0, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t2=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t2") > 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( "?t3=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t3") > 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(4, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t4=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t4") > 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(6, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t5=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t5") > 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 { TargetTemp5 = value; EEPROM.write(20, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t6=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t6") > 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 { TargetTemp6 = value; EEPROM.write(22, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t7=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t7") > 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 { TargetTemp7 = value; EEPROM.write(24, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t8=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t8") > 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 { TargetTemp8 = value; EEPROM.write(26, 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; }Выкладывай, в любом случае будет кому то полезным, я сейчас пытаюсь доработать скейтч для того чтобы можно было указывать отрицательные значения температур, может кто подскажет)
А для каких целей такое нужно?
И напоминаю тем, кто будет использовать код: переименовывая наименования помещений, укладывайтесь в 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 -
//my #include <EtherCard.h> #include <EEPROM.h> #include "DHT.h" #include <OneWire.h> static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 10,16,30,2 }; static byte gwip[] = { 10,16,30,3 }; byte Ethernet::buffer[1280]; // BufferFiller bfill; const byte PinSSR1 = 2; // Реле Pin for SSR 1 const byte PinSSR2 = 3; // Реле Pin for SSR 2 const byte PinSSR3 = 4; // Реле Pin for SSR 3 char chartemp1[10]; char chartemp2[10]; char chartemp3[10]; char chartemp4[10]; int TargetTemp1; int TargetTemp2; int TargetTemp3; OneWire ds(9); DHT dht1(A0, DHT11); DHT dht2(A1, DHT11); void setup () { if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0); //на 10-ый пин подключен CS ether.staticSetup(myip); pinMode(PinSSR1, OUTPUT); pinMode(PinSSR2, OUTPUT); pinMode(PinSSR3, OUTPUT); TargetTemp1 = EEPROM.read(0); TargetTemp2 = EEPROM.read(2); TargetTemp3 = EEPROM.read(4); dht1.begin(); dht2.begin(); } 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: 800px; border-collapse: collapse; border: 1px solid black; align: center;\">" "<tr style=\"background-color: silver\"><td>Помещение:</td>" "<td>1 этаж:</td>" "<td>2 этаж:</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>" "<td>$S °C</td>" "<td>$S °C</td></tr>"), chartemp1, chartemp2, chartemp3, chartemp4 ); bfill.emit_p(PSTR("<tr><td>Обогрев:</td>")); if ( digitalRead(PinSSR1) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR2) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR3) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td></tr>")); } bfill.emit_p(PSTR("<tr><td>Цель:</td>")); 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></tr>"), TargetTemp3); bfill.emit_p(PSTR("<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></tr>")); bfill.emit_p(PSTR("</table>" "</font></center></body></html>")); return bfill.position(); } void loop(void) { float temp1; float temp2; float temp3; float temp4; char TargetTemperarureTextbox[10]; byte sensor1[8] = {0x28, 0xDF, 0x7E, 0xDC, 0x06, 0x00, 0x00, 0xF3}; // Адрес сенсора byte sensor2[8] = {0x28, 0xE5, 0x57, 0xB5, 0x06, 0x00, 0x00, 0xD9}; // Адрес сенсора //DHT temp1=dht1.readTemperature(); dtostrf(temp1, 4, 2, chartemp1); temp2=dht2.readTemperature(); dtostrf(temp2, 4, 2, chartemp2); //DS18B20 temp3=tempread(sensor1); dtostrf(temp3, 4, 2, chartemp3); temp4=tempread(sensor2); dtostrf(temp4, 4, 2, chartemp4); if (temp1<TargetTemp1-1) { digitalWrite(PinSSR1, LOW); } else if (temp1>TargetTemp1+1) { digitalWrite(PinSSR1, HIGH); } if (temp2<TargetTemp2-1) { digitalWrite(PinSSR2, LOW); } else if (temp2>TargetTemp2+1) { digitalWrite(PinSSR2, HIGH); } if (temp3<TargetTemp3-1) { digitalWrite(PinSSR3, LOW); } else if (temp3>TargetTemp3+1) { digitalWrite(PinSSR3, HIGH); } 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(0, 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(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; }вот мой код под два датчика DHT11 и два 18B20 -
вот мой код под два датчика DHT11 и два 18B20 -
Так у меня как раз с DS18B20 все работает нормально. не работает с DS18S20У S20 код 0x10, а не 0x28, как у B20.
У S20 код 0x10, а не 0x28, как у B20.
Код с 8ю B20 я приводил выше. он работает нормально. если вместо одного из восьми В20 поставить S20 (с изменением адреса разумеется), то температура показывается неправильно.
#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 = 31; // Реле Pin for SSR 1 const byte PinSSR2 = 33; // Реле Pin for SSR 2 const byte PinSSR3 = 35; // Реле Pin for SSR 3 const byte PinSSR4 = 37; // Реле Pin for SSR 4 const byte PinSSR5 = 39; // Реле Pin for SSR 5 const byte PinSSR6 = 41; // Реле Pin for SSR 6 const byte PinSSR7 = 43; // Реле Pin for SSR 7 const byte PinSSR8 = 45; // Реле Pin for SSR 8 char TargetTemperarureTextbox[10]; byte sensor1[8] = {0x28, 0xFF, 0xE0, 0x8C, 0x11, 0x14, 0x00, 0x6F}; // Адрес первого сенсора byte sensor2[8] = {0x28, 0xFF, 0xAE, 0x92, 0x10, 0x14, 0x00, 0xA2}; // Адрес второго сенсора byte sensor3[8] = {0x28, 0xFF, 0xC9, 0x4D, 0x11, 0x14, 0x00, 0xD2}; // Адрес третьего сенсора byte sensor4[8] = {0x28, 0xFF, 0xE7, 0x8C, 0x11, 0x14, 0x00, 0x3E}; // Адрес четвертого сенсора byte sensor5[8] = {0x28, 0xFF, 0xB2, 0x48, 0x11, 0x14, 0x00, 0x4E}; // Адрес пятого сенсора byte sensor6[8] = {0x28, 0xFF, 0x6A, 0xD4, 0x10, 0x14, 0x00, 0x76}; // Адрес шестого сенсора byte sensor7[8] = {0x28, 0xFF, 0x9E, 0x8A, 0x11, 0x14, 0x00, 0xA9}; // Адрес седьмого сенсора byte sensor8[8] = {0x28, 0xFF, 0xEB, 0x8B, 0x10, 0x14, 0x00, 0x32}; // Адрес восьмого сенсора float temp1; float temp2; float temp3; float temp4; float temp5; float temp6; float temp7; float temp8; char chartemp1[10]; char chartemp2[10]; char chartemp3[10]; char chartemp4[10]; char chartemp5[10]; char chartemp6[10]; char chartemp7[10]; char chartemp8[10]; byte TargetTemp1; byte TargetTemp2; byte TargetTemp3; byte TargetTemp4; byte TargetTemp5; byte TargetTemp6; byte TargetTemp7; byte TargetTemp8; byte SSR1on = 0; // 0 is Off, 1 is On byte SSR2on = 0; // 0 is Off, 1 is On byte SSR3on = 0; // 0 is Off, 1 is On byte SSR4on = 0; // 0 is Off, 1 is On byte SSR5on = 0; // 0 is Off, 1 is On byte SSR6on = 0; // 0 is Off, 1 is On byte SSR7on = 0; // 0 is Off, 1 is On byte SSR8on = 0; // 0 is Off, 1 is On byte Ethernet::buffer[1600]; // 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 () { 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 pinMode(PinSSR6, OUTPUT); // sets the digital pin as input pinMode(PinSSR7, OUTPUT); // sets the digital pin as input pinMode(PinSSR8, OUTPUT); // sets the digital pin as input TargetTemp1 = EEPROM.read(0); TargetTemp2 = EEPROM.read(2); TargetTemp3 = EEPROM.read(4); TargetTemp4 = EEPROM.read(6); TargetTemp5 = EEPROM.read(20); TargetTemp6 = EEPROM.read(22); TargetTemp7 = EEPROM.read(24); TargetTemp8 = EEPROM.read(26); ether.begin(sizeof Ethernet::buffer, mymac, 53); ether.dhcpSetup(); } 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" "<html><head>" "<meta http-equiv='refresh' content='120'/>" "<meta charset='utf-8'>" "<title>Control</title>" "<body>" "<table border>" "<tr><td>Прихожая</td>" "<td>Спальня</td>" "<td>Гостевая</td>" "<td>Детская</td>" "<td>Зал</td>" "<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>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td>" "<td>$S</td></tr>"), chartemp1, chartemp2, chartemp3, chartemp4, chartemp5, chartemp6, chartemp7, chartemp8); bfill.emit_p(PSTR("<tr>")); if ( digitalRead(PinSSR1) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR2) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR3) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR4) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR5) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR6) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR7) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } if ( digitalRead(PinSSR8) == LOW ) { bfill.emit_p(PSTR("<td>On</td>")); } else { bfill.emit_p(PSTR("<td>Off</td>")); } bfill.emit_p(PSTR("</tr><tr>")); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp1); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp2); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp3); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp4); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp5); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp6); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp7); bfill.emit_p(PSTR("<td>$D</td>"), TargetTemp8); bfill.emit_p(PSTR("</tr><tr>")); 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=t2 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t3 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t4 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t5 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t6 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t7 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("<td><form><input type=text name=t8 size=10><input type=submit value=ОК></form></td>")); bfill.emit_p(PSTR("</tr></table>" "</body></html>")); return bfill.position(); } void loop(void) { 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); temp5=tempread(sensor5); dtostrf(temp5, 4, 2, chartemp5); temp6=tempread(sensor6); dtostrf(temp6, 4, 2, chartemp6); temp7=tempread(sensor7); dtostrf(temp7, 4, 2, chartemp7); temp8=tempread(sensor8); dtostrf(temp8, 4, 2, chartemp8); if (temp1<TargetTemp1-0.5) { digitalWrite(PinSSR1, LOW); SSR1on = 1; } else if (temp1>TargetTemp1+0.5) { digitalWrite(PinSSR1, HIGH); SSR1on = 0; } if (temp2<TargetTemp2-0.5) { digitalWrite(PinSSR2, LOW); SSR2on = 1; } else if (temp2>TargetTemp2+0.5){ digitalWrite(PinSSR2, HIGH); SSR2on = 0; } if (temp3<TargetTemp3-0.5) { digitalWrite(PinSSR3, LOW); SSR3on = 1; } else if (temp3>TargetTemp3+0.5){ digitalWrite(PinSSR3, HIGH); SSR3on = 0; } if (temp4<TargetTemp4-0.5) { digitalWrite(PinSSR4, LOW); SSR4on = 1; } else if (temp4>TargetTemp4+0.5){ digitalWrite(PinSSR4, HIGH); SSR4on = 0; } if (temp5<TargetTemp5-0.5) { digitalWrite(PinSSR5, LOW); SSR5on = 1; } else if (temp5>TargetTemp5+0.5){ digitalWrite(PinSSR5, HIGH); SSR5on = 0; } if (temp6<TargetTemp6-0.5) { digitalWrite(PinSSR6, LOW); SSR6on = 1; } else if (temp6>TargetTemp6+0.5){ digitalWrite(PinSSR6, HIGH); SSR6on = 0; } if (temp7<TargetTemp7-0.5) { digitalWrite(PinSSR7, LOW); SSR7on = 1; } else if (temp7>TargetTemp7+0.5){ digitalWrite(PinSSR7, HIGH); SSR7on = 0; } if (temp8<TargetTemp8-0.5) { digitalWrite(PinSSR8, LOW); SSR8on = 1; } else if (temp8>TargetTemp8+0.5){ digitalWrite(PinSSR8, HIGH); SSR8on = 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( "?t1=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t1") > 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(0, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t2=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t2") > 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( "?t3=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t3") > 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(4, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t4=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t4") > 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(6, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t5=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t5") > 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 { TargetTemp5 = value; EEPROM.write(20, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t6=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t6") > 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 { TargetTemp6 = value; EEPROM.write(22, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t7=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t7") > 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 { TargetTemp7 = value; EEPROM.write(24, value); } } bfill.emit_p(http_Found); } else if (strncmp( "?t8=" , data , 4 ) == 0) { if (ether.findKeyVal(data + 1, TargetTemperarureTextbox , sizeof TargetTemperarureTextbox , "t8") > 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 { TargetTemp8 = value; EEPROM.write(26, 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]; if (sensoraddr[0] == 0x10) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } float temp = (float)raw / 16.0; return temp; }В итоге удалось победить и эту проблему. Код будет работать с датчиками 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]. Теперь все работает как надо.
//WEB_SERVER_ENC28_2-DHT21_2-18B20 #include <EtherCard.h> #include <EEPROM.h> #include "DHT.h" #include <OneWire.h> static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 10,16,30,2 }; static byte gwip[] = { 10,16,30,3 }; byte Ethernet::buffer[1280]; // BufferFiller bfill; const byte PinSSR1 = 2; // Реле 1 const byte PinSSR2 = 3; // Реле 2 const byte PinSSR3 = 4; // Реле 3 char chartemp1[10]; char chartemp2[10]; char chartemp3[10]; char chartemp4[10]; int TargetTemp1; int TargetTemp2; int TargetTemp3; float temp1; float temp2; OneWire ds(9); DHT dht1(7, DHT21); DHT dht2(8, DHT21); void setup () { if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0); //на 10-ый пин подключен CS ether.staticSetup(myip); pinMode(PinSSR1, OUTPUT); pinMode(PinSSR2, OUTPUT); pinMode(PinSSR3, OUTPUT); TargetTemp1 = EEPROM.read(0); TargetTemp2 = EEPROM.read(2); TargetTemp3 = EEPROM.read(4); dht1.begin(); dht2.begin(); } 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: 800px; border-collapse: collapse; border: 1px solid black; align: center;\">" "<tr style=\"background-color: silver\"><td>Помещение:</td>" "<td>1 этаж:</td>" "<td>2 этаж:</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>" "<td>$S °C</td>" "<td>$S °C</td></tr>"), chartemp1, chartemp2, chartemp3, chartemp4 ); bfill.emit_p(PSTR("<tr><td>Обогрев:</td>")); if ( digitalRead(PinSSR1) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR2) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td>")); } if ( digitalRead(PinSSR3) == LOW ) { bfill.emit_p(PSTR("<td><font color=green><b>ВКЛ</b></font></td>")); } else { bfill.emit_p(PSTR("<td><font color=red><b>ВЫКЛ</b></font></td></tr>")); } bfill.emit_p(PSTR("<tr><td>Цель:</td>")); 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></tr>"), TargetTemp3); bfill.emit_p(PSTR("<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></tr>")); bfill.emit_p(PSTR("</table>" "</font></center></body></html>")); return bfill.position(); } void loop(void) { float temp3; float temp4; char TargetTemperarureTextbox[10]; byte sensor1[8] = {0x28, 0xFF, 0x34, 0x2C, 0x50, 0x15, 0x01, 0x87}; // Адрес сенсора byte sensor2[8] = {0x28, 0xDF, 0x7E, 0xDC, 0x06, 0x00, 0x00, 0xF3}; // Адрес сенсора //DHT temp1 = dht1.readTemperature(); dtostrf(temp1, 4, 2, chartemp1); temp2 = dht2.readTemperature(); dtostrf(temp2, 4, 2, chartemp2); //DS18B20 temp3 = tempread(sensor1); dtostrf(temp3, 4, 2, chartemp3); temp4 = tempread(sensor2); dtostrf(temp4, 4, 2, chartemp4); if (temp1<TargetTemp1-1) { digitalWrite(PinSSR1, LOW); } else if (temp1>TargetTemp1+1) { digitalWrite(PinSSR1, HIGH); } if (temp2<TargetTemp2-1) { digitalWrite(PinSSR2, LOW); } else if (temp2>TargetTemp2+1) { digitalWrite(PinSSR2, HIGH); } if (temp3<TargetTemp3-1) { digitalWrite(PinSSR3, LOW); } else if (temp3>TargetTemp3+1) { digitalWrite(PinSSR3, HIGH); } 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(0, 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(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; }Здравствуйте. Кто может добавить в скетч упраление 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 страничку с ардуинки, подгрузит картинки, стили, скрипты с внешнего ресурса.
Как вариант, можно вообще всю страничку разместить на внешнем ресурсе, а в ардуинке только значения параметров.
Плохая идея, это устройство все-в-одном и не нужно его разделять, да и далеко не у всех есть внешний ресурс...
1byteEthernet::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 - советую ознакомиться хотя бы с основами.
З.Ы. А код, что вы привели - в помойку. Память ардуине ещё не жмёт? Не волнуйтесь - скоро начнёт давить в талии, и тогда - жопа.