GabrielM
Vytvořené odpovědi
-
AutorPříspěvky
-
jurisek81
ÚčastníkDobrý den,
na 2-3 týdny jsem pracovně zaneprázdněný. Pak tohle můžeme řešit.
JK
krkstex
ÚčastníkJaký by měl být další postup? Nejsem příliš zkušený ve vývoji.
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 }
letakp
ÚčastníkZatím jsem upravil void loop a funguje mi to asi tak, jak jsem si představoval.
výpis loop zde:
void loop()
{pinMode(svetlo1,OUTPUT);
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every secondbyte s, m, h, dvt, dvm, mesic, r;
readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);if (h >= 8 && h < 21) den = 1; // nastaveni intervalu sviceni
else den = 0;
for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
displayTime(); // display the real-time clock data on the Serial Monitor,
analogWrite(svetlo1, brightness);
if(brightness == 255) sviti = 1;
delay(5000);}
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);}}
letakp
ÚčastníkTo-posjirka Tak to, že by se to rozsvěcelo hodinu by nevadilo, ba naopak, jenom přesně nechápu, jak to myslíš s těmi poli, jestli máš chvilku, zkus mně alespoň navést, zkusim si o tom něco přečíst, uvidim, co ze mně vypadne. Díky.
ArduXPP
ÚčastníkVčera se mi nedal odkaz do příspěvku.
Tak tady je https://bastlirna.hwkitchen.cz/tutorial-uzivani-hodin-realneho-casu-ds1307-a-ds3231-s-arduinem/
Píše o tom Kolbis .
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í.
letakp
ÚčastníkTo-ArduXPP Ta baterie je jenom záložní, takže se nenabíjí. Má jenom 3,5V a do destičky se pouští 5V.
To-posjirka Tak čip je odzkoušený a funkční. Teď ještě odladit prográmek pro to akvárko, něco se mi tam nezdá, ještě musím posledovat chování v průběhu dne a při různých poruchových stavech, zatím co jsem zjistil, že pokud je v režimu noc, tak LED TX bliká co 1sec. a když dopočítá 255 kroků do úplného rozednění, tak přestane LED TX blikat a ani na výpisu monitoru se neobjevují nové informace o čase. A taky se mi asi po cca 30 minutách resetuje a startuje znovu, ale LED nebliká.
Datasheet k DS3231 je zde: https://datasheets.maximintegrated.com/en/ds/DS3231.pdfTady je výpis mé úpravy programu z prvního příspěvku:
[code]
#include <Wire.h>
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
int svetlo1 = 9;
int sviti = 0;
int den = 0;
int jas = 0;byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
void setup()
{Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(00,59,18,7,05,06,16);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=pondeli, 7=nedele)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
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);
// request seven bytes of data from DS3231 starting from register 00h
*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 displayTime()
{
;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(„:“);
if (minute<10)
{
Serial.print(„0“);
}
Serial.print(minute, DEC);
Serial.print(„:“);
if (second<10)
{
Serial.print(„0″);
}
Serial.print(second, DEC);
Serial.print(“ „);
Serial.print(dayOfMonth, DEC);
Serial.print(„/“);
Serial.print(month, DEC);
Serial.print(„/“);
Serial.print(year, DEC);
Serial.print(“ Den: „);
switch(dayOfWeek){
case 7:
Serial.println(„nedele“);
break;
case 1:
Serial.println(„pondeli“);
break;
case 2:
Serial.println(„utery“);
break;
case 3:
Serial.println(„streda“);
break;
case 4:
Serial.println(„ctvrtek“);
break;
case 5:
Serial.println(„patek“);
break;
case 6:
Serial.println(„sobota“);
break;
}
}
void loop()
{pinMode(svetlo1,OUTPUT);
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every secondbyte s, m, h, dvt, dvm, mesic, r;
readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);if (h >= 8 && h < 20) den = 1; // nastaveni intervalu sviceni
else den = 0;
for (byte brightness = 0; den == 1 && sviti == 0 && brightness < 255; brightness ++) {
analogWrite(svetlo1, brightness);
if(brightness == 255) sviti = 1;
delay(5000);
}for (byte brightness = 255; den == 0 && sviti == 1 && brightness > 0; brightness –) {
analogWrite(svetlo1, brightness);
if(brightness == 0) sviti = 0;
delay(5000);}}
[/code]ArduXPP
ÚčastníkZbyšek Voda
ÚčastníkTak si to musíte nějak podmínit. Když to je přímo v loopu, tak ten se spouští pořád dokola. Potom se „impulz“ vysílá pořád dokola.
Nevím, jak přesně to má fungovat. Ale třeba na stisknutí tlačítka může reagovat takto (zjednodušeno).
void setup(){ pinMode(2, INPUT); pinMode(3, OUTPUT); } void loop(){ if(digitalRead(2) == HIGH){ digitalWrite(3, HIGH); delay(500); digitalWrite(3, LOW); delay(1000); } }
borovecek
ÚčastníkTo jsem již zkousel. Ale když jsem si to zkoušel s led diodou tak to stale problikavalo. Ale já potřebuji jen jeden impuls.
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í….
Zbyšek Voda
ÚčastníkDobrý den. Krátký impulz uděláte tak, že na výstup „nastavíte“ HIGH a po malé chvilce zase LOW.
Takže třeba
digitalWrite(pin, HIGH); delay(500); digitalWrite(pin, LOW);
Nastaví na půl sekundy výstup do logické 1.
ArduXPP
ÚčastníkKoupil jsem si DS3231 a ten i baterii nabíjí. Baterie CR2032 je nenabíjecí.
posjirka
Účastníknechápu ???? Myslíš jako výměnu baterie nebo použití baterie jako primárního zdroje pro apliakci?
ArduXPP
ÚčastníkKdyž budu chtít u modulu použít baterii CR2032 je potřeba přerušit obvod dobíjecí ?
letakp
ÚčastníkAhoj, právě když jsem zkoušel všechny možnosti s RTC, tak mi to nefungovalo nikdy.
Špatně zapojené SDA a SCK jsem vyloučil otočením a stále nic.
Tak jsem si prohlédl čip pod lupou a zjistil jsem, že je polovina nožiček ve vzduchu. Dneska to přiletuju a večer doma odzkouším funkčnost. Díky zatím za malou nápovědu v čem by ten problém mohl být.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.petrcaltik
ÚčastníkFotka se mi nedaří nahrát…
petrcaltik
ÚčastníkProblém vyřešen… 🙂 Při zoufalém zkoušení jsem začal prohlížet všechny pájené spoje a zjistil jsem že dva kontakty USB konektoru na arduinu jsou spájené, po proškrábnutí nožem vše funguje! 🙂 posjirka-díky za reakci! 🙂
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 ….
letakp
ÚčastníkTak jsem se díval na ty knihovny a zjistil jsem, že tam asi fakt nic není, tak jsem stáhl a nainstaloval knihovnu a potom se před #include „wire.h“ nainstalovalo toto:
#include <RtcDateTime.h>
#include <RtcDS3231.h>
#include <RtcTemperature.h>Ale stejně to na monitoru vypisuje to stejné.
letakp
ÚčastníkTak toto je moje verze upravená podle původního návrhu od vnouzirozbijsklo:
#include „Wire.h“
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
int svetlo1 = 9;
int sviti = 0;
int den = 0;
int jas = 0;byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
void setup()
{Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(30,27,19,7,15,11,15);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=pondeli, 7=nedele)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
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);
// request seven bytes of data from DS3231 starting from register 00h
*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 displayTime()
{
;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(„:“);
if (minute<10)
{
Serial.print(„0“);
}
Serial.print(minute, DEC);
Serial.print(„:“);
if (second<10)
{
Serial.print(„0″);
}
Serial.print(second, DEC);
Serial.print(“ „);
Serial.print(dayOfMonth, DEC);
Serial.print(„/“);
Serial.print(month, DEC);
Serial.print(„/“);
Serial.print(year, DEC);
Serial.print(“ Day of week: „);
switch(dayOfWeek){
case 7:
Serial.println(„nedele“);
break;
case 1:
Serial.println(„pondeli“);
break;
case 2:
Serial.println(„utery“);
break;
case 3:
Serial.println(„streda“);
break;
case 4:
Serial.println(„ctvrtek“);
break;
case 5:
Serial.println(„patek“);
break;
case 6:
Serial.println(„sobota“);
break;
}
}
void loop()
{pinMode(svetlo1,OUTPUT);
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every secondbyte s, m, h, dvt, dvm, mesic, r;
readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);if (h >= 9 && h < 21) den = 1; // nastaveni intervalu sviceni
else den = 0;
for (byte brightness = 0; den == 1 && sviti == 0 && brightness < 255; brightness ++) {
analogWrite(svetlo1, brightness);
if(brightness == 255) sviti = 1;
delay(3500);
}for (byte brightness = 255; den == 0 && sviti == 1 && brightness > 0; brightness –) {
analogWrite(svetlo1, brightness);
if(brightness == 0) sviti = 0;
delay(3500);}}
posjirka
ÚčastníkMožná to nebyly chybičky ale jiná verze knihovny.
Pošli sem tvuj program a uvidíme.Zbyšek Voda
ÚčastníkDobrý den, jestli se nepletu, tak knihovna WiFi.h je určena pro oficiální WiFi shield.
ESP je možné ovládat pomocí AT příkazů, které budete posílat přes sériovou linku, např:
Serial.println("AT");
caci
ÚčastníkProjekt je již dokončen.
letakp
ÚčastníkDobrý den. Jsem akvarista amatér a toto téma mně chytlo a chtěl jsem vyzkoušet to stmívání a rozednívání LED pásků. Proto jsem otevřel toto téma a nahrál program do programu a projel test. Při tomto jsem zjistil pár drobných chybiček, ty jsem opravil a program mi v seriovém monitoru nezobrazuje aktuální čas a datum. vypisuje mi pouze tuto hlášku každou vteřinu: 45:165:85 165/165/165 Day of week:
Chtěl jsem se zeptat, co mám špatně. Mám RTC DS3231 a klon NHduino UNO. Děkuji za odpověď.
Pavelmartin.kouda
ÚčastníkDobrý den,
tak jsem pokročil o kousek dál. Měl jsem jako vývojovou desku vybranou „Arduino Uno“:• switch jsem dal do OFF, nahrál sketch PR1.ino (viz. přílohy), program se nahrál a na seriovém monitoru vypisoval co má
• switch jsem dal do OFF, nahrál sketch PR2.ino (viz. přílohy), program se nahrál a seriový monitor napsal „WiFi shield not present“ 🙁
• z popsaného postupu se mi povedlo „Example 1: Arduino to WiFi communication“ i s výpisem v TCP debugeru; druhý příklad mi ve finále nevypisoval v TCP debugeru nic, možná je chyba v tom, že mám na routeru nastavené zabezpečení WPA-PSK ale heslo jsem v konfiguraci zadal správnéTento shield se nedá použít s knihovnou #include <WiFi.h> a pracovat s ním jako ve sktchi PR2.ino?
Díky
-
AutorPříspěvky