DS1307 órachippel beállítható kapcsolóóra

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

időkapcsolás órával

HozzászólásSzerző: Victor » 2012. december 3. hétfő, 8:17

Sziasztok!

Segítséget szeretnék kérni. Azt szeretném kérdezni, hogy lehet valahogy hivatkozni a programban egy adott időpontra, nem vagyok villamossági szaki, de ha jól értem a dolgot akkor csak az órachip belső ébresztő funkciójáról volt szó. Sajnos a neten sem találtam hasonlóra példát.
Konkrétan nekem arra lenne szükségem, hogy adott időpontokban be, illetve kikapcsoljak kimeneteket, akváriumhoz szeretném használni, világítás kapcsolás, reggel be, este ki , illetve vannak növénytáppumpáim, ezeket pedig egy adott időpontban, csak pár másodpercre kellene kapcsolni.
Az alábbi programom van, ezt szeretném kiegészíteni több kapcsolt kimenettel. (Sajnos a napot valamiért téveszti, de számomra nincs jelentősége)
Előre is köszi a segítséget!
Üdv:Viktor

Kód: Egész kijelölése

#include <Wire.h>

int hour;
int minute;
int second;
int month;
int day_of_week;
int day;
int year;

char* dow[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup()
{
  Serial.begin(9600);
  Wire.begin();
 
}

void loop()
{
  // Below required to reset the register address to 0.
  Wire.beginTransmission(104); // transmit to device #104, the ds 1307
  Wire.write(0x00);
  Wire.endTransmission();    // stop transmitting
 
  Wire.requestFrom(104, 7);    // request 7 bytes from slave ds1307, we'll assume it'll send them all even though it doesn't have to
  second = Wire.read();
  minute = Wire.read();
  hour = Wire.read();
  day_of_week=Wire.read();
  day = Wire.read();
  month = Wire.read();
  year = Wire.read();

  // Convert all the BCD values that might have "tens" to decimal.  Most arduino folks do this w/shifts but this just looks easier to me.
  hour=hour/16 * 10 + hour % 16;
  minute=minute/16 * 10 + minute % 16;
  second=second/16 * 10 + second % 16;
  day=day/16 * 10 + day % 16;
  month=month/16 * 10 + month % 16;
  year=2000 + year/16 * 10 + year % 16;
 
  Serial.print(hour);
  Serial.print(":");
  if (minute < 10) { Serial.print("0"); }
  Serial.print(minute);
  Serial.print(":");
  if (second < 10) { Serial.print("0"); }
  Serial.print(second);
  Serial.print(" ");
  Serial.print(dow[day_of_week-1]);  // array is 0-6, but the dow register holds 1-7, so subtract 1.
  Serial.print(", ");
  Serial.print(month);
  Serial.print("/");
  Serial.print(day);
  Serial.print("/");
  Serial.print(year);
  Serial.print("\n");
 
 
 
  delay(1000);
}

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9859
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. december 3. hétfő, 9:11

2 tipp:
- belső ébresztőt használod, ekkor a chip INT lábán van jelválozás.
- kiolvasod időnként az órát. ha a beállított időponttal egyezik, akkor be/kikacsolsz eszközöket.

E második megoldás teljesen rugalmas, hisz korlátlan ki/bekapcsolást tudsz végezni. napi, heti, havi, óránkénti beosztásban...

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 3. hétfő, 13:19

Robert írta:- kiolvasod időnként az órát. ha a beállított időponttal egyezik, akkor be/kikacsolsz eszközöket.


Igen ez utóbbival próbálkozok, csak nem sok sikerrel. Lehet, hogy rossz oldalról próbálom megközelíteni a problémát, de még eléggé kezdő vagyok. A megoldáshoz megpróbáltam ihletet meríteni, egy termisztoros vezérlésből. ahol a termisztor adatai kiolvasódnak, és ha egyezés van , illetve kisebb, vagy nagyobb az érték mint ami be van állítva akkor kapcsol egy kimenetet.
Sajnos, az óra, perc, másodperc közötti kettőspont, alsó vonal elválsztásokat nem szereti a program, így per jelre kellett módosítanom.
de sajnos valami nem ok, mert nem kapcsol :(

Egyenlőre még meghagytam az eredeti elnevezéseket, és töröltem a dátum megjelenítését.

A termisztoros progi amit alapul vettem,
http://www.youtube.com/watch?v=_fNto4JOu4E
csak az "if (tempC <54)" sortnál próbálkoztam az if (tempC =12/44/00) beállítással,, de nem kapcsolt
"Serial.println((byte)tempC);" sort kipereztem, meg emiatt felesleges adat jelent csak meg

Kód: Egész kijelölése

#include <Wire.h>
float tempC;
int tempPin = 0;
int hour;
int minute;
int second;
int month;
int day_of_week;
int day;
int year;
int relPin = 9;

char* dow[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  digitalWrite(relPin, LOW);
  pinMode(relPin,OUTPUT);
}

void loop()
{
  // Below required to reset the register address to 0.
  Wire.beginTransmission(104); // transmit to device #104, the ds 1307
  Wire.write(0x00);
  Wire.endTransmission();    // stop transmitting
 
  Wire.requestFrom(104, 7);    // request 7 bytes from slave ds1307, we'll assume it'll send them all even though it doesn't have to
  second = Wire.read();
  minute = Wire.read();
  hour = Wire.read();
  day_of_week=Wire.read();
  day = Wire.read();
  month = Wire.read();
  year = Wire.read();

  // Convert all the BCD values that might have "tens" to decimal.  Most arduino folks do this w/shifts but this just looks easier to me.
  hour=hour/16 * 10 + hour % 16;
  minute=minute/16 * 10 + minute % 16;
  second=second/16 * 10 + second % 16;
  day=day/16 * 10 + day % 16;
  month=month/16 * 10 + month % 16;
  year=2000 + year/16 * 10 + year % 16;
 
  Serial.print(hour);
  Serial.print("/");
  if (minute < 10) { Serial.print("0"); }
  Serial.print(minute);
  Serial.print("/");
  if (second < 10) { Serial.print("0"); }
  Serial.print(second);
  Serial.print(" ");
 
  Serial.print("\n");
 

tempC = analogRead (tempPin);
//tempC = tempC * 5;
//Serial.println((byte)tempC);
if (tempC =12/44/00)
{
 digitalWrite (relPin, HIGH);
}
else
{

 digitalWrite(relPin, LOW);
}

   
  delay(1000);
}


Létszives segítség egy mintával, hogy is kellene kinézzen egy normális órakapcsolás.
Köszi előre is!
Üdv:Viktor :(

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3221
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. december 3. hétfő, 13:54

Ezt így sorozatos osztási műveletnek értelmezi a fordító: (tempC =12/44/00)

Te viszont String összehasonlítás műveletet akarsz.
2 érték Egyenlő vizsgálat?: x==y
String jelölése: „ „

Tehát:
char tempC[10]

tempC =”12/44/00” //Értékadás

if (tempC ==”12/44/00”) //Feltétel vizsgálat
:wink:

Baloldalon van 1 ilyen hirdetés:
60 nap alatt Arduino
Ingyenes oktatás?
Nem, hiszed?
Innen mindent megtudhatsz!

Jelentkezz!
Az ilyen 1*ű dolgok megtanulásában segít!


:D

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 3. hétfő, 14:40

Közi szépen a segítséget!
megpróbálok ebben az irányban kísérletezni :) .
A 60 napos tanfolyamra fel vagyok iratkozva, és próbálgatok is gyakorlatban ezt-azt megcsinálni, főleg olyanokat amiket itthon szeretnék megcsinálni (akváriumvezérlés, indirekt elektromos boler& kazán összekapcsolása) . Kérdésemet is eredetileg a 33-as leckénél tettem fel, mivel azt már megkaptam de az órachip ilyen irányú megvalósítása nem volt a leckében, és sajna neten sem találtam példákat. Viszont úgy látszik valami új dolgot vethettem fel ezért moderálva lett, és új topicként lett megnyitva.
Még egyszer köszi.

Üdv:Viktor

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9859
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. december 3. hétfő, 15:05

Csak ez új téma :). a tanfolyamon direkt nem a DS1307-es IC lett körbejárva, mert az kb 2-2.5x annyi mint a PCF sorozatúak....
És tudásban ugyanott van....

Viszont ez projektfeladat már, nem csak "részmegoldás" mint a 60 napos leckében...
Ezért osztottam ketté a fórumban és kapott önálló témát. Így nem olvad be a többi órachipes thread-ba...

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 9. vasárnap, 14:08

egyenlőre így sikerült megcsinálni, sajna gyenge pontja, hogy ha a bekapcsolás környékén pont áramszünet van, akkor utólag már nem kapcsol be.

#include <Wire.h>

int hour;
int minute;
int second;
int relPin = 10;



void setup()
{
Serial.begin(9600);
Wire.begin();
digitalWrite(relPin, LOW);
pinMode(relPin,OUTPUT);
}

void loop()
{
// Below required to reset the register address to 0.
Wire.beginTransmission(104); // transmit to device #104, the ds 1307
Wire.write(0x00);
Wire.endTransmission(); // stop transmitting

Wire.requestFrom(104, 7); // request 7 bytes from slave ds1307, we'll assume it'll send them all even though it doesn't have to
second = Wire.read();
minute = Wire.read();
hour = Wire.read();

hour=hour/16 * 10 + hour % 16;
minute=minute/16 * 10 + minute % 16;
second=second/16 * 10 + second % 16;


Serial.print(hour);
Serial.print(":");
if (minute < 10) { Serial.print("0"); }
Serial.print(minute);
Serial.print(":");
if (second < 10) { Serial.print("0"); }
Serial.print(second);
Serial.print("\n");
delay(1000);

if (hour == 13)
if (minute == 51)
{
digitalWrite (relPin, HIGH);
}
if (hour == 14)
if (minute == 00)
{
digitalWrite (relPin, LOW);
}


}

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9859
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. december 9. vasárnap, 14:31

Ez melyik chipre vonatkozik?

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 9. vasárnap, 15:57

Robert írta:Ez melyik chipre vonatkozik?


Természetesen a DS1307-esre, ilyenem van:
http://www.ebay.com/itm/280937969624?ss ... 1497.l2649

Mivel több kimenetet akarok kapcsolni, és ezeket különböző időpontban, ezért a chip belső ébresztőjét nem tudom használni.

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 10. hétfő, 10:29

Ismét egy kicsit elakadtam :(
azzal próbálkozom, hogy egy esetleges áramszünet, illetve persze üzembe helyezéskor bekapcsoljon a szükséges kimenet. Mivel a szerkezet akváriumot vezérelne, így nem volna jó, ha csak másnap kapcsolna fel a világítás :)
szóval a következő megoldással próbálkoztam, ami az adott időtartam elmúltával be is kapcsolta a kimenetet, az én estemben egy relépanelt

Kód: Egész kijelölése

 if (hour == 9) {hour > 9;};
 if (minute == 42) {minute > 42;};
 {
 digitalWrite (relPin, HIGH);
 }
 if (hour == 10)
 if (minute == 10)
 {
 digitalWrite (relPin, LOW);
 }


A bibi ott van, hogy a jelen esetben ugyan 10:10-kor lekapcsol a kimenet, de 10:11-kor visszakapcsol, ha viszont a programrész második felét is hasonlóan csinálom meg akkor egyáltalán nem kapcsol bármilyen feltételt nagyobb vagy kisebbség jelet használok is. A relépanelen pedig a relé LED-je a programfrissítéssel együtt (TX LED-el együtt) pislog

talán valami bizonyos időpontól, bizonyos időpontig megoldás kellene, csak nem tudom hogyan.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9859
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. december 10. hétfő, 11:15

Tipp:
Ne időpontot kezelj ki/bekapcsoláskor, hanem időtartamot.

Kód: Egész kijelölése

ha idő > 6:30 és idő <7:10 akkor lámpa_fel különben lámpa_le


Ezért tipp:
Az időt ha napi bontást csinálsz percben, akkor az éjfél óta eltelt perceket számolj!
7:10 így 7*60+10 = 430 lesz.

Könnyebb kezelni.
A fenti példa:

Kód: Egész kijelölése

ha (idő > 390 és idő <430) akkor lámpa_fel különben lámpa_le


Ha egy relé be van kapcsolva és újra bekapcsolod - semmi nem változik. Marad bekapcsolva.

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 10. hétfő, 12:29

Köszi a tippet, így úgy tűnik jó lesz, de hasonló probléma van mint az előbbi megoldásnál, vagyis amikor lekapcsol utána a TX LED-el együtt a relépanelon is pislog a LED

talán másképp kellene megírni, most így néz ki a programrész, mer mintha most nem kapcsolna le teljesen

Kód: Egész kijelölése

 if (hour*60+minute>=740)
 {
 digitalWrite (relPin, HIGH);
 }
 if (hour*60+minute>=742)
 {
 digitalWrite (relPin, LOW);
 }

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3221
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. december 10. hétfő, 14:25

Persze, hogy nem jó!

Ha eredmény nagyobb 742-nél. Akkor 740-nél is nagyobb!
Vagyis előbb bekapcsol, aztán ki.
:lol:

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9859
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. december 10. hétfő, 16:33

Ne így használd a szerkezetet:
If - then - else alapelv (ha-akkor-különben)

Kód: Egész kijelölése

if (feltétel) {
ha igaz;
}
else
{
hamis ág;
}

Avatar
Victor
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2012. április 16. hétfő, 6:00

HozzászólásSzerző: Victor » 2012. december 11. kedd, 0:46

szóval akkor így?
(23:38-kor be)


Kód: Egész kijelölése

if (hour*60+minute >=1418) {digitalWrite (relPin, HIGH);}
 else
 digitalWrite (relPin, LOW);


csak ezzel az a gond, hogy egészen éjfélig bekapcsolva marad a kimenet, amikor kisebb lesz az érték, mint 1418.


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég