posjirka
Vytvořené odpovědi
-
AutorPříspěvky
-
posjirkaÚčastník
// dohoreni //--------- dohoreni(); //} - #1 chyba - navic 1x slozena zavorka } else { Serial.println("Prostorovy termostat vypnut"); // ladici seriova komunikace }
posjirkaÚčastníkodstranil jsem 1 chybu kterou jsem našel a arduino mi jej normálně skompiluje.
Chyba byla v prebytecne zavorce v setup().// 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(); //} - #1 chyba - navic 1x slozena zavorka } 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 } }
posjirkaÚčastníksuper …
posjirkaÚčastníkjohny, johny …. já tě chápu ale obávám se že je to pouze 1smerná komunikace. Nevím jak jinak ti to vysvětlit. Spočítal sis kolik je 8s + 1s ?
posjirkaÚčastníka kde máš to resetování watchdogu? 🙂
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(1000); //pockej 1s wdt_reset(); // resetuj watchdog
posjirkaÚčastníkco to znamená, že to nejde ? Nevím co měníš … hoď sem kod …
posjirkaÚčastníkten watchdog je ochranná funkce … jak jsem již psal …
celá funkce watchdog se skládá z:– vložení knihovny:
#include <avr/wdt.h>
– aktivace watchdogu v setupu :wdt_enable(WDTO_8S);
– průběžný reset :wdt_reset();
a 8s je pro něj maximum:
https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
add.2. – ano ten kod musíš napsat všude, kde bude čas delší než 8s. Radši méně, když máš pak víc funkcí nemusel by uplně všechno včas stíhat a omylem by se procesor sám resetoval.když chceš pauzu 10s tak jí rozděl na 2x 5s a pokaždé resetuj watchdog….
u 15s to rozděl na 3x 5s a opět pokaždé resetuj watchdog …posjirkaÚčastníkproblém je v tom, že je tu použit tzv. watchog. ten je nastaven na určitý čas (8s což je jeho maximum). když se nezresetuje včas watchdog a přeteče tak se resetuje celý procesor. To je ta halvní výhoda celéhe řešneí. Když se někde kousne procesor tak se sám resetuje a pokračuje dál . Je to odpově´d na otázku, proč nejde nastavit čas delší než 8s.
1. nepoužívej čas delší než 4-5s ať máš nějákou rezervu.
2. Pro delší čas použij více postupných pauz:delay(3000); wdt_reset(); // resetuj watchdog delay(3000); wdt_reset(); // resetuj watchdog delay(4000); wdt_reset(); // resetuj watchdog
celý kod je řešen opravdu primitivně. Tak jsem ho i bral aby s ena něm dalo dobře naučit jak co funguje. I proto jen jej rozdělil na funkce, které jsou zkoumat postupně. Mrkni na to a kdybys něco nepobíral, tak určitě napovíme ….
posjirkaÚčastníkjo sorry, já jsem si to zkusil na simulatoru a pak jsem to na hulvata prasknul do tvého kodu … jinak svetlo a svetlo1 jsou rozdílné proměnné. svetlo je doba za jak dlouho ma prejit z 0 na 255 (v minutách) a svetlo1 je pin kde je PWM výstup.
Ještě me pak napadlo jiné řešení, jednodušší a pro nastavení v menu jednodušší ale nevím kdy se na ně dostanu. …posjirkaÚčastníksouhasl s vojtěchem. dej si proměnnou „chyba=0“ a „close_time = 0“ pro záznam času při spuštění povelu k zavření. Tam si zapiš čas při zavření a změř si jak dlouho jede motor. Když to překročí čas, všechno vypni a zapiš si chybu + signalizuj chybu…
posjirkaÚčastníkto nasranek:
onečně jsem dokopal k tomu abych někde ukazal jak jsem myslel linearni rozložení rozsvěcení/zhasnutí na základě času. Trachu jsem upravil/zjednodušil tvůj program a mírně z přeházel některé funkce. Ta uprava co jsem udělal by měla odstranit ten neduh o zpožděné reakci v důsledku dlouhého delay(). Zjednodušil jse to proto aby bylo poznat co se tam měnilo. Jestli máš chut tak to prosím vyzkoušej. krok se mění 1x za minutu a funkcí map() se přepočítává na rozsah 0-255.#include <Wire.h> #include <DS3231.h> #define DS3231_I2C_ADDRESS 0x68 DS3231 rtc(SDA, SCL); int svetlo1 = 11;//pwm vystup int den = 9*60; // od kdy je den int noc = 21*60;// od kdy je noc int svetlo = 42; // doba rozsveceni/zhasnuti int cas = 0; // nasobek aktualnich hodin a minut byte jas = 0; // velikost jasu 0-255 byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; void setup() { rtc.begin(); lcd.clear();//smaže obrazovku lcd.setContrast(30);//nastavení kontrastu je to individuální, mám jich několik a každý chce něco jiného ale je to v rozmezí 30-60 Wire.begin(); pinMode(svetlo1, OUTPUT); } byte decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10) ); } byte bcdToDec(byte val){ return ( (val / 16 * 10) + (val % 16) ); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void loop() { delay(1000); byte s, m, h, dvt, dvm, mesic, r; readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r); analogWrite(svetlo1, brightness); cas = h*m; // nasobek minut a hodin if (cas < den) { jas = 0; // jeste neni den tak nesvit } else { if(cas < (den+svetlo)}{ jas = map(cas, den, (den+svetlo), 0, 255); // rozsveceni } } if (cas > (noc + svetlo)) { jas = 0; // jeste neni den tak nesvit } else { if (cas > noc){ jas = map(cas, noc, (noc+svetlo), 255, 0); // zhasnuti } } }
posjirkaÚčastníkno já si myslim, že je to způsobeno použitím. měnit referenci a přitom mít zapojené na jiném analog.vstupu vyšší hodnotu je už z principu špatně. zkus zajet joystickem na s´tranu k zemi a zkus to . Případně dej Joystick na stejný potenciál jako je refernční napětí (nepoužívej interní) ….
posjirkaÚčastníkpánové ,proč to řešíte tak složitě ….
vezměte si, že budete mít konstantní zdroj 0,7V (dioda).
Když necháme refenreční napětí = napájecí napětí tak při 5V to bude třeba hodnota 200, když klesne napětí baterie na 3,5V tak to bude hodnota 400 (té konstaktny 0,7V) …posjirkaÚčastníkjak jsem psal, místo odporu 100k použij nějáký pevný stabilizátor. …. pro začátek třeba tu mojí zatracovanou diodu … obyč. dioda 1b4001 katodou na zem, anodou na analogový pin.
posjirkaÚčastníkneuvádíš jak je to zapojený …. máš tam stabilizator pro napájení mikroprocesoru, nebo přímo z baterie ?
Pokud ze satbilizátoru tak bych baterii dal přes odporový dělič a měřil výsledke. Doporučuju vyopočítat pro napětí tak 2/3 reference. Tady se počítá s tím, že s emění napětí baterie a refernční napětí zůstává stejné.
Druhá varinata je , že napájíš mikroprocesor přímo z baterie a tím pádem se ti mění i refernční napětí. v tom případě na baterii použij nějáký stabilizátor pro přesné refernční napětí (jen ne diodu ta je dost teplotně závislá), v nouzovém případě i klasický stabilizátor 7803 pro 3V. Pak budeš mít obrácenou logiku : snížení hodnoty analogvého pinu indikuje snížení napětí bateri / referenční napětí …Posuvník jako termín nechápu, předpokládám, že je to nějáký potenciometr připojený mezi zem a refenreční napětí, pak ti neovlivńuje funkci měření …
posjirkaÚčastníkproto říkám, víc než 9 bitu je zbytečný luxus …
posjirkaÚčastníkono je dobré říct i to „b“.
750ms prodlevy je pouze u 2 drátového/parazitního zapojení.
U 3 drátového již není. Používání 12-bitového rozlišení je opět dle mého názoru zbytečnost. v základu je 9 bitů (tedy po 0,5stC) a vše ostatní se řeší tak, že se udělá víc měření a průměruje se. To je taky jeden z důvodu té prodlevy.
Délka 200m je usměvná, nicméně okolo 50m ve stíněném kabelu (např.stíněné FTP) už není výrazný problém a jde jen o to držet si pravidlo 1 zemnícího bodu.posjirkaÚčastníkjen že jsem na to narazil, tak dávám sdílet.
Chápu že to není nic extra, ale kdo ví …posjirkaÚčastníkna dotaz zda signál poletí stejnou dobu … je vhodne si prostudovat alespon zaklady radiokomunikace. Radiove vlny se šíří téměř rychlosti světla. V základu se měni pouze frekvence nosné vlny a způsob modulace. Ber to tak, že nejnižší rychlost přenostu bude okolo 9,6kbaud tedy 9600 bytu/s. Přenos informace o 10 bytech zanamená dobu přibližne 0,001s. To beru jako nejhorší stav. při přenosu 115kbaud jsme na uplně jiných časech.
Spíš mě zaráží těch 500m. Při použití vysílače na 2,4GHZ s přidanou anténou by to mělo mít dosah okolo 2km, ale v praxi jsem to ještě nezkoušel a je tu i otázk aterénu/příme viditelnosti:
http://www.arduino8.cz/komunikujeme-bezdratove-s-nrf24l01-1-cast-zapojeni/
ohledně přesnosti, funkce millis() řeší dobu běhu strojového času v 0,001s a je tu i funkce micros(), která dělá to samé v 0,000001s … takže 0,01s rozlišení bych se nebál. Jak jsi řešil odečet času z RTC? ten ti totiž v těchto případech nepomůže.
1. jeho rozlišení je v řádech 1s
2. přenos dat, adresování ,… nějáký čas zabere a přesnost pod 1s je mimo
3. při použití tohoto čipu jako generátoru zbytečně zatížích přerušení a s přesnosti si stejně moc nepomůžeš.
Navrhuji použití internícho strojového času Arduina a detekci start/stop jako body pro záznam aktuální hodnoty millis(). Výsledný čas je pak jen prostým odečtem těchto 2 hodnot.
pár příkladů:
http://www.c-sharpcorner.com/uploadfile/7d4524/stopwatch-using-push-button/
http://duino4projects.com/barista-championship-brewing-stopwatch-%E2%80%A2-introduction-using-arduino/posjirkaÚčastníkchápu to správně, že chceš mít 2 fotobuńky kažkou s vlastní RTC a posílat si čas prolnutí? To se ti nikdy nepodaří synchornizovat …
Lepší řešení by bylo použit 1 RTC ve vlastní časomíře a od fotobuněk přijímat jen signál prolnutí. čas by se bral s interní RTC časomíry.
O jakých intervalech/časech se vlastně bavíme ?
Jinak RTC může generovat i určitou frekvenci, pro lepší synchornizaci než jen sledování času….posjirkaÚčastníkjá bych spíš navrhoval metodu přímého měření obsahu násypky. Bu´d pomocí ultrazvukového čidla (to by se ale asi rychle zaneslo prachem) nebo měření optickou závorou. Při infračerveném spaktru by to mohlo být trvalejší, případně mě napadá varianta váhy. Jestli je někde možnost dát mezi násypku a držák někde tlakové čidlo (váha, vodivá guma,…) tak by šlo zvážit kolik tam toho uhlí ještě je …
Při měření pohybu šneku bych, jak píše Zbyšek, použil hallovu sondu a magnet.posjirkaÚčastníkty uhly natočení se dají řešit taky časem. V předchozí praci jsme řešili natočení serva taky časovou konstantou. Servo přejede z 0-180 st třeba za 90s. Když potřebuji přejet na 45 st tak nechám 30s sepnuté servo a zapíšu si do paměti na jaké je asi poloze. Většinou se jednalo o regulaci teploty, takže stačilo při poklesu/zvýšení teploty posunout servo na tu či onu stranu. na přesnost se nehrálo. Navíc serva od Belima byli vcelku stabilní co se linearity posunu v čase týká a nemusel se kupovat potenciometr na snímání polohy.
Tady by ti stačilo jednou změřit jak dlouho trvá přejetí z min. na max. a dát to třeba po 5 st natočení. Jednou za čas znulovat na jednu z krajních poloh (když za poledních 7 dní nenajedu na koncák tak si zresetuj polohu a najeď tam te´d)
Encoder je super řešení i včetně možnosti škálování (probarvenosti) pro přibližné měření aktuálního úhlu, nicméně šel bych asi cestou 2-4 drah které by mě ukazovalu aktuální poluhu (binární stav zabarvených značek na drahách)
Možnosti je spousta … budeš to tedy řídit H mustekm?
Navrhni si funkční zapojení a fyzické zapojení (schéma) a můžete tady pak bádat na reálnými možnostmi …posjirkaÚčastníkjá bych taky stav řešil 1 proměnnou.
Za mě tedy spíš typu „byte“ jako 3 stavovou hodnotu:
1 – otevřeno
2 – mezistav
3 – zavřeno
Otázka je jak chceš řídit ten motor?
Předpokládám že tam bude H mustek.
Kdyby to bylo 2 cívkové servo tak dám koncáky do krajních poloh, nevypínám signál na otevření/zavření a nechám to na koncák ať si rozpojí cestu.
U H-mustku to bude trochu složitější. Právě koncák ti pak může na základě své stavu říct jak to s žaluzii vypadá.
Takže zapoj koncový spínače (1x otveřeno, 1x zavřeno) na 2xDI arduina.
Pak je to vcelku jednoduchá podmínka:
1, sepni motor a nekonečná smyčka dokud není sepnutý spínač
2, vypni motor
3, 1s počkejukážu ti to na 1 funkci:
void otevri(){ while(digitalRead(7) == 1){ // cekej na koncak digitalWrite(8,LOW); // vypni motor 1 digitalWrite(9,HIGH); // sepni motor 2 } digitalWrite(9,LOW); // vypni motor 2 delay(1000); // cekej 1s }
posjirkaÚčastníkpokud tam máš 25x25x70mm tak to je místa víc než dost:
http://www.ges.cz/cz/tcst1103-GES05100332.html
http://www.ges.cz/cz/tcst2103-GES05100333.html
http://www.ges.cz/cz/cny70-GES05100334.html
stačí si vybrat který ti bude vyhovovat a samozřejmě je ještě více typů.
Dal bych to na PCB, který by ti umožnil jak lepší přidělaní, tak i připojení kabelu ….posjirkaÚčastníka co klasické AVR studio ?
Já teda používám Arduino IDE a jsem spokojený. Zatím jsem neměl důvod hledat něco jiného. Pro vyšší programovací jazky používám Visual Studio nebo Sharp Develop (VB.net nebo C#) ale v Arduino jsem pokojený s klasikou.posjirkaÚčastníkovládání j epomocí smyčky v zemi, kam se pouští cca 34kHz. sekačka má 2 snímací cívky, které vyhodnocují zda nejsou na kraji a pokud ano tak otočísekačku.
co se týká desky tak tam první, která je i popsaná obsahuje v podstatě jen solární nabiječku a 2 filtry pro detekci té zemní smyčky.
Bohužel tam není popsána ta druhá deska, která ovládá motory.
Je to vcelku slušně navržené a i když mi některé hodnoty nevycházejí musím uznat, že je to slušná práce od původního tvůrce.
Co mi nevychází je , že baterie má kapacitu 2,1Ah, odběr je cca 2A, panel dobijí v optimálním případě cca 0,6A a má posekat zahradu 500m2 za 3 hodiny.
Když bude baterie plně nabitá, tak vydrží max 1 hod, při průběžném dobijení je to cca 1,5A a to bude totálně vyždímaná a bude se snižovat životnost baterie.
Ten nabijecí ostrov … nevím. Musel bys rozšířit i vybavení nebo program o návrat na původní pozici, kde skončil. jinak hrozí, že budeš sekat neustále tu samou část.
Fotovoltaický panel a průběžné dobijení mi přijde jako velmi dobré řešení.
Moc by se mi něco takového líbilo jen toho času se nedostává … počkám si na nový domeček a volný čas 🙂posjirkaÚčastníkdíky za doplnění …
posjirkaÚčastníkzajímavý projekt. Jen mě zajímají 2 věci, které jsem nenašel v popisu:
1, Na desce vpravo dole jsou napájeny pin, ale nenašel jsem nikde jejich zapojení, je to pro výběr nějákých přednast. režimů?
2, kde je výstup na tu LED diodu u ovl. panelů? Je to pralalelně ke spínači?Jinak klobouk dolu ….
posjirkaÚčastníkjak píše Zbyšek je vhodné vyzkoušet nějáký prověřený řešení a ideálně s použitím knihoven virtualwire nebo LW. chybu v tvem kodu nevidím, ale určitě bych použil i nulování proměnné , když tlačítko není stisknuté. Už jen pro test co to udělá.
Jinak jestli chceš něco česky:
http://arduino8.webnode.cz/news/lekce-20-arduino-a-vyuziti-433-92-mhz/
posjirkaÚčastníkahoj, tak jsem to nemyslel. spíš mi v tom programu trochu vadí, že se ti na 2,5s zastaví smyčka a jen bliká. Pokud ti to ovšem nevadí je vše v pořádku a v klidu mě ignoruj.
-
AutorPříspěvky