posjirka
Vytvořené odpovědi
-
AutorPříspěvky
-
posjirkaÚčastník
souhlasím se Zbyškem. Asi jedinou variantou je udělat pole objektu (nikoliv proměnných …), které se nadefinuje jako rozěmr pole a poté se pro každý záznam/buňku pole vytvoří instance objektu. Vcelku hezká diskuze a vysvětlení je třeba tu:
https://forum.arduino.cc/index.php?topic=80913.0Zbyšek to napsal velmi správně jen je to v tom textu těžko čitelné.
v podstatě tě zajímá pouze tato část:int BUTTON[] = {2,3,4,5,6}; //button pins const int numButtons = 5; Bounce bouncer[5]; for( int i = 0; i < numButtons; i++){ Bounce bouncer[i] = (BUTTON[i], 5); }
Jinak doporučuju použít standardní řadu proměnných, už jen z důvodu omezené kapacity paměti RAM. Například v C# bych si toto dovolil a použil spíš kolekci než pole pro lepší manipulaci se záznamy. V poli musíš nadefinovat jak bude veliké a v případě zmany velikosti provést „přenesní hodnot“. s kolekcí můžeš dělat co chceš. Je však náročná na paměť a Arduino jinepodporuje. Chci tím říst, že stejně na začátku budeš muset nadefinovat kolik těch objektů budeš chtít vytvořt a ověřit si že máš dostatek volných prostředků. Navíc se budeš odkazovat na objekty jako na realtivní adresy, … Prostě mi to trochu v hlavě nabourává tu jednoduchost řešení případů, pro kterou bylo arduino navrženo…. tyto procesy bych spíš řešil na raspberry pi.
posjirkaÚčastníkotočení klíče do 2. polohy je nejjednodušší varianta a v podstatě je tam to arduino už zbytečné. jak jsem ti posílal odkaz tak to je analogová konstrukce za pár korun a bez programování. Jen pro pořádek dobrá rada: používej autorelé na 12V. Jsou veliké ale budou spolehlivé.
posjirkaÚčastníktady je spoustu faktoru, které to můžou ovlivňovat:
– rušení od řídících jednotek
– načnutý alternátor
– špatná zem
– ….
Máš 2 možnosti:
1, neuvádíš jaký je to auto. Postaru se to řešilo tak, že místo sledování baterie se sledovalo zde je napětí za ořechem (spínací skříňka), která zapíná třeba autorádio atd. Pak bys nemusel sledovat nic analogového jen je/není napětí. jednoduchá konstrukce je třeba tady:
http://paja-trb.cz/konstrukce/aut_svetla.html
2, musíš to napětí , které přivádíš nejdřív oddělit (diodou) a pak vyfiltrovat (kondenzátor 100n + 470u proti zemi).posjirkaÚčastníkvíš vubec na co se ptáš?
Na začátku řešíš nahrání bootloaderu … to jde jedině přes ICSP.
Když ti dám alternativní návod tak píšeš že je na jiný čip a ve výsledku zjistím, že řešíš komunikaci přes UART …posjirkaÚčastník1. nejspíš nemáš nainstalovaný ovladač pro FT232
2. zkontroluj si zda máš správný port COMxx
3. zkontroluj si typ programátoru
4. zkontroluj si výběr správné desky arduino
5. nevím jestli arduino podporuje FT232 jako ISP programator
6. pokud sis tam (do atmegy) zkoušel něco nahrávat mohl jsi nastavit špatné pojistky
7. zkus jiné arduino.
8. zkus jiný programátor – můžeš využit i jiné arduino s programem Aruino as ISP promammer a dáš kondenzátro 10uF mez reset a zem …Use Arduino as an ISP programmer to program non-Arduino AVR microcontrollers
posjirkaÚčastníkco takhle použít pole (array).
Můžeš si nadefinovat pole o 15 hodnotách a ve smyčce for do něj zapisovat hodnoty jednotlivých čidel.
Pole může mít i více než 1 rozměr, takže můžeš udělat i pole o např. 2 rozměrech pro zadání adresy jednotlivých čidel (takže pole 15×8 byte)
podívej se tady:
https://www.arduino.cc/en/Reference/Array
a nejlépe na kapitolu Arrays and FOR Loopsjenom pozor !!! indexace pole začíná číslem 0 nikoliv 1 !!!
posjirkaÚčastníkjá bych řekl, že ty „chyby“ k kodu asi způsobuje fakt, že nepoužíváte místní značky pro vkládání kodu. Tady jsou použity apostrofy nikoliv párovná značka CODE .
Ten můj program je jen rychlý návrh jak by to šlo udělat. Jak sjem psal nemám doma DS3231 jen DS1307 a to ve fromě IO = nemám volný hotový modul.
Chtěl jsem ti jen nastínit jonou možnost řešení …
Když používáš tu násobnou podmínku ve smyčce FOR doporučil bych spíš použít jednotlivé podmínky IF vnořené (kaskádově) v sobě. Lépe se pak chápe funkce a možnosti řešení z pohledu programátora „žáka“ .posjirkaÚčastníkještě máš chybu tady:
for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –) { displayTime(); // display the real-time clock data on the Serial Monitor, analogWrite(svetlo1, brightness); if(brightness == 0) sviti = 0; delay(5000);}
na konci definice smčky for patří 2x minus
for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –-)
jinak ti to nepujde odečítat …..posjirkaÚčastníknapsal jsem jednoduchý příklad.
Je to myslim dobře okomentovaný takže princip by měl být jasný:// priklad principu regulace osvetleni akvaria // v01 // by JP 2016 // // knihovny #include <Time.h> // promenne int jas = 0; // pomocna promenna pro vypocet jasu const int LED = 10; // pin s LED diodou // nasatveni casovace int casovac[24] = {0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // jednotlive polozky casovace predstavuji intenzitu jaku v celou hodinu // 1. cislice je intenzita osvetleni v 0:00 // 2. cislice je intenzita osvetleni v 1:00 // ... // 23. cislice je intenzita osvetelni v 23:00 // cislice jsou v rozsahu: // 0 = 0% // 255 = 100% void setup() { Serial.begin(9600); // nastaveni seriove komunikace pinMode(LED, OUTPUT); // nastaveni pinu jako vystup } void loop() { // vypis na seriovy port Serial.print(hour()); // hodiny Serial.print(":"); Serial.print(minute()); // minuty Serial.print(":"); Serial.print(second()); // sekundy Serial.print(" Jas:"); Serial.println(jas); // aktualni jas // kdyz je 23 hodin je treba porovnavat hodnoty cislice 23 a 0 if(hour() == 23) { // nastav jas podle aktualni minuty a hodiny jas = map(minute(), 0, 59, casovac[23], casovac[0]); // ochrana proti hazardnimu stavu prepoctu jas = constrain(jas, casovac[23], casovac[0]); } else { // jinak porovnej hodnoty cilice pole = aktualni hodina a vedlejsi cislice jas = map(minute(), 0, 59, casovac[hour()], casovac[hour()+1]); // ochrana proti hazardnimu stavu prepoctu jas = constrain(jas, casovac[hour()], casovac[hour()+1]); } jas = constrain(jas, 0, 255); // omezeni rozsahu regulace analogWrite(LED, jas); // nastav aktualni intenzitu delay(1000); // pauza 1s }
posjirkaÚčastníkpodle mých výpočtu by to mělo resetovat po 21 minutách 🙂
Když se na ten program podívaáš, tak ve smyčce ( loop() ) ti neustále :
– nastavuje vstup „svetlo1“ jako výstupní (pinmode)
– pak ti zobrazí aktuální čas (displayTime)
– počká 1 s
– přečte si aktuální čas (readDS3231time)
– zjistí jestli není náhodou den (if (h>=8 ….)
– spustí sekvenci rozsvícení (podmíněnou dalšími faktory) a ta trvá 255 kroku * 5s zpoždění = cca 21minut.
….po tu dobu rozsvěcení vlastně cykluje sám v sobě a tím pádem nezobrazuje na „serialmonitor“ žádné hodnoty. jestli to chceš vypisovat tak musíš příkaz „displayTime();“ dát i do symček „for“.
proč se ti resetuje / znovu načítá nevím, nekde je chybka v proměnných „den“, „sviti“, „brightness“. Když tak na to koukám, tak on ti vlastně nikdy nedojede v rozsvícení na „brightness = 255“, protože ve smyčce „for“ mu dáváš podmínku „brightness < 255“. Tzn. že ti skončí ve 254 kroku 🙂 .
Já bych celou tuto situaci řešil asi trochu jinak. Na počátku bych si nadefinoval pole o 24 pozicích (0-23 hodin) do nich bych si zapsal jakou intenzitu mají mít v nulté minutě a pomocí fuknce „map()“ bych plynule přecházel mezi jednotlivými hodnotami.
Ano trvalo by to 1 hodinu než by se rozsvítilo světlo naplno/zhasnulo ale bylo by to mnohem čistší řešení …nemám moc rád tyhle vnořené podmínky, člověk se v nich ztrácí.
posjirkaÚčastníktak ti nevím. V popsiu je Battery input takže bych to bral jako vstup.
Pak jsem našel v datasheetu toto:
The device is UL recognized to ensure against reverse charging when used with a primary lithium battery.no a na netu jsou i moduly s baterii cr2030:
vzheldem k tomu, že to má pouze 1 vstup a nikde nabijecí pin nevidím … chtělo by to sehnat schéma toho tvého modulu.
ještě mě napadlo: to že tam je baterie napevno (tzn. připájena na páskách, neznamená, že je nabijecí….
posjirkaÚčastníknechápu ???? Myslíš jako výměnu baterie nebo použití baterie jako primárního zdroje pro apliakci?
posjirkaÚčastníkzřejmě čínská pomsta zahnívajícímu západnímu kapitalusmu 🙂
Ne vážně, to se občas stane a je super že jsi na to přišel sám.
Chybami se člověk učí. Hlavně že to funguje.posjirkaÚčastníkzkus to na jiném PC a pak zkus jiný kus arduina. CH340 mohla odejít do věčných digitálních lovišť. Kdyby odešel tak Arduino nemusíš vyhazovat. Můžeš jej naprogramovat přes ICSP port a použit v nějáké aplikaci.
Napadá mě ještě chybný konektor (zapatlané piny na konektoru), vadný krystal pro Ch340g a pod.
Když to Arduino zapojíš do USB portu tak předpokládám, že LED POWER svítí a LED „L“ na 13 pinu bliká (defaultní program blik). Pokud jo tak Arduino funguje a je to chyba jen komunikace. My máme 3 klony s tímto čipem a všechny fungují ….posjirkaÚčastníka co když zkusíš tenhle exampl.
Tutoriál – užívání hodin reálného času DS1307 a DS3231 s Arduinem
Ten funguje? Ten projekt osvětlení akvaria v podstatě jen rozšiřuje tento tutorial.
Pak mě napadá jen pár věcí proč to nefunguje:
– špatné zapojení (např prohození SDA a SCK)
– špatný modul/čip DS3231
– chybná adresa modulu (na modulu se dá nastavit tak můžeš mít nastavenou jinou než defaultní)DS3231 bohužel doma nemám a nedostává se mi času s tím experimentovat ….
-
AutorPříspěvky