lieg
Vytvořené odpovědi
-
AutorPříspěvky
-
alan
ÚčastníkJeště pro vysvětlení by to mělo být takhle
1. nejdříve odeslat 123 z amtlabu do arduina a ihned zpátky do maltabu
2. spoté poslat string „e“ z arduina do matlabu
3. tento string porovnám v matlabu a odešlu další čísla do arduinatribal.cz
Účastníktento problém jsem měl také a řešení je prakticky na facku kterou jsem si chtěl dát když se mi poprvé podařilo nahrát program. Pokud máš vše nainstalované podle toho http://digistump.com/wiki/digispark/tutorials/connecting. Tak dále postupuj následovně z příkladu vyber například blink. Poté bez zapojené desky do pc dej náhrat program. Ve stavovém řádku se ti zobrazí tato informace:
Projekt zabírá 718 bytů (11%) úložného místa pro program. Maximum je 6 012 bytů.
Globalní proměnné využívají 9 bytů dynamické paměti.
Running Digispark Uploader…
Plug in device now… (will timeout in 60 seconds)Nyní máš 1 minutu na připojení digisparku po jeho zapojení se vše nahraje a bude fungovat. Na linuxu je to trochu složitější je potřeba doinstalovat nějaké utilitky.
Je to řešené takto protože digispark využívá jako uploader micronucleus. Nikoliv standartní arduino nástroje
posjirka
Účastníkmáš 5 variant:
1, použij jiný připojovací bod napíjení. Na Arduinu máš vstup Vin a to je to samé jako napájecí konektor.
2, jdi cestou vlastního zdroje : stabilizátor 7805 + pořádné kondenzátory na vstupu.
Pak to přivedeš na +5V a je hotov.
3, Použij napájení přes USB. Prost2 nabije4ku na mobil p5es redukci na velke USB.
4, Bateriové napájení
5, na vstup připájej superkondenzátor o kapacitě třeba 1 až 10F. Ten je malý a je schopný ti překlenout tuto kolizní dobu. Pozor na velikost napětí ! Nejspíš budeš muset dát 2 do serie.Simakai
ÚčastníkAhoj všem,
narazil jsem na problém s napájením. Natočil jsem krátké video, kde je to ukázané
Jde o to, že když zahýbu s napájecím kabelem, tak se megaduino resetne, vypne, protože mu vypadne „šťáva“. Koncovka adaptéru se v „zástrčce“ trochu hýbe.
Jak se to dá řešit?
Problém je, že deska je součástí krabice, ke které je připojených několik termočlánků, a loguje z nich teploty. Krabice by právě měla být napájená z adaptéru. Ale pokud do ní někdo drbne, což se „v provozu“ může stát, tak se megaduino resetne a je to v čudu.
TomasN
ÚčastníkDíky za odpověď. Je rozdíl, když použiji 7805 s kondíky a budu Arduino napájet přes USB port? Tak jsem to taky zkoušel a neuspěl jsem….
posjirka
Účastníkjojo zdroje. Já používám Arduino jako vývojový kit a pro reálný výrobek používám samotný čip AT Mega 328 + krystal a stadardní zdroj ze 7805 a kondenzátory 1m0.
Originální Arduino má stabilizátory pro max. 150mA a kondenzátory 47u. To není nic moc.
čip programuju přes icsp rozhraní.dodo1001
ÚčastníkToto sú tie 3 cykly:
Attachments:
majkee
ÚčastníkDíky za odpoved a priklad posjirko,
zkusim tedy objednat normalni otocny vypinac typu 0->1->0 a rozchodit to s ledkou pro test.
Prislo mi akorat elegantnejsi pouzit pouze tlacitko pro kratky pulz, nez tam drzet hodnoty HIGH, LOW dle stavu vypinace, ale snad to tedy nicemu nebude vadit.
Predpokladam, ze vypinac aby se choval jako tlacitko nepredelam 😉
Michal
posjirka
Účastníktrochu nechápu požadavek = dotaz.
Potřebuješ mít vypínač/tlačítko na stěně (klasické na 230V) a porpojené s arduinem.
Když stisknu tlačítko/vypínač tak arduino něco udělá.
Resp. bude reagovat na změnu stavu tlačítka, takže ať nastane zapnutí ne bu vypnutí arduino musí udělat příslušnou akci.Zjednodušeně řečený příklad : na arduinu je LED dioda na pinu č.13.
Na pinu 2 a 3 bude po jednom vypínači.
1, Přepnu jeden vypínač = LED se rozsvítí
2, přepnu libovolný vypínač = LED zhasne.
3, přepnu libovolný vypínač = LED se rozsvítí.Chápu to správně?
Pokud ano je třeba si uvědomit, že přepnutí vypínače neznamená pevné a trvalé spojení kontaktů. Realitou je, že přepnutí doprovází spoustu hazardních impuzů, které po chvilce utichnou. Takže rychlost arduina/atmegy je spíš na škodu. Budeš muset udělat to, že uděláš tzv. „switch boucing“.
Já to třeba řeším časovou prodlevou.
Zjistím si stav tlačítek a když se změní, tak určitou dobu (cca 250ms) na další změnu nereaguji.posjirka
Účastníkpo hrubé kontrole to vypadá funkčně.
Máš tam 2x delay podle mě zbytečně.
Jen výsledný proces podmínky „if“ bych dal do složených závorek.
Napadá mě, že jestli se neresetuje sám procesor.
Bluetooth modul má celkem velkou spotřebu a po čase může zahřát a přetížit stabilizátor na desce. TO by pak znamenalo reset.
Dej si na začátek něco jako text „start“.
Když se ti objeví před změnou hodnot „start“ tak se ti resetoval čip.i tak neni nic ztraceno. můžeš si ti hodnoty zaznamenat do EEPROM a při startu si je znovu načíst. Vlastně by pokračoval tam, kde posledně skončil.
Po stisku tlačítka (nový tlačítko) + reset by si ty udaje mohl resetovat.
TO udělal tjde. jen pozor EEPRm má max.100 000 zápisu do každé buńky. Pak ta bunka není stabilní.poprad
ÚčastníkMyslel jsem si to, jen jsem se chtěl ujistit. Ale je to škoda….
Zbyšek Voda
ÚčastníkDobrý den, pokud vím, tak ne.
Musíte použít ifif(cislo > 2 && cislo < 6){...}
Popřípadě by šlo udělat
switch (Cislo) { case 3: case 4: case 5: …..; break; ….. }
Ale to asi není požadované řešení 🙂
johnyhol
ÚčastníkTak to je přesně to co bych si představoval! moc díky za tip!
Zbyšek Voda
ÚčastníkBude to jednodušší, když se s námi podělíte o kód 🙂
rakocid
ÚčastníkProblem vyrieseny. Dakujem za rady.
Hodnoty ktore som posielal boli prijate pomocou bezdrotoveho priimaca nrf24. Ked boli na väcsiu vzdialenost niektore hodnoty boli na tolko skreslene ze ich nedokazalo poslat dalej.Bohužial som sem ani tu cast programu nenapisal. Wire zbernica funguje skvele.ArduXPP
ÚčastníkUž jsem na to přišel, P0 a P1 digital a ostatní analog 🙂
Ale pořád jsem nepřišel na to proč pořád pouští proud do P5 3.3V .
posjirka
Účastníkasi bych tě odkázal na EXOSITE.
SPEKO2 to používá a nejspíš by ti dokázal poradit.
http://arduino.sk/viewtopic.php?f=6&t=250&sid=1a2a735f040bc590a27d3aba42cb4ba0johnyhol
ÚčastníkO displayi jsem už taky přemýšlel, ale nakonec jsem se rozhodl pro ethernet schield, protože bych chtěl časem sledovat stav kotle (případně i nastavovat) a taky teplotu v místnostech (nebo aspoň v obýváku) po síti a nejlépe i v mobilu s androidem. Půjde to? Úplně nejlepší by byla jednoduchá webová stránka, kde by se vypisovalo co zrovna kotel dělá a taky by tam bylo tlačítko pro zapnutí kotle na dálku v případě, že budeme někde na cestách, v baráku bude zima a budeme si chtít zatopit než přijedeme domů.
posjirka
Účastníksuper.
Jestli chceš mít na seriovem portu zprávy o počítadlech tak jen doplnň další řádky Serial.printlm();
a do závorek dej názvy proměnných.
já bych šel spíš cestou LCD displaye.
Stojí pár korun a potřebuješ na ně 6 volných pinu.
Ideální je 16×2 (16 znaku x 2 řádky).
Připojení je velmi jednoduché a pak ty zprávy co se kde děje můžeš vidět přímo na něm.
Idealni je třeba tento:
http://aukro.cz/modul-klavesice-1602-lcd-keypad-shield-arduino-i6089165384.html
Nevim jsetli se ti nebude bít s modulem RELE, protože nevím jeho zapojení.
Navic už tam máš tlačítka , takže je mužeš rovnou využít ….johnyhol
ÚčastníkTady upravený kód:
// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 30_3_2016 // changelog // 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 6 //davkovani pelet snek #define spirala 5 //zapalovaci spirala #define ventilator 3 //ventilator #define alarm 10 //signalizace poruchy #define prostorovyTermostat 12 //prostorovy termostat #define kotlovyTermostat 2 //kotlovy termostat #define fotobunka 8 //fotobunka pro kontrolu plamene #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 A1 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 = 12; // 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 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 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, LOW); //vypni davkovani digitalWrite(spirala, LOW); //vypni zhaveni digitalWrite(ventilator, LOW); //vypni ventilator } void zapalovaciDavkaPelet() { // prvotni davkovani pelet pro zapaleni Serial.println("Davkuji pelety pro zapaleni ... 12s"); // ladici seriova komunikace digitalWrite(davkovaniPelet, HIGH); //davkuj pelety for (smycka4 = 0; smycka4 < smycka4max; smycka4 ++){ delay(1000); wdt_reset(); // resetuj watchdog } digitalWrite(davkovaniPelet, LOW); //potom vypni davkovani digitalWrite(ventilator, HIGH); //zapni ventilator digitalWrite(spirala, HIGH); //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, LOW); //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(digitalRead(fotobunka) == HIGH){ //pokud fotobunka vidi plamen digitalWrite(spirala, LOW); //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 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(digitalRead(fotobunka) == HIGH){ //pokud fotobunka vidi plamen Serial.println("Test plamene ... hori"); // ladici seriova komunikace digitalWrite(davkovaniPelet, HIGH); //davkuj pelety delay(1000); //pockej 1s digitalWrite(davkovaniPelet, LOW); //vypni davkovani delay(1000); //pockej 1s } else { delay(1000); // pocekej jeste 1s a zkus to znovu if(digitalRead(fotobunka) == LOW){ //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, HIGH); // zapni alarm } } } else { smycka2 = smycka2max; // ukonci smycku } } } void dohoreni() { // funkce dohoreni Serial.println("Dohoreni ..."); // ladici seriova komunikace digitalWrite(davkovaniPelet, LOW); //vypni davkovani pelet digitalWrite(spirala, LOW); //vypni zhaveni - pro jistotu for (smycka6 = 0; smycka6 < smycka6max; smycka6 ++){ delay(1000); wdt_reset(); // resetuj watchdog } digitalWrite(ventilator, LOW); //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, HIGH); // zapni alarm Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace wdt_reset(); // resetuj watchdog } Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace digitalWrite(alarm, LOW); // vypni alarm porucha = 0; // vynuluj poruchu } else { // jinak Serial.println("Zadna porucha ..."); // ladici seriova komunikace digitalWrite(alarm, LOW); // vypni alarm } }
johnyhol
ÚčastníkAhoj, tak teď už je to kód jako v Temelíně 🙂 Jinak jsem to zkoušel a po drobný úpravě už to vypadá dobře. Musel jsem ještě změnit hodnotu u kvitace poruchy, přesně tady:
while (digitalRead(tlacitkoKvitance) == HIGH) { // zapni alarm a cekej na stisk tlacitka
z hodnoty „HIGH“ na hodnotu „LOW“, protože to reagovalo na tlačítko poruchy obráceně. (+ jsem tam udělal ještě pár úprav, upravený kód přiložím později) Všiml jsem si toho, když už jsem byl bezradnej (pořád nefungovala porucha) a tak jsem to komplet všechno rozpojil a znovu zapojil podle simulátoru, ale stejně to nešlo. Taky jsem si všiml, že tam máš tlačítka (spínače) zapojený obráceně (jako imput_pullup), jenom jsem si toho předtím vůbec nevšiml, protože tam máš i odpory. (sice ne proti zemi, ale proti plusu) Sériová komunikace je taky v pohodě, jenom bych ještě uvítal, kdyby běžel při každý akci čas (odpočet) jako je to při pokusu o zapálení. Časování u zapalování už taky funguje korektně 1-10min.rakocid
ÚčastníkArduino nano som vymenil, nepomohlo.
Program zamrzne v casti ked komunikuje cez zbernicu wire.
Zacne pracovat az po restartovani arduino nano (slave). Restartovanie len mastra nepomaha.
Co by znamenalo keby bol zahlceny buffer?Simakai
ÚčastníkProjekt mám víceméně hotový. Nepodařilo se mi rozběhnout MicroSD modul na klasickém SPI rozhraní spolu s termočlánky (MAX6675), tak jsem na to musel od lesa. Stáhl jsem si SDfat knihovnu a použil tam SoftwareSPI definici pro objekt SD a drátově jsem zapojil MicroSD modul na jiné piny než mám termočlánky. Pak zbývalo jen poladit správné příkazy pro SDfat a fičí to. Po hardwarových SPI pinech 50, 51, 52 mi jedou termočlánky a po softwarových SPI pinech 10, 11, 12 mi jede SD karta.
Onygzz
ÚčastníkKnihovnu pro servo mám jinou než defaultní právě pro to, že ta původní používala stejný časovač jako knihovna pro melodie Tone.h. V této knihovně se to zapisuje délkou pulzu a ne ve stupních. Samostatně to ovládání serva fungovalo, jen mi to nechtělo chodit po té podmínce X úspěšných pokusů. Nakonec jsme to s kamarádem rozchodili. Udělali jsme samostatnou funkci pro otevřít/zavřít servo a tu jsme pak po splnění podmínky X úspěšných tahů jen zavolali. Takže už to víceméně funguje 😉
posjirka
ÚčastníkTak jsem ti zrušil reakci na prostorovy termostat pri procesu zapalovani.
Navic je tam watchdog – resetuje sam procesor kdyz se zakousne (8s)
to tedy vyvolalo zmenu dlouhych delayu na smycku kratkych dealyu.
Pritom tam je navic na kazdem rohu reset casovace watchdogu – zabranuje autoresetu.
Zkus to prosím otestovat. novy kod:// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 27_3_2016 // changelog // 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 termostat� (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 6 //davkovani pelet � snek #define spirala 5 //zapalovaci spirala #define ventilator 3 //ventilator #define alarm 10 //signalizace poruchy #define prostorovyTermostat 12 //prostorovy termostat #define kotlovyTermostat 2 //kotlovy termostat #define fotobunka 8 //fotobu�ka pro kontrolu plamene #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy long cas=13000; int smycka1 = 0; // pomocna smycka - zapaleni int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A1 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 = 12; // 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 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 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, LOW); //vypni davkovani digitalWrite(spirala, LOW); //vypni zhaveni digitalWrite(ventilator, LOW); //potom vypni ventilator } void zapalovaciDavkaPelet() { // prvotni davkovani pelet pro zapaleni Serial.println("Davkuji pelety pro zapaleni ... 12s"); // ladici seriova komunikace digitalWrite(davkovaniPelet, HIGH); //davkuj pelety for (smycka4 = 0; smycka4 < smycka4max; smycka4 ++){ delay(1000); wdt_reset(); // resetuj watchdog } //delay(12000); //po dobu 12s digitalWrite(davkovaniPelet, LOW); //potom vypni davkovani digitalWrite(ventilator, HIGH); //zapni ventilator digitalWrite(spirala, HIGH); //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(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){ // prostorovy nebo kotlovy termostat vypne if(digitalRead(kotlovyTermostat) == LOW){ // prostorovy nebo kotlovy termostat vypne digitalWrite(spirala, LOW); //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(digitalRead(fotobunka) == HIGH){ //pokud fotobunka vidi plamen digitalWrite(spirala, LOW); //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 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(digitalRead(fotobunka) == HIGH){ //pokud fotobunka vidi plamen Serial.println("Test plamene ... hori"); // ladici seriova komunikace digitalWrite(davkovaniPelet, HIGH); //davkuj pelety delay(1000); //pockej 1s digitalWrite(davkovaniPelet, LOW); //vypni davkovani delay(1000); //pockej 1s } else { delay(1000); // pocekej jeste 1s a zkus to znovu if(digitalRead(fotobunka) == LOW){ //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, HIGH); // zapni alarm } } } else { smycka2 = smycka2max; // ukonci smycku } } } void dohoreni() { // funkce dohoreni Serial.println("Dohoreni ..."); // ladici seriova komunikace digitalWrite(davkovaniPelet, LOW); //vypni davkovani pelet digitalWrite(spirala, LOW); //vypni zhaveni - pro jistotu for (smycka6 = 0; smycka6 < smycka6max; smycka6 ++){ delay(1000); wdt_reset(); // resetuj watchdog } //delay(84000); //pockej 84s digitalWrite(ventilator, LOW); //potom 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) == HIGH) { // zapni alarm a cekej na stisk tlacitka digitalWrite(alarm, HIGH); // zapni alarm Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace wdt_reset(); // resetuj watchdog } Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace digitalWrite(alarm, LOW); // vypni alarm porucha = 0; // vynuluj poruchu } else { // jinak Serial.println("Zadna porucha ..."); // ladici seriova komunikace digitalWrite(alarm, LOW); // vypni alarm } }
posjirka
Účastníkve výsledku, napiš nám co přesně má tvůj program dělat a podíváme se na to, nebo tě aspon nasměrujeme. někdy je vhodné použít podmínku „if“ pro přesný čas, nekdy pro časový usek …
možná ti trochu pomůžu příspěvkem z trochu jiného tématu, ale výsledk je podobný.
http://arduino.sk/viewtopic.php?f=4&t=152&sid=48998740df66b243127485c0f35cd739případně tady máš příklad budíku:
http://arduino.sk/viewtopic.php?f=3&t=209&sid=48998740df66b243127485c0f35cd739posjirka
Účastníknrf24l01 mám doma si rok a půl a leží celou dobu v šuplíku 🙂
nechal jsem se nachytat a na ebayi byl veden jako wifi adapter.
Tak jsem jej objednal bez ověření si informací 🙂 . důvěřuj ale prověřuj.
50 m je vcelku dost a moc bych na tu spolehlivost nedal ani v jednom případě.
Nemáš tam třeba ethernet? i tak by to šlo řešit.
Bezdrát budeš ladit dlouho a zbytečně…
Toto budou vcelku choulostivé data a udržet je v pořádku bude znamenat poslat min.2x-3x a porovnat si výsledky. přípaně výběr 2 ze 3 …použij Rs485 a budeš mít klid.
posjirka
Účastníka po 2 hodinách se ti zhroutí komunikace nebo resetuje arduno?
Pokud linka videl bych to na zahlcený buffer, pokud reset arduna tak chyba v čipu.
zkoušel jsi i jiný arduino?
Stačil by čip s ledkou…posjirka
Účastníkodkud máš knihovnu na ovládání serva?
Ano vidím že je pro časovač timer2, ale i tak se na servo zapisuje uhel natočení serva v rozsahu 0-180 st.
Ty máš zapsané
a.write(2000);
tedy 2000 st.
dej tama.write(0); delay(2000); a.write(180); delay(2000);
to by mělo otočit servem zleva doprava.
Navíc
a.attach(9);
by se měl definovat pouze 1x a to ve funkci Setup()rob.brno
Účastníkčlánek připojuj na analog. vstup přes odpor, který při otočení polarity vstup ochrání. Na vstupech atmegy jsou připojeny ochranné diody vůči zemi a VCC, takže veškerá napětí mimo intervalu od asi -0,3V až VCC+0,3V „zkratuje“. Ten odpor omezí zkratový proud, takže zvol vhodnou velikost např. 10k(max. proud při 1,4V do vstupu bude 1,1/10000).
-
AutorPříspěvky