Close

Řídící jednotka pro peletový kotel

Úvodní stránka Fórum Vaše projekty Arduino Řídící jednotka pro peletový kotel

  • Toto téma obsahuje celkem 112 odpovědí. Do diskuze (6 diskutujících) se naposledy zapojil uživatel johnyhol a poslední změna proběhla před 7 roky a 11 měsíci.
Aktuálně je na stránce zobrazeno 23 příspěvků - 91. až 113. (celkem z 113)
  • Autor
    Příspěvky
  • #9561
    johnyhol
    Účastník

    To posjirka: po připojení relé jsem zjistil, že mi to při jakýmkoliv zápisu(LCD) do smyčky hází poruchu a relé cvakají jako o život. Takže tam je asi problém. Jinak odpověď na otázku: `předpokládám, že se ti ve smyčce nic nezobrazuje a zobrazí se tit o až op sepnutí termostatu. („FOTOBUNKA“).
    Vidím tu problém ten, že ve smyčce LOOP() není žádná prodleva pro LCD a tak když se nic nedej neustále se maže a zobrazuje LCD.`
    je, že to nikdy nic nezobrazilo, jenom hodnotu ze setupu: „NAST.VSTUPY/VYST“.

    Ještě mě napadlo udělat to zobrazování pomocí funkce „SerialDisplay“ z příkladů v Arduino IDE. (tzn. zobrazovat už vytvořený popisy jednotlivých stavů ze seriový linky) Zkoušel jsem to tedy zakompilovat do kódu, ale to taky nic nedělalo. (nezobrazovalo) Pak jsem tedy zkusil udělat test přímo v příkladu z IDE, ale tam to taky nefunguje. Nechápu to! Máte s tím někdo zkušenosti?
    Tady je ta zkouška:

    
    // include the library code:
    #include <LiquidCrystal.h>
    
    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    void setup() {
      // set up the LCD's number of columns and rows:
      lcd.begin(16, 2);
      // initialize the serial communications:
      Serial.begin(9600);
      
    }
    
    void loop() {
      Serial.println("TEST ZOBRAZENI");
      // when characters arrive over the serial port...
      if (Serial.available()) {
        // wait a bit for the entire message to arrive
        delay(100);
        // clear the screen
        lcd.clear();
        // read all the available characters
        while (Serial.available() > 0) {
          //lcd.setCursor(0, 0);
          // display each character to the LCD
          lcd.write(Serial.read());
        }
      }
    }
    

    Díky všem za reakce!

    #9562
    posjirka
    Účastník

    vezmu to od konce.
    Test LCD funguje tak, že že ho nahraješ do arduina, otevřeš si v Arduino IDE serial monitor a píšeš, co chceš aby se ti zobrazilo na LCD.
    Občas tam bývá chyba bu´d ve špatně nsatvené rychlosti komunikace, nebo nemáš zapnuté „new line“ a program ti nedetekuje správně to co jsi psal.

    K tomu hlavnímu programu.ukážu ti část programu a musí ti to být jasné:

    // nastaveni pinu displeje
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    #define davkovaniPelet 2 //davkovani pelet snek
    #define spirala 3 //zapalovaci spirala
    #define ventilator 5 //ventilator
    #define alarm 6 //signalizace poruchy
    #define kotlovyTermostat 8 //kotlovy termostat

    používáš ty samé piny jak pro relé tak pro komuniakce i s LCD. to nejde. musíš použít každý zvláš´t. Mě to trklo až když si napsal, že ti cvakají relátka 🙂

    #9866
    johnyhol
    Účastník

    Ahoj. Takže předešlý problém s konfliktem pinů LCD jsem díky tobě vyřešil a zobrazování na displeji už mám taky zhruba hotový. Už jsem se chystal, že se tu s tím jak jsem to vyřešil pochlubím, ale narazil jsem na další problém. Když jsem nasadil Ethernet schield, tak jsem narazil na stejný problém s konfliktem pinů, tentokrát mezi LCD a Ethernetem. Zkoušel jsem hledat jak to vyřešit, ale ani po dvou dnech zkoušení se nic nepovedlo. Mám displej schield který používá piny 4,5,6,7,8,9,10+A0 pro tlačítka a ethernet schield s piny 10,11,12,13 a 4 pro SD. Dočetl jsem se, že se dá použít jiná knihovna a displej ovládat přes jinou sběrnici, ale to co jsem zkoušel tak se mi stejně nedaří. Nemohl bys mi s tím ještě poradit?
    Díky

    #9869
    posjirka
    Účastník

    a nepřemýšlel si o WIFI řešení.

    #9870
    johnyhol
    Účastník

    pro tuhle aplikaci ne, protože to bude zavřený v kovový bedně hořáku a je to úplně dole v baráku kde je špatnej signál.

    #9892
    johnyhol
    Účastník

    Takže jsem opět zkoušel co se dalo a pořád bez úspěchu. Ale jít to nějak musí, je o tom dost napsáno, měly by se podle všeho používat pouze analogový piny.
    Mám tenhle modul:

    
    https://www.aliexpress.com/item/1PCS-LCD-Keypad-Shield-LCD1602-LCD-1602-Module-Display-For-Arduino-ATMEGA328-ATMEGA2560-raspberry-pi-UNO/32708117706.html?spm=2114.13010608.0.0.NIogpr
    
    #9893
    posjirka
    Účastník

    rozhodně to jde. Ale né tak jak si představuješ. nevím o knihovně, která by dokázalo překecat LCD shield pro fungování přes pár pinů. To co čteš ( podle všeho používat pouze analogový piny) ukazuje spíš najiný přístup k LCD. využívá se tzv I2C/TWI sběrnice, která přes převodník komunikuje s LCD. použítá to na UNU piny A4/A5. Každopádně to nejde na tvém shieldu. musel bys udělat jiný shield. Koupit to jako shiel tuším nejde. jde koupit pouze moduly :
    http://www.santy.cz/moduly-c22/arduino-lcd-1602-16×2-modul-shield-mega-nano-i2c-redukce-seriovy-serial-2560-i52/

    použití pinu 11/12/13 je pro isp komunikaci , která umožnujě až 3 zařízení na stejných pinech. fígl je v tom, že tyto piny jsou komunkační a zavolání, které zařízení se má používat se děje tak, že tyto zařízení mají vstupy CE na nějákém dalším pinu (každé zařízení jiný pin) a sepnutím toho pinu aktivuješ dané zařízení. To je ten pin 10 na ethernet shield. Tak fungují zařízení ISP, LCD display toto rozhraní nepoužívá a blokuje piny.

    resumé:
    1. budˇdáš LCD na jiné piny,nevím kolik jich máš ještě volných
    2. dáš LCD na I2C sběrnici + A0 pro talčítka
    3. použiješ jnou sběrnici než ethernet (RS485, Bluetooth, 1-wire – prostě něco co používá UART piny 0/1)

    v každém případě je na čase podívat se na Arduino MEGA, už jen pro volné piny.

    #9894
    johnyhol
    Účastník

    To jsem si myslel, že to s tím mým schieldem takto nerozchodím. Všechny ty návody taky byly (jak píšeš) na displej+převodník. Jinak na Mega už jsem musel přejít před časem (paměť + piny). Ještě mě napadlo (a to asi udělám), že prostě přeruším u displeje pin 4+10 a přemostím je třeba na ty A4+A5. To by mělo fungovat, né?

    #9895
    posjirka
    Účastník

    nepujde. LCD nemá komunikaci přes ISP a tak bude dělat nesymsly.

    #9896
    johnyhol
    Účastník

    Ani přes jiný digitální piny? (třeba D2+D3)

    #9898
    posjirka
    Účastník

    ??? co tam chceš připojit na d2/3 ??

    #9899
    johnyhol
    Účastník

    No přerušit u displeje pin 4+10 a přemostit je třeba na ty D2+D3 a v kódu změnit nastavení:

    
    LiquidCrystal lcd(8, 9, 2, 5, 6, 7);
    

    ale nevím co s tou desítkou?

    #9900
    ArduXPP
    Účastník

    Když je problém z nedostatku pinů , tak stačí použít toto – https://www.ptshop.cz/Modul-I2C-pro-LCD-1602-d15.htm .

    #9901
    johnyhol
    Účastník

    Jasně, na to jsem při mým bádání taky narazil, ale já bych to chtěl vyřešit se stávajícím LCD schieldem. Myslíš tedy, že by to tak jak píšu (se záměnou pinů) nešlo?

    #9902
    posjirka
    Účastník

    ale šlo by to řešit, jen bys musel použít totálně jiné piny. Nikoliv sdílené.
    Sdílené piny jsuo pro ISP komunikaci, LCD shield tuto funkci nemá, takže jí nemůže používat. musel bys s MEGA použít třeba piny úplně od jinud (D30 a víc)

    #9903
    johnyhol
    Účastník

    Aha, tak já to tedy večer zkusím a dám vědět. Zatím moc díky!

    #9905
    johnyhol
    Účastník

    Takže jsem přemostil pin D4 z LCD na D30, přerušil cestu k D10 a vyzkoušel, co to bude dělat. Když jsem to zkoušel na nečisto jenom s testovacím prográmkem „hello, world!“ tak to fungovalo a dokonce k mýmu překvapení i svítilo podsvícení.(myslel jsem, že když je přerušený vývod na D10, že to nebude svítit – nechápu) Tak jsem to tedy zkusil přímo v prográmku pro řídící jednotku a tam už to začalo trochu zlobit. Nevím, jestli je to tím, že je přerušený ten pin D10, nebo jestli nezlobí napojení na Exosite. (jestli jsem to dobře doplnil do kódu – do správný části) Mělo by se to chovat tak, že když zapnu napájení tak by se to mělo připojit na Exosite (odeslat hodnoty z čidla teploty a fotobuňky) a pak normálně naběhnout program pro kotel. Mně to někdy funguje normálně, ale většinou se po chvíli asi sekne procesor (zastaví se sériová komunikace a na displeji svítí pořád „nastavuji vstupy/výstupy“) a pomůže jenom vypnout/zapnout napájení.
    Tady poslední kód:

    
    // REGULACE PELETKOVEHO KOTLE
    // author. Johnyhol & by JP
    // v 5_1_2017
    
    // changelog
    // v 5_1_2017
    // zmena pinu LCD (4->30)
    // v 4_1_2017 
    // pridani mereni teploty a vystupu na Exosite
    // v 2_1_2017
    //   zmena desky na MEGA
    //   precislovani pinu kvuli displeji a ethernetu
    //   doplneny/zmeneny komentare
    // v 16_12_2016
    //   precislovani pinu kvuli displeji
    //   testovani displeje
    // v 13_11_2016
    //   zrusena reakce na prostorovy termostat -> není potreba, reseno jiz v kotli
    // v 10_11_2016
    //   uprava seriove komunikace -> pridani casovacu jednotlivych funkci 
    // v 5_11_2016
    //   zmena casu - upraveno pro realny provoz
    // v 4_11_2016
    //   zmena vsech vystupu na rele
    // v 14_5_2016
    //   precislovani pinu
    //   zmena funkce fotobunky z digitalu na analog
    //   dolpneni seriove komunikace o hodnotu fotobunky 
    // v 30_3_2016
    //   oprava funkce tlacitka kvitace poruchy -> HIGH->LOW
    //   umazani parametru "long cas=13000;" -> jiz neni potreba
    //   umazani parametru "//delay(84000); //pockej 84s" u funkce dohoreni -> jiz neni potreba
    //   umazani parametru "//delay(12000); //po dobu 12s" u funkce davkovani zapalovaci davky pelet -> jiz neni potreba
    //   umazani parametru "//if(digitalRead(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){  // prostorovy  nebo  kotlovy termostat vypne" u funkce zapaleni
    //   drobne upravy textu/popisu jednotlivych parametru/funkci
    // v 27_3_2016
    //   uprava procesu zapalovani - nebude reagovat na prostorovy termostat
    //   uprava dlouhych delayu na smycky,  pro vyuziti watchdogu - autoreset pri zaseknuti procesou - doba nez se resetuje = 8s
    //   nastaveni definice poruch pro pozdejsi vyuziti
    // v22_3_2016
    //   uprava ladicich textu pro termostaty
    // v21_3_2016
    //   presunuti testuPlamene pouze do smycky udrzuj horeni
    //   doplneni textu do testu horeni
    //   oprava textu zprav
    //   zruseni diakritiky
    //   zapnuti alarmu pri vyskytu poruchy
    // v20_3_2016
    //   slouceni podminenych funkci  
    //   vypnuti zhaveni pri rozepnuti termostatu (kotlovy nebo prostorovy)
    //   rozdeleni funkci do vlastnich funkcnich bloku
    //   zapojeni seriove komunikace pro odladeni funkci 
    // v16_3_2016
    //   uprava podminky smycek (zruseno =)
    //   posun zpozdeni 5s z procesu zapaleni na jeho konec
    //   doplnena podminka reakce na termostaty (kotlovy/prostorovy) v procesu zapaleni
    //   upravena doba na 1 zapalovaci proces - nastavitelna trimrem na analog.vstupu A0. v rozsahu 60 - 600 s = 1 - 10 min. - nastaveni pouze v dobe necinosti kotle
    //   nastaveni poruchy a jeji kvitance tlacitkem na pinu 9
    
    // definice poruch
    // bit  funkce
    // 0    prehrati kotle pri zapalovani
    // 1    ztrata plamene pri horeni
    // 2    volne
    // 3    volne
    // 4    volne
    // 5    volne
    // 6    volne
    // 7    volne
    
    // knihovna watchdogu
    #include <avr/wdt.h>
    // knihovna displeje
    #include <LiquidCrystal.h>
    #include <EEPROM.h>
    #include <SPI.h>
    #include <Ethernet.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Exosite.h>
    
    // nastaveni pinu displeje
    LiquidCrystal lcd(8, 9, 30, 5, 6, 7);
    
    #define davkovaniPelet 22 //davkovani pelet snek
    #define spirala 24 //zapalovaci spirala
    #define ventilator 26 //ventilator
    #define alarm 28 //signalizace poruchy
    #define kotlovyTermostat 2 //kotlovy termostat
    #define fotobunka 55 //fotobunka pro kontrolu plamene DI55 = A1 pro arduino MEGA
    #define trimr1 56 // nastaveni doby zapaleni  DI56 = A2 pro arduino MEGA
    #define tlacitkoKvitance 3 // pin tlacitka kvitance poruchy
    #define ONEWIRE 23 //pin pro mereni teploty
    #define REPORT_TIMEOUT 30000 //milliseconds period for reporting to Exosite.com
    #define SENSOR_READ_TIMEOUT 5000 //milliseconds period for reading sensors in loop
    //pin DI54 = A0 -> rezervace pro tlacitka displeje
    //pin D13 -> rezervace pro Ethernet Schield
    //pin D12 -> rezervace pro Ethernet Schield
    //pin D11 -> rezervace pro Ethernet Schield
    //pin D10 -> rezervace pro Ethernet Schield + pro podsviceni displeje(prerusene)
    //pin D4 -> rezervace pro SD kartu
    //pin D1 -> rezervace pro seriovou linku
    //pin D0 -> rezervace pro seriovou linku
    
    OneWire oneWire(ONEWIRE);
    DallasTemperature sensors(&oneWire);
    
    //String cikData = "6c1d94611bda02dbaa5cc6640218cd0360088b7f";  // <-- FILL IN YOUR CIK HERE! (https://portals.exosite.com -> Add Device)
    byte macData[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };        // <-- Fill in your Ethernet shield's MAC address here.
    
    // Enter your Unique Identifier code here
    char unique_id[11] = "0020024A24"; // <-- Generated from Adding your device in portals.exosite.com
    
    // Use these variables to customize what datasources are read and written to.
    const String readString = "d25";
    
    // Number of Errors before we try a reprovision.
    const unsigned char reprovisionAfter = 3;
    
    unsigned char errorCount = reprovisionAfter;  // Force Provision On First Loop
    char macString[18];  // Used to store a formatted version of the MAC Address
    
    EthernetClient client;
    //Exosite exosite(cikData, &client);
    Exosite exosite(&client);
    
    String tempString;
    int index = 0;
    int lastIndex = -1;
    float tempC;
    
    int smycka1 = 0; // pomocna smycka - zapaleni
    int smycka1max = 720; // max.pomocne smycky - ted jiz nastavitelne trimrem na A2 60-720s
    int smycka2 = 0; // pomocna smycka - udrzeni horeni
    int smycka2max = 2; // max.pomocne smycky
    int smycka3 = 0; // pomocna smycka - pocet pokusu o zapaleni
    int smycka3max = 2; // max.pomocne smycky
    int smycka4 = 0; // pomocna smycka - davkovani zapalne davky pelet
    int smycka4max = 10; // max.pomocne smycky
    int smycka5 = 0; // pomocna smycka - rozhoreni
    int smycka5max = 5; // max.pomocne smycky
    int smycka6 = 0; // pomocna smycka - dohoreni
    int smycka6max = 84; // max.pomocne smycky
    byte porucha = 0; // promenna pro zaznam poruchy
    int ldr = 1; //analogovy pin kde je pripojen fotorezistor
    int ldr_value = 0; //promenna pro zaznam hodnot z fotorezistoru
    
    void setup() {
      // nastav seriovou komunikaci na rychlost 9600 bd 
      Serial.begin(9600);
      Serial.println("Boot");
      pinMode(25, OUTPUT); //assume using D25 as output to control remotely
      
      // Start up the OneWire Sensors library
      sensors.begin();
      delay(1000);
      Serial.println("Starting Exosite Temp Monitor");
      Serial.print("OneWire Digital Pin Specified: ");
      Serial.println(ONEWIRE);
      Ethernet.begin(macData);
      // wait 3 seconds for connection
      delay(3000);
      
      Serial.println("Nastavuji vstupy/vystupy"); // ladici seriova komunikace
      lcd.begin(16, 2); // nastaveni displeje
      lcd.print("NAST.VSTUPY/VYST"); // zobrazeni na displeji
      lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("VYPINAM VS. RELE"); // zobrazeni na displeji
      delay (2000);
      pinMode(davkovaniPelet, OUTPUT);
      pinMode(spirala, OUTPUT);
      pinMode(ventilator, OUTPUT);
      pinMode(alarm, OUTPUT);
      pinMode(kotlovyTermostat, INPUT);
      pinMode(fotobunka, INPUT);
      pinMode(trimr1, INPUT);
      pinMode(tlacitkoKvitance, INPUT);
      // vsechno vypni
      vypniVse();
            // nastav watchdog na 8s
            wdt_enable(WDTO_8S);
    }
    
    void loop() {
            wdt_reset(); // resetuj watchdog
      static unsigned long sendPrevTime = 0;
      static unsigned long sensorPrevTime = 0; 
      char buffer[7];
      String readParam = "";
      String writeParam = "";
      String writeString = "";
      String returnString = "";
      index = 0;
      lastIndex = -1;
    
       // Check if we should reprovision.
      if (errorCount >= reprovisionAfter) {
        if (exosite.provision("exosite", "ard-generic", unique_id)) {
          errorCount = 0;
        }
      }
        String uptime_str = String(millis()/1000);
      writeString += "uptime="+ uptime_str;
    
        //GET ANALOG 1 VALUE
      //get average of a number of readings
      int avgValue=0;
      int readings = 0;
      unsigned long avgTot = 0;
      int avgCnt = 0;
    
      while(readings<10)
      {
        avgTot += analogRead(A1);
        avgCnt += 1;
        avgValue = avgTot/avgCnt;
        readings++;
      }
      String analog1_str = String(avgValue);
      writeString += "&a1="+ analog1_str;
      
    //Make Write and Read request to Exosite Platform
      Serial.println("---- Do Read and Write ----");
      if (exosite.writeRead(writeString, readString, returnString)) {
        Serial.println("OK");
        Serial.print("Returned: ");
        Serial.println(returnString);
        Serial.println("Parse out dataport alias values");
        errorCount = 0;
        for(;;){
          index = returnString.indexOf("=", lastIndex+1);
          if(index != 0){
            String alias = "";
            tempString = returnString.substring(lastIndex+1, index);
            Serial.println(tempString);
            lastIndex = returnString.indexOf("&", index+1);
            alias = tempString;
            if(lastIndex != -1){
              tempString = returnString.substring(index+1, lastIndex);
            }else{
              tempString = returnString.substring(index+1);
            }
            
            
            if (alias == "d25"){
              if(tempString == "1"){
                digitalWrite(25, 1);
                Serial.println("set Digital25 to 1");
              }else if(tempString == "0"){
                digitalWrite(25, 0);
                Serial.println("set Digital25 to 0");
              }else{
                Serial.println(tempString);
              }
            } else if (alias == "msg"){
              Serial.print("Message: ");
              Serial.println(tempString);
            } else {
              Serial.println("Unknown Alias Dataport");
            }
       
            if(lastIndex == -1)
              break;     
            
          }else{
            //Serial.println(F("No Index"));
            break;
          }
        }
        
      } else {
        Serial.println("No Connection");
        errorCount++;
      }
    
      Serial.print("."); // print to show running
     
     // Read sensor every defined timeout period
      if (millis() - sensorPrevTime > SENSOR_READ_TIMEOUT) {
        Serial.println();
        Serial.println("Requesting temperature...");
        sensors.requestTemperatures(); // Send the command to get temperatures
        tempC = sensors.getTempCByIndex(0);
        Serial.print("Celsius:    ");
        Serial.print(tempC);
        Serial.println(" C ..........DONE");
      
        sensorPrevTime = millis();
      }
     
      // Send to Exosite every defined timeout period
      if (millis() - sendPrevTime > REPORT_TIMEOUT) {
        Serial.println(); //start fresh debug line
        Serial.println("Sending data to Exosite...");
        
        readParam = "";        //nothing to read back at this time e.g. 'control&status' if you wanted to read those data sources
        writeParam = "temp="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
        
        String tempValue = dtostrf(tempC, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2
        
        writeParam += tempValue;    //add converted temperature String value
        
        //writeParam += "&message=hello"; //add another piece of data to send
    
        if ( exosite.writeRead(writeParam, readParam, returnString)) {
          Serial.println("Exosite OK");
          if (returnString != "") {
            Serial.println("Response:");
            Serial.println(returnString);
          }
        }
        else {
          Serial.println("Exosite Error");
        }
     
        sendPrevTime = millis(); //reset report period timer
        Serial.println("done sending.");
      }
      delay(1000); //slow down loop
            
            ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace
      smycka1max = map(analogRead(trimr1), 0, 1024, 60, 720); // nastaveni doby zapaleni trimrem na A2
      if(digitalRead(kotlovyTermostat) == HIGH){  // kotlovy termostat je zapnuty
              Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace
              lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
              lcd.print("TERMOSTAT ZAPNUT"); // zobrazeni na displeji
      delay (2000);
          // startovaci davka pelet
          //------------------------
          zapalovaciDavkaPelet();
          
          // proces zapaleni
          //----------------
          zapaleni();
          
          // test poruchy
          // -----------------
          //testPlamene(); 
          
          // udrzeni horeni
          //--------------
          udrzujHoreni();
          
          // dohoreni
          //---------
          dohoreni();
        } else {
          Serial.println("Kotlovy/Prostorovy termostat vypnut"); // ladici seriova komunikace
          lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("TERMOSTAT VYPNUT"); // zobrazeni na displeji
          }
      // kvitence pripadne poruchy
      //-------------------------------
      kvitancePoruchy();
    }
    
    void vypniVse() {
      // funkce vypni vse
      Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
      digitalWrite(spirala, HIGH); //vypni zhaveni
      digitalWrite(ventilator, HIGH); //vypni ventilator
    }
    
    void zapalovaciDavkaPelet() {
      // prvotni davkovani pelet pro zapaleni
      Serial.println("Davkuji pelety pro zapaleni ... 110s"); // ladici seriova komunikace
      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("ST.DAVKA        "); // zobrazeni na displeji
      digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            for (smycka4 = 0;  smycka4 < smycka4max; smycka4 ++){
        delay(1000); 
              wdt_reset(); // resetuj watchdog
      Serial.print("Stav: ");
      Serial.print(smycka4);
      Serial.print("s/");
      Serial.print(smycka4max);
      Serial.println("s ");
      lcd.setCursor(9, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print(smycka4);
      lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("/"); // zobrazeni na displeji
      lcd.print(smycka4max);
              }
      digitalWrite(davkovaniPelet, HIGH); //potom vypni davkovani
      digitalWrite(ventilator, LOW); //zapni ventilator
      digitalWrite(spirala, LOW); //zapni zhaveni
    }
    
    void zapaleni() {
      // funkce zapaleni pelet
      // 2 pokusy o zapaleni
      Serial.println("Spoustim zapaleni ..."); // ladici seriova komunikace
      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("ZAPALENI        "); // zobrazeni na displeji
      for (smycka3 = 0;  smycka3 < smycka3max; smycka3 ++){
        // smycka "1-10" minut zapalovani
        for (smycka1 = 0;  smycka1 < smycka1max; smycka1 ++){
                            wdt_reset(); // resetuj watchdog
          Serial.print("Pokus o zapaleni "); // ladici seriova komunikace
          Serial.print(smycka3); // ladici seriova komunikace
          Serial.print("/"); // ladici seriova komunikace
          Serial.println(smycka3max); // ladici seriova komunikace
          Serial.print("Stav: "); // ladici seriova komunikace
          Serial.print(smycka1); // ladici seriova komunikace
          Serial.print("s/"); // ladici seriova komunikace
          Serial.print(smycka1max); // ladici seriova komunikace
          Serial.println("s "); // ladici seriova komunikace
          lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("POKUS           "); // zobrazeni na displeji
          lcd.setCursor(6, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print(smycka3);
          lcd.setCursor(7, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("/"); // zobrazeni na displeji
          lcd.print(smycka3max);
          lcd.setCursor(9, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print(smycka1);
          lcd.print("  "); // zobrazeni na displeji
          lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("/"); // zobrazeni na displeji
          lcd.print(smycka1max);
                            
          if(digitalRead(kotlovyTermostat) == LOW){ // kotlovy termostat vypne
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3
            Serial.println("Rozepnuti termostatu ..."); // ladici seriova komunikace
                                    bitSet(porucha,0); // nastav poruchu bit c.0 na "1"
          }
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3 
            Serial.println(" hori ...");   // ladici seriova komunikace
            Serial.println("Rozhoreni ... 50s ");
            lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("ROZHORENI       "); // zobrazeni na displeji
            lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("HORI...         "); // zobrazeni na displeji
                    
          } else {
            Serial.println(" nehori ...");   // ladici seriova komunikace 
          }
          delay(1000);
        }
                    for (smycka5 = 0;  smycka5 < smycka5max; smycka5 ++){
                delay(1000); 
                      wdt_reset(); // resetuj watchdog
            Serial.print("Stav: ");
            Serial.print(smycka5);
            Serial.print("s/");
            Serial.print(smycka5max);
            Serial.println("s ");
            lcd.setCursor(10, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print(smycka5);
            lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("/"); // zobrazeni na displeji
            lcd.print(smycka5max);
                    }
        //delay(5000); //cekej 5s
      }
    }
    
    void udrzujHoreni() {
      // funkce udrzeni horeni
      ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      Serial.println("Udrzeni horeni ..."); // ladici seriova komunikace
      for (smycka2 = 0;  smycka2 < smycka2max; smycka2 ++){
                    wdt_reset(); // resetuj watchdog
        smycka2 = 0; // vynuluj smycku
        if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
                      Serial.println("Test plamene ... hori"); // ladici seriova komunikace
                      Serial.println("Davkuji pelety ... ");
                      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
                      lcd.print("DAVKOVANI       "); // zobrazeni na displeji
            digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            Serial.println("Pauza ... ");
            lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("HORENI          "); // zobrazeni na displeji
            digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
          } else {
            delay(1000); // pocekej jeste 1s a zkus to znovu
            if(analogRead(fotobunka) >= 500){  //pokud fotobunka nevidi plamen
                                    Serial.println("Test plamene ... porucha"); // ladici seriova komunikace
                                    //lcd.clear(); // smaze displej pred dalsi smyckou
                                    lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
                                    lcd.print("NEHORI - PORUCHA"); // zobrazeni na displeji
      //delay (500);
                                    smycka2 = smycka2max; // ukonci smycku
                        //porucha = 1; // nastav poruchu
                                    bitSet(porucha,1); // nastav poruchu bit c.1 na "1"
                                    digitalWrite(alarm, LOW); // zapni alarm
            }
          }
        } else {
          smycka2 = smycka2max; // ukonci smycku
        }  
      }
    }
    
    void dohoreni() {
      // funkce dohoreni
      Serial.println("Dohoreni ... 840s "); // ladici seriova komunikace
      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("DOHORENI        "); // zobrazeni na displeji
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani pelet
      digitalWrite(spirala, HIGH); //vypni zhaveni - pro jistotu
      
            for (smycka6 = 0;  smycka6 < smycka6max; smycka6 ++){
      Serial.print("Stav: ");
      Serial.print(smycka6);
      Serial.print("s/");
      Serial.print(smycka6max);
      Serial.println("s ");
      lcd.setCursor(9, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print(smycka6);
      lcd.print("  "); // zobrazeni na displeji
      lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("/"); // zobrazeni na displeji
      lcd.print(smycka6max);
        delay(1000); 
              wdt_reset(); // resetuj watchdog
            }
      digitalWrite(ventilator, HIGH); //vypni ventilator
      
    }
    
    void kvitancePoruchy() {
      // funkce kvitance poruchy
      
      if(porucha > 0 ){ // kdyz je porucha aktivni
            Serial.println("Kvitance poruchy ..."); // ladici seriova komunikace
        // vypni vse
        vypniVse();
        while (digitalRead(tlacitkoKvitance) == LOW) { // zapni alarm a cekej na stisk tlacitka
          digitalWrite(alarm, LOW); // zapni alarm
          Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace
          lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("CEKAM NA KVITACI"); // zobrazeni na displeji
                              wdt_reset(); // resetuj watchdog
        }
        Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace
        digitalWrite(alarm, HIGH); // vypni alarm
        porucha = 0; // vynuluj poruchu
      } else {  // jinak 
        Serial.println("Zadna porucha  ..."); // ladici seriova komunikace
        lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
        lcd.print("ZADNA PORUCHA..."); // zobrazeni na displeji
          digitalWrite(alarm, HIGH); // vypni alarm
    }
    }
    
    #9921
    posjirka
    Účastník

    z dálky se tžko radí. nevím kde jsi přerušil D10. V aruinui nebo na LCd shieldu?
    Teď je třeba to odladit. Mě většinou pomůže zapojit na volný pin LED diodu (spíš používá D13 s LEDkou na desce), úplně na začátku jí dám na LOW a v dalším kroku dám HIGH. Když se LED rozsvítí a přesto se program kousne posunu příkay HIGH o pár řádků dolu. No a když se program kousne a LED nesvítí tak víš co ti to blokuje a můžeš pátrat.

    #9954
    johnyhol
    Účastník

    Ahoj, tak jsem udělal několik testů pro odhalení závady.
    1) jsem nahrál zpátky poslední funkční program (pouze jsem upravil/zaměnil LCD pin D4 za D30) bez měření teploty a výstupu na Exosite -> to fungovalo bez problémů
    2) jsem zkusil pouze měření teploty a výstup na Exosite -> taky bez problémů
    3) jsem zkusil znovu spojený program kotel + exosite -> a tady už byl zase problém – seknutý procesor
    Takže problém bude asi to, že jsem přidal do funkčního kódu tu část pro měření teploty a výstup na Exosite na špatný místo a proto se to mezi sebou hádá. Zkus na to prosím mrknout jak by se to dalo spojit, aby to nedělalo neplechu.
    Tady poslední funkční kód (pouze regulace kotle s LCD):

    
    // REGULACE PELETKOVEHO KOTLE
    // author. Johnyhol & by JP
    // v 2_1_2017
    
    // changelog
    // v 2_1_2017
    //   zmena desky na MEGA
    //   precislovani pinu kvuli displeji a ethernetu
    //   doplneny/zmeneny komentare
    // v 16_12_2016
    //   precislovani pinu kvuli displeji
    //   testovani displeje
    // v 13_11_2016
    //   zrusena reakce na prostorovy termostat -> není potreba, reseno jiz v kotli
    // v 10_11_2016
    //   uprava seriove komunikace -> pridani casovacu jednotlivych funkci 
    // v 5_11_2016
    //   zmena casu - upraveno pro realny provoz
    // v 4_11_2016
    //   zmena vsech vystupu na rele
    // v 14_5_2016
    //   precislovani pinu
    //   zmena funkce fotobunky z digitalu na analog
    //   dolpneni seriove komunikace o hodnotu fotobunky 
    // v 30_3_2016
    //   oprava funkce tlacitka kvitace poruchy -> HIGH->LOW
    //   umazani parametru "long cas=13000;" -> jiz neni potreba
    //   umazani parametru "//delay(84000); //pockej 84s" u funkce dohoreni -> jiz neni potreba
    //   umazani parametru "//delay(12000); //po dobu 12s" u funkce davkovani zapalovaci davky pelet -> jiz neni potreba
    //   umazani parametru "//if(digitalRead(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){  // prostorovy  nebo  kotlovy termostat vypne" u funkce zapaleni
    //   drobne upravy textu/popisu jednotlivych parametru/funkci
    // v 27_3_2016
    //   uprava procesu zapalovani - nebude reagovat na prostorovy termostat
    //   uprava dlouhych delayu na smycky,  pro vyuziti watchdogu - autoreset pri zaseknuti procesou - doba nez se resetuje = 8s
    //   nastaveni definice poruch pro pozdejsi vyuziti
    // v22_3_2016
    //   uprava ladicich textu pro termostaty
    // v21_3_2016
    //   presunuti testuPlamene pouze do smycky udrzuj horeni
    //   doplneni textu do testu horeni
    //   oprava textu zprav
    //   zruseni diakritiky
    //   zapnuti alarmu pri vyskytu poruchy
    // v20_3_2016
    //   slouceni podminenych funkci  
    //   vypnuti zhaveni pri rozepnuti termostatu (kotlovy nebo prostorovy)
    //   rozdeleni funkci do vlastnich funkcnich bloku
    //   zapojeni seriove komunikace pro odladeni funkci 
    // v16_3_2016
    //   uprava podminky smycek (zruseno =)
    //   posun zpozdeni 5s z procesu zapaleni na jeho konec
    //   doplnena podminka reakce na termostaty (kotlovy/prostorovy) v procesu zapaleni
    //   upravena doba na 1 zapalovaci proces - nastavitelna trimrem na analog.vstupu A0. v rozsahu 60 - 600 s = 1 - 10 min. - nastaveni pouze v dobe necinosti kotle
    //   nastaveni poruchy a jeji kvitance tlacitkem na pinu 9
    
    // definice poruch
    // bit  funkce
    // 0    prehrati kotle pri zapalovani
    // 1    ztrata plamene pri horeni
    // 2    volne
    // 3    volne
    // 4    volne
    // 5    volne
    // 6    volne
    // 7    volne
    
    // knihovna watchdogu
    #include <avr/wdt.h>
    // knihovna displeje
    #include <LiquidCrystal.h>
    
    // nastaveni pinu displeje
    LiquidCrystal lcd(8, 9, 30, 5, 6, 7);
    
    #define davkovaniPelet 22 //davkovani pelet snek
    #define spirala 24 //zapalovaci spirala
    #define ventilator 26 //ventilator
    #define alarm 28 //signalizace poruchy
    #define kotlovyTermostat 2 //kotlovy termostat
    #define fotobunka 55 //fotobunka pro kontrolu plamene DI55 = A1 pro arduino MEGA
    #define trimr1 56 // nastaveni doby zapaleni  DI56 = A2 pro arduino MEGA
    #define tlacitkoKvitance 3 // pin tlacitka kvitance poruchy
    //pin DI54 = A0 -> rezervace pro tlacitka displeje
    //pin D13 -> rezervace pro Ethernet Schield
    //pin D12 -> rezervace pro Ethernet Schield
    //pin D11 -> rezervace pro Ethernet Schield
    //pin D10 -> rezervace pro Ethernet Schield + pro podsviceni displeje
    //pin D4 -> rezervace pro SD kartu + pro displej
    //pin D1 -> rezervace pro seriovou linku
    //pin D0 -> rezervace pro seriovou linku
    
    int smycka1 = 0; // pomocna smycka - zapaleni
    int smycka1max = 720; // max.pomocne smycky - ted jiz nastavitelne trimrem na A2 60-720s
    int smycka2 = 0; // pomocna smycka - udrzeni horeni
    int smycka2max = 2; // max.pomocne smycky
    int smycka3 = 0; // pomocna smycka - pocet pokusu o zapaleni
    int smycka3max = 2; // max.pomocne smycky
    int smycka4 = 0; // pomocna smycka - davkovani zapalne davky pelet
    int smycka4max = 10; // max.pomocne smycky
    int smycka5 = 0; // pomocna smycka - rozhoreni
    int smycka5max = 5; // max.pomocne smycky
    int smycka6 = 0; // pomocna smycka - dohoreni
    int smycka6max = 84; // max.pomocne smycky
    byte porucha = 0; // promenna pro zaznam poruchy
    int ldr = 1; //analogovy pin kde je pripojen fotorezistor
    int ldr_value = 0; //promenna pro zaznam hodnot z fotorezistoru
    
    void setup() {
      // nastav seriovou komunikaci na rychlost 9600 bd 
      Serial.begin(9600);
      Serial.println("Nastavuji vstupy/vystupy"); // ladici seriova komunikace
      lcd.begin(16, 2); // nastaveni displeje
      lcd.print("NAST.VSTUPY/VYST"); // zobrazeni na displeji
      lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("VYPINAM VS. RELE"); // zobrazeni na displeji
      delay (2000);
      pinMode(davkovaniPelet, OUTPUT);
      pinMode(spirala, OUTPUT);
      pinMode(ventilator, OUTPUT);
      pinMode(alarm, OUTPUT);
      pinMode(kotlovyTermostat, INPUT);
      pinMode(fotobunka, INPUT);
      pinMode(trimr1, INPUT);
      pinMode(tlacitkoKvitance, INPUT);
      // vsechno vypni
      vypniVse();
            // nastav watchdog na 8s
            wdt_enable(WDTO_8S);
    }
    
    void loop() {
            wdt_reset(); // resetuj watchdog
            ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace
      smycka1max = map(analogRead(trimr1), 0, 1024, 60, 720); // nastaveni doby zapaleni trimrem na A2
      if(digitalRead(kotlovyTermostat) == HIGH){  // kotlovy termostat je zapnuty
              Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace
              lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
              lcd.print("TERMOSTAT ZAPNUT"); // zobrazeni na displeji
      delay (2000);
          // startovaci davka pelet
          //------------------------
          zapalovaciDavkaPelet();
          
          // proces zapaleni
          //----------------
          zapaleni();
          
          // test poruchy
          // -----------------
          //testPlamene(); 
          
          // udrzeni horeni
          //--------------
          udrzujHoreni();
          
          // dohoreni
          //---------
          dohoreni();
        } else {
          Serial.println("Kotlovy/Prostorovy termostat vypnut"); // ladici seriova komunikace
          lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("TERMOSTAT VYPNUT"); // zobrazeni na displeji
          }
      // kvitence pripadne poruchy
      //-------------------------------
      kvitancePoruchy();
    }
    
    void vypniVse() {
      // funkce vypni vse
      Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
      digitalWrite(spirala, HIGH); //vypni zhaveni
      digitalWrite(ventilator, HIGH); //vypni ventilator
    }
    
    void zapalovaciDavkaPelet() {
      // prvotni davkovani pelet pro zapaleni
      Serial.println("Davkuji pelety pro zapaleni ... 110s"); // ladici seriova komunikace
      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("ST.DAVKA        "); // zobrazeni na displeji
      digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            for (smycka4 = 0;  smycka4 < smycka4max; smycka4 ++){
        delay(1000); 
              wdt_reset(); // resetuj watchdog
      Serial.print("Stav: ");
      Serial.print(smycka4);
      Serial.print("s/");
      Serial.print(smycka4max);
      Serial.println("s ");
      lcd.setCursor(9, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print(smycka4);
      lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("/"); // zobrazeni na displeji
      lcd.print(smycka4max);
              }
      digitalWrite(davkovaniPelet, HIGH); //potom vypni davkovani
      digitalWrite(ventilator, LOW); //zapni ventilator
      digitalWrite(spirala, LOW); //zapni zhaveni
    }
    
    void zapaleni() {
      // funkce zapaleni pelet
      // 2 pokusy o zapaleni
      Serial.println("Spoustim zapaleni ..."); // ladici seriova komunikace
      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("ZAPALENI        "); // zobrazeni na displeji
      for (smycka3 = 0;  smycka3 < smycka3max; smycka3 ++){
        // smycka "1-10" minut zapalovani
        for (smycka1 = 0;  smycka1 < smycka1max; smycka1 ++){
                            wdt_reset(); // resetuj watchdog
          Serial.print("Pokus o zapaleni "); // ladici seriova komunikace
          Serial.print(smycka3); // ladici seriova komunikace
          Serial.print("/"); // ladici seriova komunikace
          Serial.println(smycka3max); // ladici seriova komunikace
          Serial.print("Stav: "); // ladici seriova komunikace
          Serial.print(smycka1); // ladici seriova komunikace
          Serial.print("s/"); // ladici seriova komunikace
          Serial.print(smycka1max); // ladici seriova komunikace
          Serial.println("s "); // ladici seriova komunikace
          lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("POKUS           "); // zobrazeni na displeji
          lcd.setCursor(6, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print(smycka3);
          lcd.setCursor(7, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("/"); // zobrazeni na displeji
          lcd.print(smycka3max);
          lcd.setCursor(9, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print(smycka1);
          lcd.print("  "); // zobrazeni na displeji
          lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("/"); // zobrazeni na displeji
          lcd.print(smycka1max);
                            
          if(digitalRead(kotlovyTermostat) == LOW){ // kotlovy termostat vypne
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3
            Serial.println("Rozepnuti termostatu ..."); // ladici seriova komunikace
                                    bitSet(porucha,0); // nastav poruchu bit c.0 na "1"
          }
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3 
            Serial.println(" hori ...");   // ladici seriova komunikace
            Serial.println("Rozhoreni ... 50s ");
            lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("ROZHORENI       "); // zobrazeni na displeji
            lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("HORI...         "); // zobrazeni na displeji
                    
          } else {
            Serial.println(" nehori ...");   // ladici seriova komunikace 
          }
          delay(1000);
        }
                    for (smycka5 = 0;  smycka5 < smycka5max; smycka5 ++){
                delay(1000); 
                      wdt_reset(); // resetuj watchdog
            Serial.print("Stav: ");
            Serial.print(smycka5);
            Serial.print("s/");
            Serial.print(smycka5max);
            Serial.println("s ");
            lcd.setCursor(10, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print(smycka5);
            lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("/"); // zobrazeni na displeji
            lcd.print(smycka5max);
                    }
        //delay(5000); //cekej 5s
      }
    }
    
    void udrzujHoreni() {
      // funkce udrzeni horeni
      ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      Serial.println("Udrzeni horeni ..."); // ladici seriova komunikace
      for (smycka2 = 0;  smycka2 < smycka2max; smycka2 ++){
                    wdt_reset(); // resetuj watchdog
        smycka2 = 0; // vynuluj smycku
        if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
                      Serial.println("Test plamene ... hori"); // ladici seriova komunikace
                      Serial.println("Davkuji pelety ... ");
                      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
                      lcd.print("DAVKOVANI       "); // zobrazeni na displeji
            digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            Serial.println("Pauza ... ");
            lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
            lcd.print("HORENI          "); // zobrazeni na displeji
            digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
          } else {
            delay(1000); // pocekej jeste 1s a zkus to znovu
            if(analogRead(fotobunka) >= 500){  //pokud fotobunka nevidi plamen
                                    Serial.println("Test plamene ... porucha"); // ladici seriova komunikace
                                    //lcd.clear(); // smaze displej pred dalsi smyckou
                                    lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
                                    lcd.print("NEHORI - PORUCHA"); // zobrazeni na displeji
      //delay (500);
                                    smycka2 = smycka2max; // ukonci smycku
                        //porucha = 1; // nastav poruchu
                                    bitSet(porucha,1); // nastav poruchu bit c.1 na "1"
                                    digitalWrite(alarm, LOW); // zapni alarm
            }
          }
        } else {
          smycka2 = smycka2max; // ukonci smycku
        }  
      }
    }
    
    void dohoreni() {
      // funkce dohoreni
      Serial.println("Dohoreni ... 840s "); // ladici seriova komunikace
      lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("DOHORENI        "); // zobrazeni na displeji
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani pelet
      digitalWrite(spirala, HIGH); //vypni zhaveni - pro jistotu
      
            for (smycka6 = 0;  smycka6 < smycka6max; smycka6 ++){
      Serial.print("Stav: ");
      Serial.print(smycka6);
      Serial.print("s/");
      Serial.print(smycka6max);
      Serial.println("s ");
      lcd.setCursor(9, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print(smycka6);
      lcd.print("  "); // zobrazeni na displeji
      lcd.setCursor(12, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
      lcd.print("/"); // zobrazeni na displeji
      lcd.print(smycka6max);
        delay(1000); 
              wdt_reset(); // resetuj watchdog
            }
      digitalWrite(ventilator, HIGH); //vypni ventilator
      
    }
    
    void kvitancePoruchy() {
      // funkce kvitance poruchy
      
      if(porucha > 0 ){ // kdyz je porucha aktivni
            Serial.println("Kvitance poruchy ..."); // ladici seriova komunikace
        // vypni vse
        vypniVse();
        while (digitalRead(tlacitkoKvitance) == LOW) { // zapni alarm a cekej na stisk tlacitka
          digitalWrite(alarm, LOW); // zapni alarm
          Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace
          lcd.setCursor(0, 0); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
          lcd.print("CEKAM NA KVITACI"); // zobrazeni na displeji
                              wdt_reset(); // resetuj watchdog
        }
        Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace
        digitalWrite(alarm, HIGH); // vypni alarm
        porucha = 0; // vynuluj poruchu
      } else {  // jinak 
        Serial.println("Zadna porucha  ..."); // ladici seriova komunikace
        lcd.setCursor(0, 1); // (1 znak => sloupec,druhy znak => radek, prvni radek je 0)
        lcd.print("ZADNA PORUCHA..."); // zobrazeni na displeji
          digitalWrite(alarm, HIGH); // vypni alarm
    }
    }
    

    a tady kód pro měření teploty a napojení na Exosite:

    
    #include <EEPROM.h>
    #include <SPI.h>
    #include <Ethernet.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Exosite.h>
     
    // Pin use
    #define ONEWIRE 23 //pin to use for One Wire interface
    
    // Set up which Arduino pin will be used for the 1-wire interface to the sensor
    OneWire oneWire(ONEWIRE);
    DallasTemperature sensors(&oneWire);
     
    /*==============================================================================
    * Configuration Variables
    *
    * Change these variables to your own settings.
    *=============================================================================*/
    //String cikData = "6c1d94611bda02dbaa5cc6640218cd0360088b7f";  // <-- FILL IN YOUR CIK HERE! (https://portals.exosite.com -> Add Device)
    byte macData[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };        // <-- Fill in your Ethernet shield's MAC address here.
    
    // Enter your Unique Identifier code here
    char unique_id[11] = "0020024A24"; // <-- Generated from Adding your device in portals.exosite.com
    
    // Use these variables to customize what datasources are read and written to.
    const String readString = "d25";
    
    // Number of Errors before we try a reprovision.
    const unsigned char reprovisionAfter = 3;
    
    // User defined variables for Exosite reporting period and averaging samples
    #define REPORT_TIMEOUT 30000 //milliseconds period for reporting to Exosite.com
    #define SENSOR_READ_TIMEOUT 5000 //milliseconds period for reading sensors in loop
    
    /*==============================================================================
    * End of Configuration Variables
    *=============================================================================*/
    
    unsigned char errorCount = reprovisionAfter;  // Force Provision On First Loop
    char macString[18];  // Used to store a formatted version of the MAC Address
    
    EthernetClient client;
    //Exosite exosite(cikData, &client);
    Exosite exosite(&client);
    
    String tempString;
    int index = 0;
    int lastIndex = -1;
    float tempC;
    //
    // The 'setup()' function is the first function that runs on the Arduino.
    // It runs completely and when complete jumps to 'loop()' 
    //
    void setup() {
      Serial.begin(115200);
      Serial.println("Boot");
      pinMode(25, OUTPUT); //assume using D25 as output to control remotely
      
      // Start up the OneWire Sensors library
      sensors.begin();
      delay(1000);
      Serial.println("Starting Exosite Temp Monitor");
      Serial.print("OneWire Digital Pin Specified: ");
      Serial.println(ONEWIRE);
      Ethernet.begin(macData);
      // wait 3 seconds for connection
      delay(3000); 
     
    }
     
    //
    // The 'loop()' function is the 'main' function for Arduino 
    // and is essentially a constant while loop. 
    //
    void loop() {
      static unsigned long sendPrevTime = 0;
      static unsigned long sensorPrevTime = 0; 
      char buffer[7];
      String readParam = "";
      String writeParam = "";
      String writeString = "";
      String returnString = "";
      index = 0;
      lastIndex = -1;
    
       // Check if we should reprovision.
      if (errorCount >= reprovisionAfter) {
        if (exosite.provision("exosite", "ard-generic", unique_id)) {
          errorCount = 0;
        }
      }
        String uptime_str = String(millis()/1000);
      writeString += "uptime="+ uptime_str;
    
        //GET ANALOG 1 VALUE
      //get average of a number of readings
      int avgValue=0;
      int readings = 0;
      unsigned long avgTot = 0;
      int avgCnt = 0;
    
      while(readings<10)
      {
        avgTot += analogRead(A1);
        avgCnt += 1;
        avgValue = avgTot/avgCnt;
        readings++;
      }
      String analog1_str = String(avgValue);
      writeString += "&a1="+ analog1_str;
      
    //Make Write and Read request to Exosite Platform
      Serial.println("---- Do Read and Write ----");
      if (exosite.writeRead(writeString, readString, returnString)) {
        Serial.println("OK");
        Serial.print("Returned: ");
        Serial.println(returnString);
        Serial.println("Parse out dataport alias values");
        errorCount = 0;
        for(;;){
          index = returnString.indexOf("=", lastIndex+1);
          if(index != 0){
            String alias = "";
            tempString = returnString.substring(lastIndex+1, index);
            Serial.println(tempString);
            lastIndex = returnString.indexOf("&", index+1);
            alias = tempString;
            if(lastIndex != -1){
              tempString = returnString.substring(index+1, lastIndex);
            }else{
              tempString = returnString.substring(index+1);
            }
            
            
            if (alias == "d25"){
              if(tempString == "1"){
                digitalWrite(25, 1);
                Serial.println("set Digital25 to 1");
              }else if(tempString == "0"){
                digitalWrite(25, 0);
                Serial.println("set Digital25 to 0");
              }else{
                Serial.println(tempString);
              }
            } else if (alias == "msg"){
              Serial.print("Message: ");
              Serial.println(tempString);
            } else {
              Serial.println("Unknown Alias Dataport");
            }
       
            if(lastIndex == -1)
              break;     
            
          }else{
            //Serial.println(F("No Index"));
            break;
          }
        }
        
      } else {
        Serial.println("No Connection");
        errorCount++;
      }
    
      Serial.print("."); // print to show running
     
     // Read sensor every defined timeout period
      if (millis() - sensorPrevTime > SENSOR_READ_TIMEOUT) {
        Serial.println();
        Serial.println("Requesting temperature...");
        sensors.requestTemperatures(); // Send the command to get temperatures
        tempC = sensors.getTempCByIndex(0);
        Serial.print("Celsius:    ");
        Serial.print(tempC);
        Serial.println(" C ..........DONE");
      
        sensorPrevTime = millis();
      }
     
      // Send to Exosite every defined timeout period
      if (millis() - sendPrevTime > REPORT_TIMEOUT) {
        Serial.println(); //start fresh debug line
        Serial.println("Sending data to Exosite...");
        
        readParam = "";        //nothing to read back at this time e.g. 'control&status' if you wanted to read those data sources
        writeParam = "temp="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
        
        String tempValue = dtostrf(tempC, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2
        
        writeParam += tempValue;    //add converted temperature String value
        
        //writeParam += "&message=hello"; //add another piece of data to send
    
        if ( exosite.writeRead(writeParam, readParam, returnString)) {
          Serial.println("Exosite OK");
          if (returnString != "") {
            Serial.println("Response:");
            Serial.println(returnString);
          }
        }
        else {
          Serial.println("Exosite Error");
        }
     
        sendPrevTime = millis(); //reset report period timer
        Serial.println("done sending.");
      }
      delay(1000); //slow down loop
    }
    

    Nefunkční kód (moje spojení dvou předešlých kódů) je v mým příspěvku #9905.
    Předem moc díky!

    #9958
    posjirka
    Účastník

    pitvat ten kod teď vážně nestíhám a bez simulace zapojení celého zařízení i zbytečné.
    Napadlo mě něco uplně jiného. jak celé zařízení napájíš?
    On ethernet shield nemá zrovna zanedbatelný odběr i když se 150mA může zdát jako prd.
    Většinou je Arduino stavěné na 500mA. Do to ho si dej LCD s podsvícením, ethernet sheild, čidla, případně relé, alarm … . Navíc by to odpovídalo té nahodilé konstelaci.

    #9959
    posjirka
    Účastník

    navíc jestli máš čip wiznet w5100 tak ten má sám o sobě téměř 200mA …

    #9977
    johnyhol
    Účastník

    Aha, tak to je dobrej nápad, večer zkusím změřit celk. odběr a když tak zapojím na tráfko. Jinak jsem to napájel pouze přes USB 2.0 tak by to mohlo být ono. Ten modul mám opravdu W5100.

    Díky za postřeh!

    #9991
    johnyhol
    Účastník

    Tak jsem to proměřil a celkový odběr měřený před napájecím konektorem je od 200 do 320mA když sepne relé. Napojil jsem to stejně pro jistotu na lab. zdroj s nastaveným napětím 9V a proudem 1A, ale výsledek je stejný jako přes USB – pořád to padá. Vysledoval jsem, že je problém hned po zapnutí. Podle sériový linky se připojuje na Exosite a při tom se to sekne. Konkrétně na displeji svítí „NAST.VSTUPY/VYST“ + „VYPINAM VS. RELE“, na pár sekund sepne relé alarmu a po rozepnutí se to sekne. Normálně by měly procvaknout všechny relé a na displeji přeskočit „TERMOSTAT VYPNUT“ + ZADNA PORUCHA… a čekat na sepnutí termostatu. Když už se povede, že to naběhne tak se hodnoty z čidel normálně posílají na Exosite, ale do tý doby než zapnu termostat. Pak se spojení přeruší a naskočí to, až přestane kotel topit. To je asi problém, že je část kódu pro Exosite ve smyčce „void loop“.? Až bys měl tedy chvilku tak mi na to prosím koukni.
    Díky moc!

Aktuálně je na stránce zobrazeno 23 příspěvků - 91. až 113. (celkem z 113)
  • Pro reakci na toto téma se musíte přihlásit.