johnyhol
Vytvořené odpovědi
-
AutorPříspěvky
-
johnyholÚčastník
Ahoj. Tak můžu (sice s odstupem času) potvrdit, že byl problém opravdu v knihovně. Po zakomentování toho řádku jak radíte to už funguje. Díky moc!
Narazil jsem ale ještě na jeden problém, nebo spíš bych potřeboval poradit jak udělat zpožděné vypnutí nahřívání bojleru u dalšího zařízení s ESP8266 (tentokrát se jedná o SonOff). Kód pro zapnutí a vypnutí mám hotový (to funguje bez problémů), ale nyní bych ho potřeboval doplnit o to, aby po zapnutí přes Exosite běželo nahřívání řekněme 2h a pak, aby se nahřívání vypnulo a vše se vrátilo do původního stavu a bylo to připravené pro další zapnutí. Zkouším to tu už asi tři večery a pořád bez úspěchu. Vždy to skončí tak, že se to sice po nastavené době vypne (vypne relé a vrátí se stav přepínače na Exosite do polohy vypnuto), ale po dalším zapnutí se jenom na chvíli přepne přepínač na Exosite do polohy zapnuto a po pár vteřinách se opět přepne do polohy vypnuto.
Tady je kód se zakomentovaným pokusem o zpoždění:#include <ESP8266WiFi.h> #include <Exosite.h> String cikData = "4b0024b7d0981b76ca9ac9ed61de0de2cf87b704"; // <-- FILL IN YOUR CIK HERE! (https://portals.exosite.com -> Add Device) const char* ssid = "Holarci"; const char* pass = "H0larc1*2S"; WiFiClient client; Exosite exosite(cikData, &client); String readString; String writeString; String returnString; String readParam ; String writeParam ; char buffer[7]; int smycka4 = 0; // pomocna smycka - zapaleni int smycka4max = 50; // max.pomocne smycky byte TstavA;//ALIAS na exosite byte TvipA;//ALIAS na exosite byte ReleA=12; byte LED=13; void setup(void){ Serial.begin(9600); Serial.println(""); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); pinMode(ReleA,OUTPUT); digitalWrite (ReleA,HIGH); pinMode(LED,OUTPUT); digitalWrite (LED,HIGH); } void loop() { //*****************************// // cteni stavu vypinace bojler // //*****************************// Serial.println("Ctu stav vypinace A"); readString = "TvipA"; if(exosite.writeRead(writeString, readString, returnString)){ Serial.println("OK"); Serial.print("Stav vypinace A je: "); Serial.println(returnString); } else{ Serial.println("Error"); } if (returnString == "TvipA=1"){ TvipA=1; } else{ TvipA=0; } returnString =""; delay(1000); //*************************// // logika zapinani bojleru // //*************************// if(TvipA==1){ digitalWrite(ReleA, LOW); digitalWrite(LED, LOW); Serial.println("Nahrivani bojleru ZAPNUTO"); TstavA=1; //////////////////////// // casovac vypnuti -> // //////////////////////// /* for (smycka4 = 0; smycka4 < smycka4max; smycka4 ++){ delay(1000); Serial.print("Stav: "); Serial.print(smycka4); Serial.print("s/"); Serial.print(smycka4max); Serial.println("s "); } writeString = "TvipA=0";*/ //////////////////////// // <- casovac vypnuti // //////////////////////// } else if (TvipA==0){ digitalWrite(ReleA, HIGH); digitalWrite(LED, HIGH); Serial.println("Nahrivani bojleru VYPNUTO"); TstavA=0; } //**************************// // odeslani stavu nahrivani // //**************************// readParam = ""; writeParam = "TstavA="; writeParam += TstavA; if(exosite.writeRead(writeParam, readParam, returnString)) { Serial.println("Exosite OK"); if (returnString != "") { Serial.println("Stav nahrivani odeslany"); } } else { Serial.println("Exosite chyba stav neodeslany"); } delay(1000); }
Díky za reakce.
johnyholÚčastníkAle co nechápu, že to s tou stejnou knihovnou maká v tomto kódu(posílání na Thingspeak):
#include <OneWire.h> #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS D7 const char* host = "api.thingspeak.com"; // Your domain String ApiKey = "----"; String path = "/update?key=" + ApiKey + "&field1="; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); const char* ssid = "----"; const char* pass = "----"; char temperatureString[6]; void setup(void){ Serial.begin(9600); Serial.println(""); WiFi.begin(ssid, pass); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); DS18B20.begin(); } float getTemperature() { float temp; do { DS18B20.requestTemperatures(); temp = DS18B20.getTempCByIndex(0); delay(100); } while (temp == 85.0 || temp == (-127.0)); return temp; } void loop() { float temperature = getTemperature(); dtostrf(temperature, 2, 2, temperatureString); // send temperature to the serial console Serial.println(temperatureString); WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } client.print(String("GET ") + path + temperatureString + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: keep-alive\r\n\r\n"); delay(500); }
johnyholÚčastníkpoužil jsem tento kód přímo z IDE (příklady -> Exosite -> ESP8266OccupancySensor):
//***************************************************************************** // // ESP8266OccupancySensorNoSleepProvision - An example of how to use the Exosite // library on the Sparkfun ESP8266 Thing // with a PIR motion sensor to detect the // occupancy status of a room. // // Requires the ESP8266 Arduino Library // // You MUST use the staging version of the ESP8266 library (or the stable version // if newer than Aug 10, 2015) so that method strtoul is compatible // // Copyright (c) 2015 Exosite LLC. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of Exosite LLC nor the names of its contributors may // be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL // DAMAGES, FOR ANY REASON WHATSOEVER. // //***************************************************************************** #include <EEPROM.h> #include <SPI.h> #include <ESP8266WiFi.h> #include <Exosite.h> #include <OneWire.h> #include <DallasTemperature.h> const int MOTION_PIN = 13; const int MOTION_POWER_PIN = 4; const int ONEWIRE = 12; const int LED_PIN = 5; /*============================================================================== * Configuration Variables * * Change these variables to your own settings. *=============================================================================*/ const char ssid[] = "SSID HERE"; const char password[] = "PASSWORD HERE"; char macString[18]; // Used to store a formatted version of the MAC Address byte macData[WL_MAC_ADDR_LENGTH]; const int REPORT_TIMEOUT = 30000; //milliseconds period for reporting to Exosite.com // Use these variables to customize what datasources are read and written to. String readString = "occupancyint"; String writeString = "occupancyint="; String returnString; String writeString5 = "temp="; String readString5 = "temp"; /*============================================================================== * End of Configuration Variables *=============================================================================*/ WiFiClient client; Exosite exosite(&client); // Set up which Arduino pin will be used for the 1-wire interface to the sensor // Be sure to use OneWire library from Arduino Library Manager, not from the included // library in the ESP8266 Board package OneWire oneWire(ONEWIRE); DallasTemperature DS18B20(&oneWire); int motionState = 0; int movementCounter; // Use to count number of times movement is detected in the intervals float tempF, tempC; unsigned long checkPrevTime = 0; /*============================================================================== * setup * * Arduino setup function. *=============================================================================*/ void setup(){ initHardware(); delay(100); connectWifi(); movementCounter = 0; exosite.begin(); ESPprovision(); Serial.println("Calibrating..."); delay(30000); // Calibration time Serial.println("Ready to detect motion."); delay(50); } /*============================================================================== * loop * * Arduino loop function. *=============================================================================*/ void loop() { checkPrevTime = millis(); while(millis() - checkPrevTime < REPORT_TIMEOUT){ // Read the state of the motion sensor value motionState = digitalRead(MOTION_PIN); // Check if the motion sensor is activated // If it is, the motionState is LOW (with 10K resistor) if (motionState == LOW) { movementCounter++; Serial.println("Motion Detected."); delay(2000); } else delay(100); } // Read temperature sensor DS18B20.requestTemperatures(); // Send the command to get temperatures tempC = DS18B20.getTempCByIndex(0); Serial.println("Temperature in degrees C is " + String(tempC)); tempF = DallasTemperature::toFahrenheit(tempC); Serial.println("Temperature in degrees F is " + String(tempF)); delay(100); reportToExosite(); } /*============================================================================== * initHardware * * Use in setup to initialize pins and Serial port *=============================================================================*/ void initHardware(){ Serial.begin(112500); delay(10); pinMode(MOTION_PIN, INPUT); pinMode(MOTION_POWER_PIN, OUTPUT); digitalWrite(MOTION_POWER_PIN, HIGH); DS18B20.begin(); EEPROM.begin(40); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); delay(1000); } /*============================================================================== * connectWifi * * Use in setup to connect to local Wifi network *=============================================================================*/ void connectWifi(){ WiFi.mode(WIFI_STA); // Need for deepSleep // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); byte ledStatus = LOW; while (WiFi.status() != WL_CONNECTED) { Serial.print("."); // Blink the LED digitalWrite(LED_PIN, ledStatus); // Write LED high/low ledStatus = (ledStatus == HIGH) ? LOW : HIGH; delay(100); } digitalWrite(LED_PIN, HIGH); Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); delay(100); // Create MAC Address String in the format FF:FF:FF:FF:FF:FF WiFi.macAddress(macData); snprintf(macString, 18, "%02X:%02X:%02X:%02X:%02X:%02X", macData[5], macData[4], macData[3], macData[2], macData[1], macData[0]); // Print Some Useful Info Serial.print(F("MAC Address: ")); Serial.println(macString); } /*============================================================================== * ESPprovision * * Activate the ESP8266 to specified vendor and model and get a CIK *=============================================================================*/ void ESPprovision(){ byte ledStatus = HIGH; while(client.connected()==0){ if(exosite.provision("exosite", "arduinoyun-generic", macString)) EEPROM.commit(); digitalWrite(LED_PIN, ledStatus); // Write LED high/low ledStatus = (ledStatus == HIGH) ? LOW : HIGH; delay(500); } digitalWrite(LED_PIN, HIGH); delay(100); } /*============================================================================== * reportToExosite * * Write number of motions detected in period as well as awake status to dataports *=============================================================================*/ void reportToExosite(){ while(!exosite.writeRead(writeString+String(movementCounter)+"&"+writeString5+String(tempF), readString + "&" + readString5, returnString)) { Serial.println("Retrying connection"); delay(1000); } movementCounter = 0; delay(1000); }
johnyholÚčastníkTak 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!johnyholÚčastníkAha, 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!
johnyholÚčastníkAhoj, 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!johnyholÚčastníkTakž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 } }
johnyholÚčastníkAha, tak já to tedy večer zkusím a dám vědět. Zatím moc díky!
johnyholÚčastníkJasně, 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?
johnyholÚčastníkNo 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?
johnyholÚčastníkAni přes jiný digitální piny? (třeba D2+D3)
johnyholÚčastníkTo 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é?
johnyholÚčastníkTakž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
johnyholÚčastníkpro 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.
johnyholÚčastníkAhoj. 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íkyjohnyholÚčastníkTo 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!
johnyholÚčastníkTak tady:
// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 13_12_2016 // changelog // v 13_12_2016 // 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, 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 #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy int smycka1 = 0; // pomocna smycka - zapaleni int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s 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 // nastaveni displeje lcd.begin(16, 2); // zobrazeni na displeji lcd.print("NAST.VSTUPY/VYST"); //delay (5000); // smaze displej pred dalsi smyckou //lcd.clear(); 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 // smaze displej pred dalsi smyckou lcd.clear(); // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0): lcd.setCursor(0, 1); // zobrazeni na displeji lcd.print("FOTOBUNKA"); Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace smycka1max = map(analogRead(trimr1), 0, 1024, 60, 600); // nastaveni doby zapaleni trimrem na A0 if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace // 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 } // kvitence pripadne poruchy //------------------------------- kvitancePoruchy(); } void vypniVse() { // funkce vypni vse Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace // smaze displej pred dalsi smyckou lcd.clear(); // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0): lcd.setCursor(0, 1); // zobrazeni na displeji lcd.print("VYPINAM VS. RELE"); 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 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 "); } 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 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 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 "); } 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 "); } //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 ... "); digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog //Serial.print("s/"); //Serial.print(davkovaniPelet, LOW); //Serial.print("s "); Serial.println("Pauza ... "); 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 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 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 "); 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 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 digitalWrite(alarm, HIGH); // vypni alarm } }
johnyholÚčastníkAhoj, díky za rychlou reakci. Zkoušel jsem to jak radíš, ale stejně to nic nezobrazí, pořád funguje jenom „nastavuji vstupy/vystupy“ a pak už nic. Když to zkusím v extra projektu (jenom displej bez ostatních funkcí) tak to funguje. Ještě musí bejt někde něco.
johnyholÚčastníkAhoj, tak jsem se pustil do toho dipleje, něco jsem naštudoval, něco vyzkoušel. Teď se to snažím nacpat do mýho projektu, ale nějak se mi to nedaří. Zkusíš mi na to prosím kouknout? Zatím jsem jenom nastavil do setupu hlášku „nastavuji vstupy/vystupy“ (to funguje) a pak jsem zkoušel dát do loopu fotobuňku a do vypniVse „vypinam vsechny rele“, ale tam už se mi to nedaří.
Tady je aktuálmí kód:// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 13_12_2016 // changelog // v 13_12_2016 // 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, 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 #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy int smycka1 = 0; // pomocna smycka - zapaleni int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s 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 // nastaveni displeje lcd.begin(16, 2); // zobrazeni na displeji lcd.print("NAST.VSTUPY/VYST"); delay (5000); // smaze displej pred dalsi smyckou lcd.clear(); 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 // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0): lcd.setCursor(0, 1); // zobrazeni na displeji lcd.print("FOTOBUNKA"); // smaze displej pred dalsi smyckou lcd.clear(); Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace smycka1max = map(analogRead(trimr1), 0, 1024, 60, 600); // nastaveni doby zapaleni trimrem na A0 if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace // 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 } // kvitence pripadne poruchy //------------------------------- kvitancePoruchy(); } void vypniVse() { // funkce vypni vse Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0): lcd.setCursor(0, 1); // zobrazeni na displeji lcd.print("VYPINAM VS. RELE"); // smaze displej pred dalsi smyckou lcd.clear(); 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 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 "); } 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 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 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 "); } 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 "); } //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 ... "); digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog //Serial.print("s/"); //Serial.print(davkovaniPelet, LOW); //Serial.print("s "); Serial.println("Pauza ... "); 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 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 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 "); 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 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 digitalWrite(alarm, HIGH); // vypni alarm } }
Díky moc!
johnyholÚčastníkDisplej jsem objednal podle doporučení (vzal jsem rovnou celej schield s tlačítky-možná se budou ještě hodit pro nastavování funkcí/časů) a trochu jsem přemejšlel o tom zobrazování a viděl bych to asi tak jako na obrázku. Na prvním řádku vždy aktuální proces, za ním čas a na druhým doplňkový informace. Bylo by to tak možný?
Attachments:
johnyholÚčastníkAha, tak proto to vypsalo všechno možný a já z toho byl hotovej. Něco podobnýho se mi stalo, když jsem se po půl roce vrátil k mýmu (našemu) projektu regulace kotle a najednou mně to házelo jednu chybovou hlášku za druhou. Asi po dvou dnech trápení jsem odinstaloval a znova nainstaloval Arduino IDE a pak už to jelo. Myslím že to bylo nakopnutý výroční aktualizací Windows.
Displej rozmyslím a ozvu se. Zatím díky a promiň že potřebuju všechno vysvětlit, když mně něco nejde tak musím zjistit kde jsem udělal chybu.
johnyholÚčastníkPrávě že to fungovalo, jenom jsem promazal části kódu kde byl prostorový termostat a na závorky jsem nesahal. Proto se divím, hlavně proč mi to hlásilo chybu ve „void setup -> vypniVse ();“, když ta závorka navíc byla ve void loop. Chtěl bych to pochopit, abych se toho do budoucna vyvaroval.
Ještě jeden dotaz. Přemýšlím o tom displeji jak jsi mi dřív radil a zajímalo by mě, jestli by se na něm dalo zobrazit to co mám teď přes seriovou komunikaci (jaká běží aktuální část programu, časy atd.), abych měl přehled co zrovna Arduino dělá.
Díky
johnyholÚčastníkAha, tak to mě vůbec nenapadlo, tam jsem s tím oproti předešlý verzi nic nedělal. Proč to tedy teď nefungovalo, když to předtím s tou závorkou šlo? Potřeboval bych to dovysvětlit.
Díky!johnyholÚčastníkProsím tě kde přesně byla ta chyba, koukám tu na to a připadá mi to úplně stejný. Jinak to po tvým zásahu jako vždy funguje 🙂
Díky moc!
johnyholÚčastníkAhoj, tak jsem se opět pustil do editace kódu. Upravil jsem sériovou komunikaci (přidal jsem počítadla k jednotlivým funkcím, abych měl lepší přehled o aktuální situaci co zrovna Arduino dělá -> jak běží čas) a dál jsem se pokusil zrušit reakci na prostorový termostat, ale to se mi nějak nedaří. Po promazání řádků kde byl prostorový termostat mi vyskakuje chyba:
Arduino: 1.6.12 (Windows 10), Vývojová deska: "Arduino/Genuino Uno" In function 'void setup()': kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:102: error: 'vypniVse' was not declared in this scope vypniVse(); ^ In function 'void loop()': kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:119: error: 'zapalovaciDavkaPelet' was not declared in this scope zapalovaciDavkaPelet(); ^ kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:123: error: 'zapaleni' was not declared in this scope zapaleni(); ^ kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:131: error: 'udrzujHoreni' was not declared in this scope udrzujHoreni(); ^ kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:135: error: 'dohoreni' was not declared in this scope dohoreni(); ^ At global scope: kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:137: error: expected unqualified-id before 'else' } else { ^ kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:142: error: expected constructor, destructor, or type conversion before ';' token kvitancePoruchy(); ^ kotel_demo14_zruseni_reakce_na_prostorovy_termostat.ino:143: error: expected declaration before '}' token } ^ exit status 1 'vypniVse' was not declared in this scope Táto zpráva by měla mít víc informacií v "Zobrazení podrobného výstupu při kompilaci" podle zapnuté volby v Soubor -> Nastavení.
Tady je ještě aktuální kód:
// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 14_5_2016 // changelog // 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> #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 #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy int smycka1 = 0; // pomocna smycka - zapaleni int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s 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 = 840; // 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 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, 600); // nastaveni doby zapaleni trimrem na A0 if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace // startovaci davka pelet //------------------------ zapalovaciDavkaPelet(); // proces zapaleni //---------------- zapaleni(); // test poruchy // ----------------- //testPlamene(); // udrzeni horeni //-------------- udrzujHoreni(); // dohoreni //--------- dohoreni(); } } else { Serial.println("Prostorovy termostat vypnut"); // ladici seriova komunikace } // 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 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 "); } 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 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 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 "); } 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 "); } //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 ... "); digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog //Serial.print("s/"); //Serial.print(davkovaniPelet, LOW); //Serial.print("s "); Serial.println("Pauza ... "); 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 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 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 "); 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 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 digitalWrite(alarm, HIGH); // vypni alarm } }
Původní (funkční) kód je tady:
// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 14_5_2016 // changelog // 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> #define davkovaniPelet 2 //davkovani pelet snek #define spirala 3 //zapalovaci spirala #define ventilator 5 //ventilator #define alarm 6 //signalizace poruchy #define prostorovyTermostat 7 //prostorovy termostat #define kotlovyTermostat 8 //kotlovy termostat #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy int smycka1 = 0; // pomocna smycka - zapaleni int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s 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 = 840; // 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 pinMode(davkovaniPelet, OUTPUT); pinMode(spirala, OUTPUT); pinMode(ventilator, OUTPUT); pinMode(alarm, OUTPUT); pinMode(prostorovyTermostat, INPUT); 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, 600); // nastaveni doby zapaleni trimrem na A0 if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty Serial.println("Prostorovy termostat zapnut"); // ladici seriova komunikace if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace // startovaci davka pelet //------------------------ zapalovaciDavkaPelet(); // proces zapaleni //---------------- zapaleni(); // test poruchy // ----------------- //testPlamene(); // udrzeni horeni //-------------- udrzujHoreni(); // dohoreni //--------- dohoreni(); } } else { Serial.println("Prostorovy termostat vypnut"); // ladici seriova komunikace } // 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 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 "); } 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 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 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 "); } 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 "); } //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(prostorovyTermostat) == HIGH && digitalRead(kotlovyTermostat) == HIGH){ // prostorovy + kotlovy termostat je zapnuty if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen Serial.println("Test plamene ... hori"); // ladici seriova komunikace Serial.println("Davkuji pelety ... "); digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog //Serial.print("s/"); //Serial.print(davkovaniPelet, LOW); //Serial.print("s "); Serial.println("Pauza ... "); 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 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 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 "); 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 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 digitalWrite(alarm, HIGH); // vypni alarm } }
Attachments:
johnyholÚčastníkTo jsem právě počítal a proto to nemůžu pořád pochopit. Takže 8s+1s=9s a watchdog má maximum 8s. Nicméně jsem to zkusil podle tvojí rady (rozdělit to) a Heureka! funguje to!
Tady je tedy výsledná změněná část kódu:digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog delay(4000); //pockej 4s wdt_reset(); // resetuj watchdog digitalWrite(davkovaniPelet, HIGH); //vypni davkovani delay(5000); //pockej 5s wdt_reset(); // resetuj watchdog delay(5000); //pockej 5s wdt_reset(); // resetuj watchdog
johnyholÚčastníkPořád nevím jestli jsme se dobře pochopili, dávkování funguje (tam potřebuju těch 8s), ale pauza (vypni dávkování) nefunguje. Tam bych potřeboval nastavit těch 10s. Když to změním na jinou hodnotu než 1s tak to nejede.
johnyholÚčastník// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 14_5_2016 // changelog // 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> #define davkovaniPelet 2 //davkovani pelet snek #define spirala 3 //zapalovaci spirala #define ventilator 5 //ventilator #define alarm 6 //signalizace poruchy #define prostorovyTermostat 7 //prostorovy termostat #define kotlovyTermostat 8 //kotlovy termostat #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy int smycka1 = 0; // pomocna smycka - zapaleni int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s 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 = 110; // max.pomocne smycky int smycka5 = 0; // pomocna smycka - rozhoreni int smycka5max = 50; // max.pomocne smycky int smycka6 = 0; // pomocna smycka - dohoreni int smycka6max = 840; // 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 pinMode(davkovaniPelet, OUTPUT); pinMode(spirala, OUTPUT); pinMode(ventilator, OUTPUT); pinMode(alarm, OUTPUT); pinMode(prostorovyTermostat, INPUT); 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, 600); // nastaveni doby zapaleni trimrem na A0 if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty Serial.println("Prostorovy termostat zapnut"); // ladici seriova komunikace if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace // startovaci davka pelet //------------------------ zapalovaciDavkaPelet(); // proces zapaleni //---------------- zapaleni(); // test poruchy // ----------------- //testPlamene(); // udrzeni horeni //-------------- udrzujHoreni(); // dohoreni //--------- dohoreni(); } } else { Serial.println("Prostorovy termostat vypnut"); // ladici seriova komunikace } // 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 digitalWrite(davkovaniPelet, LOW); //davkuj pelety for (smycka4 = 0; smycka4 < smycka4max; smycka4 ++){ delay(1000); wdt_reset(); // resetuj watchdog } digitalWrite(davkovaniPelet, HIGH); //potom vypni davkovani digitalWrite(ventilator, LOW); //zapni ventilator digitalWrite(spirala, LOW); //zapni zhaveni } void zapaleni() { // funkce zapaleni pelet // 3 pokusy o zapaleni Serial.println("Spoustim zapaleni ..."); // ladici seriova komunikace for (smycka3 = 0; smycka3 < smycka3max; smycka3 ++){ // smycka "1-10" minut zapalovani for (smycka1 = 0; smycka1 < smycka1max; smycka1 ++){ wdt_reset(); // resetuj watchdog Serial.print("Pokus "); // ladici seriova komunikace Serial.print(smycka3); // ladici seriova komunikace Serial.print("/"); // ladici seriova komunikace Serial.print(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 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 } else { Serial.println(" nehori ..."); // ladici seriova komunikace } delay(1000); } for (smycka5 = 0; smycka5 < smycka5max; smycka5 ++){ delay(1000); wdt_reset(); // resetuj watchdog } //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(prostorovyTermostat) == HIGH && digitalRead(kotlovyTermostat) == HIGH){ // prostorovy + kotlovy termostat je zapnuty if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen Serial.println("Test plamene ... hori"); // ladici seriova komunikace digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(8000); //pockej 8s digitalWrite(davkovaniPelet, HIGH); //vypni davkovani delay(1000); //pockej 1s } 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 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 ..."); // ladici seriova komunikace digitalWrite(davkovaniPelet, HIGH); //vypni davkovani pelet digitalWrite(spirala, HIGH); //vypni zhaveni - pro jistotu for (smycka6 = 0; smycka6 < smycka6max; smycka6 ++){ 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 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 digitalWrite(alarm, HIGH); // vypni alarm } }
Měním čas(zpoždění) u funkce „udrzujHoreni“:
digitalWrite(davkovaniPelet, LOW); //davkuj pelety delay(8000); //pockej 8s digitalWrite(davkovaniPelet, HIGH); //vypni davkovani delay(1000); //pockej 1s
Původně tam bylo 1s davkovani pelet a 1s vypnuto davkovani. To fungovalo bez problémů, ale když změním zpoždění „vypni davkovani“ na jiný čas než 1s tak to nejde.
johnyholÚčastníkTak jsem zkoušel cvičně změnit čas u pauzy dávkování na 1x 5s (myslel jsem, že když to bude fungovat tak že to rozdělím jak radíš na 2x 5s) a stejně to nejde. Funguje to pouze s pauzou 1s. Zkoušel jsem i 2s a to už taky nešlo. Tak nevím jestli jsem tě dobře pochopil, nebo je chyba ještě jinde.
johnyholÚčastníkTakže pokud to dobře chápu, tak je těch max. 8s na watchdogu nastaveno už někde v knihovně a proto nejde v programu nastavit víc? Zkoušel jsem právě na něm (ve void setup) nastavit víc a už to hlásilo chybu.
Ještě k bodu 2., ten kód co navrhuješ, ten musím napsat všude (do každý funkce: void loop, void zapalovaciDavkaPelet atd.) kde je watchdog použitý?A celkový čas by měl být delší než maximální čas funkce? (např. když bude pauza dávkování 10s tak součet časů watchdogu musí být 11s a víc?)Díky moc za rady!
-
AutorPříspěvky