letakp
Vytvořené odpovědi
-
AutorPříspěvky
-
letakpÚčastník
Tak ten kód, jenom jsou tam pro čas i sekundy, ty být nemusí, a místo toho nějaký znak pro zobrazení svitu LED a teplota je místo z čidla externího braná z DS3231.
Tak kód mi nejde vložit, nevím proč, pořád to píše err 403
letakpÚčastníkTak zatím obrázek jak bych si to představoval, kód dodám později.
Attachments:
letakpÚčastníkAhoj. Tak po delší době jsem si pořídil displej s I2C sběrnicí a na vyzkoušení jsem použil program pro ovládání LCD displeje jen pro ověření činnosti. A nyní k mému dotazu.
Jakým způsobem by šlo dát oba tyto kódy dohromady aby mi fungovalo stmívání a rozsvěcení LED pásku a zároveň mohl mít zobrazeno na displeji datum, čas, teplotu z čidla (teplota vody akvaria) případně ještě znak pro svícení nebo nesvícení?Už jsem zkoušel dát kódy dohromady, ale buďto nešel displej a nebo mi to nešlo ani načíst v programu 🙁
Děkuji za každé popostrčení.
letakpÚčastníkDíky psjirko za upozornění, já si to bral jako překlad z ArduinoIDE Kopírovat pro použití ve fóru a ono to dělá toto.
Správná varianta je:#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 second byte 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 ++) { 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);} }
A zatím, co ji testuju už skoro týden, tak chodí bez problémů.
Na ty pole, jak jsi mi nastínil se moc necítím. Trochu jsem to četl, ale asi jsem už starší a pomaleji chápu, tak radši budu mít tuto jistotu. Ale i tak díky za popostrčení, bylo to velmi užitečné, myslím i pro vnouzirozbijsklo.letakpÚčastníkNevím proč ale při kopii programu do schránky se nezobrazuje správně řádek:
for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness –) {Správně tam patří rightness >=0; brightness –) jak mně upozornil posjirka.
letakpÚčastníkSorry, neposlalo se to 🙁
Je to zde:
[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 ++) {
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);}}
[/code]
letakpÚčastníkTak to jsem vyřešil stejně jako to kolísání při rozsvěcení. Je potřeba dát na konci řádku informaci o tom, že hodnota je větší NEBO rovna 0. Zatím funkční část tvého programu s mýma úpravama je tady :
letakpÚčastníkDíky za upozornění, ale v programu to bylo tak, jak to má být, nevím, buďto jsem to opravil hned po nahraní na forum a nebo se to smázlo cestou na forum 😀
Včera jsem to zkoušel a v poho to celý den svítilo a večer to pohaslo až do konce.
pokud to bude fungovat, zkusim ještě tu tvoji verzi a uvidim, co bude vyhovovat víc.
Ještě mám v plánu pořídit displej a zobrazovat aktuální čas a třeba teplotu nasnímanou z čidla teploty. Snímač CO2 jsem zatím neviděl, tak to by bylo ještě něco, co by mi tam chybělo aby to bylo dokonalé.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.
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]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.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);}}
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ěď.
Pavel -
AutorPříspěvky