Web-сервер на arduino с контроллером температуры.

BlackSnow
Offline
Зарегистрирован: 16.08.2015

Что получилось:

Данные брал из интернета, сам в программировании не силен((

В основном отсюда источник: 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 &deg;C</td>"
  "<td>$S &deg;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 &deg;C</td>"), TargetTemp1);
  }
  else {
    bfill.emit_p(PSTR("<td>-</td>"));
  }  
  if (Mode2 == 1) {
      bfill.emit_p(PSTR("<td>$D &deg;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 &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;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 &deg;C</td>"), TargetTemp1);
      bfill.emit_p(PSTR("<td>$D &deg;C</td>"), TargetTemp2);
      bfill.emit_p(PSTR("<td>$D &deg;C</td>"), TargetTemp3);
      bfill.emit_p(PSTR("<td>$D &deg;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

BlackSnow
Offline
Зарегистрирован: 16.08.2015

Кое-как получилось...

Посмотрим на сколько стабильно...

/*
 * контроллер тёплого пола
 */

#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 &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;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 &deg;C</td>"), TargetTemp1);
      bfill.emit_p(PSTR("<td>$D &deg;C</td>"), TargetTemp2);
      bfill.emit_p(PSTR("<td>$D &deg;C</td>"), TargetTemp3);
      bfill.emit_p(PSTR("<td>$D &deg;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;
}

 

uservasil
Offline
Зарегистрирован: 09.07.2015

Спасибо, очень нужный проект! Как со стабильностью?

BlackSnow
Offline
Зарегистрирован: 16.08.2015

Последний код - офигенно работает, ни разу не перезагружал =)

uservasil
Offline
Зарегистрирован: 09.07.2015

а не мог бы ты объяснить начинающему что это за переменные:

//Время, в которое был принят сигнал отсутствия движения(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   }

 

BlackSnow
Offline
Зарегистрирован: 16.08.2015

А это датчик движения у меня там еще есть, свет в ванной включает-выключает =)

Deuce
Offline
Зарегистрирован: 20.08.2013

Проект достиг логического завершения, или есть развитие?

Deuce
Offline
Зарегистрирован: 20.08.2013

А смог бы кто переделать этот скетч под  W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.

ojakov
Offline
Зарегистрирован: 26.11.2015

Deuce пишет:

А смог бы кто переделать этот скетч под  W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.

Это как, управление 8-ю устройствами по сети?

Было-б интересно, я ищу схему на устройство которое управляет 16-ю нагрузками по усб,

к компу включаюсь через Тайм Вьювер, можен есть более изящьное решение?

 

uservasil
Offline
Зарегистрирован: 09.07.2015

Deuce пишет:

А смог бы кто переделать этот скетч под  W5100? Под 8 реле я смог переделать сам. если кому нужно, пишите - выложу.

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

Deuce
Offline
Зарегистрирован: 20.08.2013

ojakov пишет:

Это как, управление 8-ю устройствами по сети?

 

Да, терморегулирование 8ю  нагрузками по сети. НО только при использовании Меги и ENC28J60.

Deuce
Offline
Зарегистрирован: 20.08.2013

#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;
}

uservasil пишет:

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

А для каких целей такое нужно?

 

И напоминаю тем, кто будет использовать код: переименовывая наименования помещений, укладывайтесь в 1279 символов, включая пробелы, в HTML коде! Иначе скетч не будет работать.

 

uservasil
Offline
Зарегистрирован: 09.07.2015

Deuce пишет:

А для каких целей такое нужно?

поддерживать отрицательную температуру на даче например -5...-10 когда на улице мороз -30.

Deuce пишет:

НО только при использовании Меги и ENC28J60.

а я подумал что Вы соединили NANO и W5100 :)

Deuce пишет:

укладывайтесь в 1279 символов

с чем связано данное ограничение? при использовании Mega такое же ограничение?

Deuce
Offline
Зарегистрирован: 20.08.2013

uservasil пишет:

поддерживать отрицательную температуру на даче например -5...-10 когда на улице мороз -30.

с чем связано данное ограничение? при использовании Mega такое же ограничение?

 

А есть разница, -10 или -30 на даче??? минус, имхо, он и в африке минус.

 

Ограничение не в Меге, а в ENC. с чем связано не знаю. выяснил опытным путем. в библиотеке не нашел упоминания, но может плохо искал.

uservasil
Offline
Зарегистрирован: 09.07.2015

Deuce пишет:

А есть разница, -10 или -30 на даче??? минус, имхо, он и в африке минус.

В Африке то дА, а когда греешь к выходным проще нагреть с -5...-10 чем с -30 ;)

Deuce
Offline
Зарегистрирован: 20.08.2013

uservasil пишет:

В Африке то дА, а когда греешь к выходным проще нагреть с -5...-10 чем с -30 ;)

Ну так греть-то надо не до -10, а до положительных температур. (если я правильно логику понимаю). ну да не суть. Выяснил, что мой код (равно как и исходный) работает только с датчиками DS18B20. Если подсунуть DS18S20 показания будут не правильные. пытаюсь переделать код под всю серию этих датчиков. если у кого есть варианты куда копать - поделитесь, плз.

uservasil
Offline
Зарегистрирован: 09.07.2015

Deuce пишет:

 если у кого есть варианты куда копать - поделитесь, плз.

может сюда 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 &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;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 &deg;C</td>"), TargetTemp1);
      bfill.emit_p(PSTR("<td>$D &deg;C</td>"), TargetTemp2);
      bfill.emit_p(PSTR("<td>$D &deg;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;
   
}

 

Deuce
Offline
Зарегистрирован: 20.08.2013

uservasil пишет:

вот мой код под два датчика DHT11 и два 18B20  -

Так у меня как раз с DS18B20 все работает нормально. не работает с DS18S20
 
ratman
Offline
Зарегистрирован: 11.10.2015

Deuce пишет:

uservasil пишет:

вот мой код под два датчика DHT11 и два 18B20  -

Так у меня как раз с DS18B20 все работает нормально. не работает с DS18S20

У S20 код 0x10, а не 0x28, как у B20.

Deuce
Offline
Зарегистрирован: 20.08.2013

ratman пишет:

У S20 код 0x10, а не 0x28, как у B20.

Код с 8ю B20 я приводил выше. он работает нормально. если вместо одного из восьми В20 поставить S20 (с изменением адреса разумеется), то температура показывается неправильно.

Deuce
Offline
Зарегистрирован: 20.08.2013

#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. Кому понадобится - забирайте:

 

 

ojakov
Offline
Зарегистрирован: 26.11.2015

Ого спасибо ща попробуем!

uservasil
Offline
Зарегистрирован: 09.07.2015

Подключил датчики DHT21 вместо нормально работающих DHT11, отображается NAN, уже все перепробывал, может кто поможет разобраться?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

uservasil пишет:

Подключил датчики DHT21 вместо нормально работающих DHT11, отображается NAN, уже все перепробывал, может кто поможет разобраться?

строка #28, #29 в скетче

uservasil
Offline
Зарегистрирован: 09.07.2015

Valera19701 пишет:

uservasil пишет:

Подключил датчики DHT21 вместо нормально работающих DHT11, отображается NAN, уже все перепробывал, может кто поможет разобраться?

строка #28, #29 в скетче

не все так просто, к сожалению)

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

резистор на вывод data  и 5v 1К поставьте

uservasil
Offline
Зарегистрирован: 09.07.2015

Valera19701 пишет:

резистор на вывод data  и 5v 1К поставьте

Пробовал, спасибо. В тестовом скетче все нормально отображается, думаю проблема в виде данных которые идут с датчика

uservasil
Offline
Зарегистрирован: 09.07.2015

Разобрался, проблема была создана мною же, еще когда "причесывал" скетч, а именно переменные "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 &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;C</td>"
  "<td>$S &deg;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 &deg;C</td>"), TargetTemp1);
      bfill.emit_p(PSTR("<td>$D &deg;C</td>"), TargetTemp2);
      bfill.emit_p(PSTR("<td>$D &deg;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;
   
}

 

Tazzzz
Offline
Зарегистрирован: 09.04.2014

Здравствуйте. Кто может добавить в скетч упраление 8 реле, вкючать выключать, как описано в этом видео? http://www.youtube.com/watch?v=PPB2Xvubt4s

uservasil
Offline
Зарегистрирован: 09.07.2015

Tazzzz пишет:


Здравствуйте. Кто может добавить в скетч упраление 8 реле, вкючать выключать, как описано в этом видео? http://www.youtube.com/watch?v=PPB2Xvubt4s

Если вы имеете ввиду объединение обеих скетчей, я думаю возникнут проблемы с размером программы, а именно с глобальнимы переменнаями, сейчас попробую добавить хотя бы управление одним реле.

добавлено в 9:52

у меня не вышло, после добавления на веб-страницу ссылки даже одного реле страничка не открывается, на меге думаю будет нормально  работать, а уно/нано уж больно мало памяти имеют для работы с данным шилдом.

Tazzzz
Offline
Зарегистрирован: 09.04.2014

Можете скинуть, что получило для Мега? Спасибо.

Tazzzz
Offline
Зарегистрирован: 09.04.2014

Подскажите можно поменять дельту на влючение и на выключение 0.5 градуса, сейчас стоит 2 градуса, дом сильно остывает.

Deuce
Offline
Зарегистрирован: 20.08.2013

Tazzzz пишет:

Можете скинуть, что получило для Мега? Спасибо.

 

Кому адресован вопрос?

Security000
Offline
Зарегистрирован: 30.10.2015

А может html вынести на SD карту?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

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

И в качестве идеи. Страничка выглядит красивее с использованием картинок, стилей, скриптов. Что бы не заморачиваться их хранением в ардуине, их можно разместить на внешнем ресурсе. Тогда браузер, закачав HTML страничку с ардуинки, подгрузит картинки, стили, скрипты с внешнего ресурса.

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

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

Security000 пишет:
А может html вынести на SD карту?

html   на карте наверное возможно.
Я думаю основная проблемма будет с величиной буфера ( RAM )

Хотя ведь уже  сделали, нет времени посмотреть эту сказку.....

http://geektimes.ru/post/260682/

http://forum.amperka.ru/threads/arduino-mega-server.6850/

BlackSnow
Offline
Зарегистрирован: 16.08.2015

Andy пишет:

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

Займитесь ;) Я не ас в программировании, скетч стырен с какого-то иностранного сайта и подправлен для моих целей ;)

Andy пишет:

И в качестве идеи. Страничка выглядит красивее с использованием картинок, стилей, скриптов. Что бы не заморачиваться их хранением в ардуине, их можно разместить на внешнем ресурсе. Тогда браузер, закачав HTML страничку с ардуинки, подгрузит картинки, стили, скрипты с внешнего ресурса.

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

Плохая идея, это устройство все-в-одном и не нужно его разделять, да и далеко не у всех есть внешний ресурс...

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

BlackSnow пишет:
Займитесь ;)
Займусь, несколько позже, когда свой web сервер буду делать на ардуине.

BlackSnow пишет:
Плохая идея, это устройство все-в-одном и не нужно его разделять, да и далеко не у всех есть внешний ресурс...
Полноценный web сервер не реально сделать на мелкой ардуине, типа Nano. Внешний ресурс есть у всех, в качестве такового может быть использован arduino.ru, ucoz.com, narod.ru, mail.ru и пр. На внешнем ресурсе можно реализовать сколь угодно сложный сайт с графикой, анимацией и т.д и т.п.  А если это решение для дома, без выхода в сеть и-нет, то внешним ресурсом является домашний комп.

BlackSnow пишет:
Основная проблема, видимо, здесь:

1 byte Ethernet::buffer[1120];

При увеличении размера - не хватает памяти, а при таком размере - не хватает места для html кода... Всё это на Arduino Nano

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

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

Tazzzz
Offline
Зарегистрирован: 09.04.2014

Планшет и компьюте это не надёжно, сегодня он работает завтра нет и т.д. В чём пороблема всять МЕГА там памяти хватит.

GraninDm
Offline
Зарегистрирован: 01.08.2013

Посмотрите на мой проект

http://robocraft.ru/blog/3126.html

Все странички на sd карте.

Основано на библиотеке arduino tiny web server.

Сейчас уже есть вторая версия, в которой добавлено кое-что новое и оптимизирован немного код.

По ссылке из статьи есть папка V2.0

Web морду можно переписывать без компиляции скетча.

 

armlive
Offline
Зарегистрирован: 07.12.2015

Tazzzz пишет:

Планшет и компьюте это не надёжно, сегодня он работает завтра нет и т.д. В чём пороблема всять МЕГА там памяти хватит.

А мега надежней планшета??? 

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

Security000
Offline
Зарегистрирован: 30.10.2015

GraninDm,

что-то ваш проект не захотел компилироваться - выдаёт ошибки

Security000
Offline
Зарегистрирован: 30.10.2015

armlive,

можно взглянуть на ваш проект?

armlive
Offline
Зарегистрирован: 07.12.2015

Вот аналогично http://cxem.net/arduino/arduino174.php

GraninDm
Offline
Зарегистрирован: 01.08.2013

Какие ошибки?

Вы все библиотеки установили?

Желательно вторую версию компилировать

oland2000
Offline
Зарегистрирован: 09.05.2015

Security000

Долго не мог победить.

Пока не установил библиотеку отсюда:

https://github.com/jcw/ethercard.git

После этого завелось

GraninDm
Offline
Зарегистрирован: 01.08.2013

Это для кого сообщение?

Deuce
Offline
Зарегистрирован: 20.08.2013

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


#include <Ethernet.h>
#include <SPI.h>
#include "WebServer.h" // Webduino (https://github.com/sirleech/Webduino)
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <EEPROM.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE4, 0xDE, 0x35 }; // MAC-адрес нашего устройства
byte ip[] = { 192, 168, 2, 37 };
byte subnet[] = { 255, 255, 255, 0 };
byte gw[] = { 192, 168, 2, 1 };

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];


#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress T1 = { 0x28, 0xFF, 0xE0, 0x8C, 0x11, 0x14, 0x00, 0x6F };
DeviceAddress T2 = { 0x28, 0xFF, 0xB2, 0x48, 0x11, 0x14, 0x00, 0x4E };
DeviceAddress T3 = { 0x28, 0xFF, 0x9E, 0x8A, 0x11, 0x14, 0x00, 0xA9 };
DeviceAddress T4 = { 0x28, 0xFF, 0xB8, 0x70, 0x10, 0x14, 0x00, 0xC  };
DeviceAddress T5 = { 0x28, 0xFF, 0x62, 0x67, 0x10, 0x14, 0x00, 0x51 };
DeviceAddress T6 = { 0x28, 0xFF, 0xC9, 0x4D, 0x11, 0x14, 0x00, 0xD2 };
DeviceAddress T7 = { 0x28, 0xFF, 0xEB, 0x8B, 0x10, 0x14, 0x00, 0x32 };
DeviceAddress T8 = { 0x28, 0xFF, 0xE7, 0x8C, 0x11, 0x14, 0x00, 0x3E };

 #define PREFIX ""
 WebServer webserver(PREFIX, 80);

void infoRequest(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)    //Генерация и вывод информации об устройстве
{
  getSensors(server, type, url_tail, tail_complete);
}

void getSensors(WebServer &server, WebServer::ConnectionType type, char *, bool)     //Вывод значений всех сенсоров. Парсинг в коде php клиента - в MDM.
{
  sensors.requestTemperatures();
  float t1 = sensors.getTempC(T1);
  float t2 = sensors.getTempC(T2);
  float t3 = sensors.getTempC(T3);
  float t4 = sensors.getTempC(T4);
  float t5 = sensors.getTempC(T5);
  float t6 = sensors.getTempC(T6);
  float t7 = sensors.getTempC(T7);
  float t8 = sensors.getTempC(T8);
  
  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];

  temp1=tempread(T1);
  dtostrf(t1, 4, 1, chartemp1);
  temp2=tempread(T2);
  dtostrf(t2, 4, 1, chartemp2);
  temp3=tempread(T3);
  dtostrf(t3, 4, 1, chartemp3);
  temp4=tempread(T4);
  dtostrf(t4, 4, 1, chartemp4);
  temp5=tempread(T5);
  dtostrf(t5, 4, 1, chartemp5);
  temp6=tempread(T6);
  dtostrf(t6, 4, 1, chartemp6);
  temp7=tempread(T7);
  dtostrf(t7, 4, 1, chartemp7);
  temp8=tempread(T8);
  dtostrf(t8, 4, 1, chartemp8);

  byte TargetTemp1; 
  byte TargetTemp2; 
  byte TargetTemp3; 
  byte TargetTemp4;
  byte TargetTemp5; 
  byte TargetTemp6; 
  byte TargetTemp7; 
  byte TargetTemp8;

  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);

  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

     {
   
  P(Page_info) = "<html><head><meta http-equiv='refresh' content='120'/meta><charset='utf-8'>/head";

  server.print("<body>");
  server.print("<center><font size=\"4\">");
  server.print("<table border=\"1\" cellpadding=\"5\" style=\"width: 800px; border-collapse: collapse; border: 1px solid black;\">");
  server.print("<tr style=\"background-color: silver\"><td>Помещение:</td>");
  server.print("<td>Прихожая</td>");
  server.print("<td>Спальня</td>");
  server.print("<td>Гостевая</td>");
  server.print("<td>Детская</td>");
  server.print("<td>Зал</td>");
  server.print("<td>Скважина</td>");
  server.print("<td>Камин</td>");
  server.print("<td>Улица</td></tr>");
  
  server.print("<tr><td>Температура:</td>"); 
  server.print("<td>");
  server.print(chartemp1);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp2);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp3);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp4);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp5);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp6);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp7);
  server.print("&deg;C");
  server.print("</td>");
  server.print("<td>");
  server.print(chartemp8);
  server.print("&deg;C");
  server.print("</td>");
  
  server.print("<tr><td>Обогрев:</td>");
    if (digitalRead(PinSSR1) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR2) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR3) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR4) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR5) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR6) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR7) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 
      if (digitalRead(PinSSR8) == LOW ) { 
    server.print("<td><font color=green><b>ВКЛ</b></font></td>"); } 
    else { 
    server.print("<td><font color=red><b>ВЫКЛ</b></font></td>"); } 

    server.print("</tr><tr><td>Цель:</td>");
    server.print("<td>$D &deg;C</td>"),(TargetTemp1);
    server.print("<td>$D &deg;C</td>"),(TargetTemp2);
    server.print("<td>$D &deg;C</td>"),(TargetTemp3);
    server.print("<td>$D &deg;C</td>"),(TargetTemp4);
    server.print("<td>$D &deg;C</td>"),(TargetTemp5);
    server.print("<td>$D &deg;C</td>"),(TargetTemp6);
    server.print("<td>$D &deg;C</td>"),(TargetTemp7);
    server.print("<td>$D &deg;C</td>"),(TargetTemp8);

    server.print("</tr><tr><td>Установить:</td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
    server.print("<td><form><input type=text name=ttemp1 size=10> <input type=submit value=ОК> </form></td>");
  
    Serial.print("T1=");
    Serial.print(t1);
    Serial.print(" T2=");
    Serial.print(t2);
    Serial.print(" T3=");
    Serial.print(t3);
    Serial.print(" T4=");
    Serial.print(t4);
    Serial.print(" T5=");
    Serial.print(t5);
    Serial.print(" T6=");
    Serial.print(t6);
    Serial.print(" T7=");
    Serial.print(t7);
    Serial.print(" T8=");
    Serial.println(t8);

  }
}

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  sensors.begin();
  sensors.setResolution(T1, 12);
  sensors.setResolution(T2, 12);
  sensors.setResolution(T3, 12);
  sensors.setResolution(T4, 12);
  sensors.setResolution(T5, 12);
  sensors.setResolution(T6, 12);
  sensors.setResolution(T7, 12);
  sensors.setResolution(T8, 12);

  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

  Ethernet.begin(mac, ip, subnet, gw); // Инициализируем Ethernet Shield

  webserver.setDefaultCommand(&infoRequest); // дефолтная страница вывода (информация о контроллере)
  webserver.begin();
  
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  char buff[64];
  int len = 64; 
 
  
  webserver.processConnection(buff, &len); // process incoming connections one at a time forever
}
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];
  }
  oneWire.reset(); // pulse the pins and wait for a response to reset the DS1820
  oneWire.select(addr); // 0x55 (MATCH_ROM) followed by the address of the 1820 to talk to.
//  oneWire.write(0x44,1);     // start conversion, with parasite power on at the end

  oneWire.write(0x44,0);  //PARASITE POWER OFF
//  delay(800);     

  present = oneWire.reset();
  oneWire.select(addr);    
  oneWire.write(0xBE);    // Read Scratchpad

  for ( i = 0; i < 9; i++) {       // we need 9 bytes
    data[i] = oneWire.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;
}

 

uservasil
Offline
Зарегистрирован: 09.07.2015

Deuce пишет:

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

Тоже застопорился, не знаю как из формы ввода требуемой температуры вытащить переменную. Может поднимем тему и кто то знающий подскажет как это делать.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

uservasil пишет:

Deuce пишет:

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

Тоже застопорился, не знаю как из формы ввода требуемой температуры вытащить переменную. Может поднимем тему и кто то знающий подскажет как это делать.

Всё просто: надо у тэга FORM описать атрибуты TARGET и METHOD, чтобы браузер знал, куда и каким методом засунуть данные, введённые пользователем. Затем - при отправке формы по кнопке <input type="submit"...> на URI, указанный в TARGET, методом, указанном в METHOD, придут данные, закодированные в соответствии с указанием кодировки, это описывается аттрибутом ENCTYPE формы. Принимаете HTTP-запрос для этого URI, разбираете переданные значения, декодируете их, если потребуется - и вуаля: вы получили значение, введённое пользователем.

Есть такой чудный RFC по HTTP - советую ознакомиться хотя бы с основами.

З.Ы. А код, что вы привели - в помойку. Память ардуине ещё не жмёт? Не волнуйтесь - скоро начнёт давить в талии, и тогда - жопа.