ARDUINO - DS18S20 a relatka - chyba v programu = VYŘEŠENO

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

ARDUINO - DS18S20 a relatka - chyba v programu = VYŘEŠENO

#1 Příspěvek od jiri255 »

Zdravím,
trochu se trápím s programem, který by při zvýšení teploty nad 28°C zapnul relé a na webu obarvil rele1 na zeleno

Kód: Vybrat vše

          if (digitalRead(2)){ 
          client.print("<a href='http://192.168.0.150?rele1=0'><button style='background:red;width:20%;height:30px'>RELE 1 VYPNUTO</button></a>");         
          }else{
          client.print("<a href='http://192.168.0.150?rele1=1'><button style='background:green;width:20%;height:30px'>RELE 1</button></a>");
           }

ale stále mi to neběží nedaří se mi to rozchodit :-(
Teplotu mi to ukazuje správnou, ale když ji zvýším relé se nezapne, když teplota klesne také se nic nestane chybu ...nevím, jak to správně zapsat, aby to fungovalo.

Kód: Vybrat vše

/*
          if(buffer.indexOf("rele1=1")>=0)
          digitalWrite(2,HIGH);

          else if(buffer.indexOf("rele1=0")>=0)
          digitalWrite(2,LOW);
 */       
          if (28 > teplota1){
          digitalWrite(2,HIGH);
          } else {
          digitalWrite(2,LOW);
          }

Jediné co mi funguje je, že když kliknu na ostatní tlačítka, tak se mi dané relé obarví a po opětovném kliknutí se relé vypne a barva tlačítka změní, což je skvělé, jen bych to ještě potřeboval u prvního tlačítka změnit ne na kliknutí, ale na ovládání teplotou.
Můžete mi někdo s tím kódem pomoct?
Níže ho přikládám celý a předem děkuji za případnou pomoc.

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>   //knihovna pro teplomer

// zde si upravte podle sebe
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// IP adresa
IPAddress ip(192,168,0, 150);
// port
EthernetServer server(80);

OneWire  ds_1(7);  // on pin 10 (a 4.7K resistor is necessary) teplomer v zavorce pin teplomeru
int ledPin = 13;

float teplota1 = teplomer1();

//--------------------------------zacatek teplomeru_1
float teplomer1() {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius_1, fahrenheit_1;
 
  if ( !ds_1.search(addr)) {
   // Serial.println("No more addresses.");
    Serial.println();
    ds_1.reset_search();
    delay(250);
    //return;
  }
 
  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    //Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
    //  return;
  }
 

  ds_1.reset();
  ds_1.select(addr);
  ds_1.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  //delay(5000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds_1.reset();
  ds_1.select(addr);   
  ds_1.write(0xBE);         // Read Scratchpad


  //Serial.print("  Data = ");
  //Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds_1.read();
    //Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  //Serial.print(" CRC=");
  //Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    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
  }
  celsius_1 = (float)raw / 16.0;
  fahrenheit_1 = celsius_1 * 1.8 + 32.0;
  /*Serial.print("Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");*/
  float stupne_1 = celsius_1;
  return stupne_1;
   }
//------------------------------------konec teplomeru_1
 

void setup()

{
  // inicalizace sítě
  Ethernet.begin(mac, ip);
  // inicializace serveru
  server.begin();
  // nastavíme pin 2 jako výstup pro rele

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
 
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);

  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); //pro ledku ke kouri zakladni nastaveni je vypnuta 

}


void loop()
{
  Serial.print("Teplota-1: ");
     Serial.println(teplota1);
//  Serial.println(teplomer1());
  // když je připojen klient, zjistíme, zda jsou odeslána data
  // od klienta směrem k nám
   EthernetClient client = server.available();
   String buffer = "";
   
  // dokud je klient připojen   
   while (client.connected()) {
    // čti data od něj dokud nenarazíš na znak nového řádku

     if (client.available()) {
        char c = client.read();
         buffer = buffer + c;
         if (c == '\n') {
     
/*
          if(buffer.indexOf("rele1=1")>=0)
          digitalWrite(2,HIGH);

          else if(buffer.indexOf("rele1=0")>=0)
          digitalWrite(2,LOW);
 */       
          if (28 > teplota1){
          digitalWrite(2,HIGH);
          } else {
          digitalWrite(2,LOW);
          }

          if(buffer.indexOf("rele2=1")>=0)
          digitalWrite(3,HIGH);

          else if(buffer.indexOf("rele2=0")>=0)
          digitalWrite(3,LOW);

          if(buffer.indexOf("rele3=1")>=0)
          digitalWrite(4,HIGH);

          else if(buffer.indexOf("rele3=0")>=0)
          digitalWrite(4,LOW);         

         
          if(buffer.indexOf("rele4=1")>=0)
          digitalWrite(5,HIGH);

 
          else if(buffer.indexOf("rele4=0")>=0)
          digitalWrite(5,LOW);
         
 
           // odešle klasickou hlavičku HTML stránky
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
         
          // zde již klasická html data
          client.println("<html>");
          client.println("<head>");
          // Název stránky
          client.println("<title>Arduinio Server - Rele control</title>");
          client.println("</head>");
          client.println("<body>");         
          client.print("<h3 align=center>Program pro ovladani rele</h3>");         
          client.println("</br>");
         
          // vygeneruje formulář
          if (digitalRead(2)){
          client.print("<a href='http://192.168.0.150?rele1=0'><button style='background:red;width:20%;height:30px'>RELE 1 VYPNUTO</button></a>");         
          }else{
          client.print("<a href='http://192.168.0.150?rele1=1'><button style='background:green;width:20%;height:30px'>RELE 1</button></a>");
           }
          client.println("&nbsp; &nbsp; &nbsp; &nbsp; rizeno teplotnim cidlem ds1");
          client.println("</br>");

           if (digitalRead(3)){
          client.print("<a href='http://192.168.0.150?rele2=0'><button style='background:red;width:20%;height:30px'>RELE 2 VYPNUTO</button></a>");
          }else{
          client.print("<a href='http://192.168.0.150?rele2=1'><button style='background:green;width:20%;height:30px'>RELE 2</button></a>");
           }
          client.println("&nbsp; &nbsp; &nbsp; &nbsp; tlacitko pro kotel 2");
          client.println("</br>");
 
           if (digitalRead(4)){
          client.print("<a href='http://192.168.0.150?rele3=0'><button style='background:red;width:20%;height:30px'>RELE 3 VYPNUTO</button></a>");
          }else{
          client.print("<a href='http://192.168.0.150?rele3=1'><button style='background:green;width:20%;height:30px'>RELE 3</button></a>");
           }
          client.println("&nbsp; &nbsp; &nbsp; &nbsp; tlacitko pro kotel 3");
          client.println("</br>");         

           if (digitalRead(5)){
          client.print("<a href='http://192.168.0.150?rele4=0'><button style='background:red;width:20%;height:30px'>RELE 4 VYPNUTO</button></a>");
          }else{
          client.print("<a href='http://192.168.0.150?rele4=1'><button style='background:green;width:20%;height:30px'>RELE 4</button></a>");
           }
          client.println("&nbsp; &nbsp; &nbsp; &nbsp; tlacitko pro kotel 4");
          client.println("</br>");
          client.println("</br>");
          client.println("</br>");         
          client.println("Teplota:");
          client.println("</br>");         
          client.println(teplomer1());       
          client.print("<meta http-equiv=\"refresh\" content=\"10\">"); //stránka se načte automaticky jednou za 3 s
          client.println("</body>");
          client.println("</html>");         

          //ukončí přenos
          client.stop();
          Serial.println(buffer);
                     }
                         }
                              }

}
Naposledy upravil(a) jiri255 dne 16 kvě 2015, 08:16, celkem upraveno 1 x.
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#2 Příspěvek od Cowley »

A na cem to beha? Na Arduino UNO?

Mel jsem 10 virtualnich tlacitek na UNO a vubec to nesestavilo HTML stranku.
Dal jsem to na MEGA a tam to slape OK.
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#3 Příspěvek od jiri255 »

jede to na Arduino Mega
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#4 Příspěvek od Cowley »

Ale do HIGH jde podle podminky jen kdyz je teplota mensi 28
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#5 Příspěvek od jiri255 »

jo to je možné zkoušel jsem to, tak i tak ale na zvýšení nebo snížení teploty to relé nereaguje
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#6 Příspěvek od Cowley »

Mas ten IF s merenim 28<teplota ve smycce za ctenim z webu. Musis ho dat jinam

Dej ho treba za druhej radek serial.println (teplota1) ve smycce loop

A Taky nevidim nikde znovunacteni a opakovane mereni a naplnovani hodnoty (teplota1) v prubehu smycky Loop
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#7 Příspěvek od jiri255 »

toho jsem si vůbec nevšiml :-( ,že teplota1 je pořád stejná a nemění se :-(,
až když jsem si to vložil do web stránky

Kód: Vybrat vše

          client.println("Teplota2:");
          client.println("</br>");         
          client.println(teplota1);     

...já ji vlastně nemám v loop :? ...stačilo tedy

float teplota1 = teplomer1();

vložit do loop a už to šlape přesně jak má :-)

Kód: Vybrat vše

void loop()
{
  float teplota1 = teplomer1();
  Serial.print("Teplota-1: ");
     Serial.println(teplota1);


Děkuji mnohokrát teď už je to OK přesně to o co mi šlo :D
Naposledy upravil(a) jiri255 dne 16 kvě 2015, 19:05, celkem upraveno 1 x.
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#8 Příspěvek od Cowley »

Rado se stalo...
Sdilena starost, polovicni starost :)
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“