термостат на ардуино и инет шилде

dronsoft
Offline
Зарегистрирован: 02.06.2011

Добрый день есть вопрос стобрал ког но на выполняет действие автоматикого регулирования температуры.

подскажите где я ошибся. 


#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <OneWireTempSensor.h>
 
// Ethernet Configuration
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,109);
// Used default port for HTTP
EthernetServer server(80);
 
byte wirePin = 8;
OneWire ds(wirePin);
byte addr[8];
 
byte ledPin = 13;
boolean isLedOn = false;
 
unsigned long lastUpdate = 0;
 
float temperature = -100.0;
OneWireTempSensor sensors(8); 
int numdevs;
int value;
int temp;
int ten = 10;
int ledPin2 =  13;
int buttonPin = 7;
int buttonState = 0;

byte newChar[8] = {
  B11000,
  B11000,
  B00110,
  B01001,
  B01000,
  B01001,
  B00110,
  B00000
};
 
 
void setup(void) {
  {
  numdevs = sensors.getDevices();
  pinMode(ten, OUTPUT);
  pinMode(ledPin, OUTPUT);
  Ethernet.begin(mac,ip);
  server.begin();
  connectToSensor();
}
}
void loop(void) {
    value = (int) sensors.getTempC(0);
if (value != 85)
  updateTemperature();
 
  EthernetClient client = server.available();
 
  if(client){
 
    String request;
 
    boolean currentLineIsBlank = true;
    boolean requestLineReceived = false;
 
    while(client.connected()){
      if (client.available()) {
        char c = client.read();
 
        if(c == '\n' && currentLineIsBlank) { 
          // substract path from a request line
          request = request.substring( 
                      request.indexOf(' ') + 1, 
                      request.lastIndexOf(' '));
          if(request=="/"){
            successHeader(client);
            generatePage(client);
          }
          else if(request=="/switch-on"){
            digitalWrite(ledPin, HIGH);
            isLedOn = true;
            redirectHeader(client, "/");
          }
          else if(request=="/switch-off"){
            digitalWrite(ledPin, LOW);
            isLedOn = false;
            redirectHeader(client, "/");
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
          if(!requestLineReceived){
            requestLineReceived = true;
          }
        } 
        else if (c != '\r') {
          if(!requestLineReceived) {
            request += c;
          }
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }  
}
 
void successHeader(EthernetClient client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connnection: close");
  client.println();
}
 
void redirectHeader(EthernetClient client, String path){
  client.println("HTTP/1.1 302 Moved Temporarily");
  client.println("Content-Type: text/html");
  client.println("Location: " + path);
  client.println("Connnection: keep-alive");
  client.println();
}
 
void generatePage(EthernetClient client){
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head>");
  client.println("  <title>Server</title>");
  client.println("</head>");
 
  client.println("<body>");
  String ledStatus = isLedOn ? "ON" : "OFF";
  client.println("  <h1>Led is " + ledStatus + "</h1>");
 
  if(temperature != -100.0){
    client.println("  <h1>Temperature is " + 
                      floatToString(temperature, 100) + 
                      "</h1>");
  }
  client.println("  <a href=\"/switch-on\">Switch ON</a>");
  client.println("  <br />");
  client.println("  <a href=\"/switch-off\">Switch OFF</a>");
  client.println("</body>");
  client.println("</html>");
}
 
String floatToString(float value, byte precision){
  int intVal = int(value);
  unsigned int frac;
  if(intVal >= 0){
    frac = (value - intVal) * precision;
  } 
  else {
    frac = (intVal - value) * precision;
  }
  return String(intVal) + "." + String(frac);
}
 
void updateTemperature(){
  unsigned long time = millis();
  if((time - lastUpdate) > 5000 || lastUpdate == -100.0){
    lastUpdate = time;
    temperature = getTemperature();
  }
}
 
float getTemperature() {
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44);        
 
  delay(750);
 
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);     
 
  byte data[9], i;
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
 
  if (OneWire::crc8(data, 8) != data[8]) {
    return temperature;
  }
 
  unsigned int raw = (data[1] << 8) | data[0];
  raw = raw << 3;
  if (data[7] == 0x10) {
    raw = (raw & 0xFFF0) + 12 - data[6];
  }
 
  float celsius;
  celsius = (float)raw / 16.0;
  return celsius;
}
 
void connectToSensor(){
  if ( !ds.search(addr) || 
          OneWire::crc8(addr, 7) != addr[7] || 
          addr[0]!=0x10) {
    ds.reset_search();
    delay(250);
    connectToSensor();
  }

 if (value < 10)

    {

      temp = value/10;

    }

    else

    {

      temp = value;

    }

if (temp>=23)

{

  digitalWrite(ten, HIGH);   // включает светодиод

}

if (temp<=24)

{

  digitalWrite(ten, LOW);

}

 

if (buttonState == HIGH) {

  digitalWrite(ledPin2, HIGH);

  }


  else 

    // выключаем светодиод

    digitalWrite(ten, LOW);

  }

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

dronsoft пишет:

Добрый день есть вопрос стобрал ког но на выполняет действие автоматикого регулирования температуры.

подскажите где я ошибся. 


Я вообще не понял чего ты написал.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так нобелевские варианты, работающие конечно бесплатно, быстро опеределили что у него не так с кодом, а потом еще и решение предложили

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

dronsoft
Offline
Зарегистрирован: 02.06.2011

jeka_tm,

Вот не повериш занимаюсь ремонтом автомобилей а в частночти автоэлекткрикой и диагностикой иногда и день можно потерять и не найти причину и за это денег не беру и не намекаю, Форум для этого и существует что бы разобрать причину, а если заработать хочешь то это надо на отдельной ветке " помогаю за деньги" и "Стебусь над тем кто не может разобрать причину" А советы и порой легкий ремонт делаю людям за спасибо и не жалуюсь за то меня в Перми за полгода узнали столько народу что у меня стоят в очереди на 3 недели в перед!!!

И беру любые случаи которые автоэлектрики с гонором и вые....нами как ТЫ сделать не могут. 

ПРошу не офтопить в моей теме а по существу.

Я не прошу написать код а подсказать где косяк!!! Чуешь разницу?!!!

dronsoft
Offline
Зарегистрирован: 02.06.2011

Согласен написал и не проверил понять мало что можно.

я в код добавил контроль за температурой автоматический

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

условие с гестерезисом? это имелось в виду?

а не проще ли сначала все лишнее убрать и отрабатывать регулировку температуры

com
Offline
Зарегистрирован: 06.09.2013

dronsoft пишет:

Согласен написал и не проверил понять мало что можно.

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

если это разъяснение, то оно еще больше все запутало

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

com пишет:

dronsoft пишет:

Согласен написал и не проверил понять мало что можно.

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

если это разъяснение, то оно еще больше все запутало


Гыыы. Буквально в пятницу обсуждали в офисе похожую ситуацию. Типа работник он хороший, но вот с общением у него проблемы.

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

у меня пальцы нажимают пороу три клавиши сразу приходится чутли не мизицем писать

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

dronsoft пишет:

у меня пальцы нажимают пороу три клавиши сразу приходится чутли не мизицем писать

 


Ну это заодно обьяняет ваши проблемы с кодом.

dronsoft
Offline
Зарегистрирован: 02.06.2011

что с ним все таки не так?

 

itjunky
Offline
Зарегистрирован: 15.09.2014

dronsoft пишет:

что с ним все таки не так?

 

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

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

dronsoft
Offline
Зарегистрирован: 02.06.2011

Благодарю за подсказку

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

Народ помогите разобраться как это реализовать.

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
 
// Ethernet Configuration
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,109);
// Used default port for HTTP
EthernetServer server(80);
 
byte wirePin = 8;
OneWire ds(wirePin);
byte addr[8];
 
byte ledPin = 13;
boolean isLedOn = false;
 
unsigned long lastUpdate = 0;
 
float temperature = -100.0;
int power=0; 
 
void setup(void) {
  pinMode(ledPin, OUTPUT);
  Ethernet.begin(mac,ip);
  server.begin();
  connectToSensor();
}
 
void loop(void) {
  updateTemperature();
 
  EthernetClient client = server.available();
 
  if(client){
 
    String request;
 
    boolean currentLineIsBlank = true;
    boolean requestLineReceived = false;
 
    while(client.connected()){
      if (client.available()) {
        char c = client.read();
 
        if(c == '\n' && currentLineIsBlank) { 
          // substract path from a request line
          request = request.substring( 
                      request.indexOf(' ') + 1, 
                      request.lastIndexOf(' '));
          if(request=="/"){
            successHeader(client);
            generatePage(client);
          }
          else if(request=="/switch-on"){
            power = 1;
            isLedOn = true;
            redirectHeader(client, "/");
          }
          else if(request=="/switch-off"){
            power = 0;
            isLedOn = false;
            redirectHeader(client, "/");
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
          if(!requestLineReceived){
            requestLineReceived = true;
          }
        } 
        else if (c != '\r') {
          if(!requestLineReceived) {
            request += c;
          }
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  } 
 
 if ((power==1) && (temperature<=45)) {
 digitalWrite(ledPin, HIGH);
 }
 
  if ((power==1) && (temperature>=50)) {
 digitalWrite(ledPin, LOW);
 }
 
   if (power==0)  {
 digitalWrite(ledPin, LOW);
 };
 
}
 
void successHeader(EthernetClient client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connnection: close");
  client.println();
}
 
void redirectHeader(EthernetClient client, String path){
  client.println("HTTP/1.1 302 Moved Temporarily");
  client.println("Content-Type: text/html");
  client.println("Location: " + path);
  client.println("Connnection: keep-alive");
  client.println();
}
 
void generatePage(EthernetClient client){
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head>");
  client.println("  <title>Server</title>");
  client.println("</head>");
 
  client.println("<body>");
  String ledStatus = isLedOn ? "ON" : "OFF";
  client.println("  <h1>Led is " + ledStatus + "</h1>");
 
  if(temperature != -100.0){
    client.println("  <h1>Temperature is " + 
                      floatToString(temperature, 100) + 
                      "</h1>");
  }
  client.println("  <a href=\"/switch-on\">Switch ON</a>");
  client.println("  <br />");
  client.println("  <a href=\"/switch-off\">Switch OFF</a>");
  client.println("</body>");
  client.println("</html>");
}
 
String floatToString(float value, byte precision){
  int intVal = int(value);
  unsigned int frac;
  if(intVal >= 0){
    frac = (value - intVal) * precision;
  } 
  else {
    frac = (intVal - value) * precision;
  }
  return String(intVal) + "." + String(frac);
}
 
void updateTemperature(){
  unsigned long time = millis();
  if((time - lastUpdate) > 5000 || lastUpdate == -100.0){
    lastUpdate = time;
    temperature = getTemperature();
  }
}
 
float getTemperature() {
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44);        
 
  delay(750);
 
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);     
 
  byte data[9], i;
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
 
  if (OneWire::crc8(data, 8) != data[8]) {
    return temperature;
  }
 
  unsigned int raw = (data[1] << 8) | data[0];
  raw = raw << 3;
  if (data[7] == 0x10) {
    raw = (raw & 0xFFF0) + 12 - data[6];
  }
 
  float celsius;
  celsius = (float)raw / 16.0;
  return celsius;
}
 
void connectToSensor(){
  if ( !ds.search(addr) || 
          OneWire::crc8(addr, 7) != addr[7] || 
          addr[0]!=0x10) {
    ds.reset_search();
    delay(250);
    connectToSensor();
  }
}