• Most regisztráltál, de nem tudsz privát üzenetet küldeni?

    Kérjük olvasd el milyen korlátozások vonatkoznak rád, miután regisztrációd jóvá lett hagyva.
    Regisztrációs korlátozások

Építsünk akváriumvezérlőt Arduino-ból

Köszönöm, esetleg az említett Kínai oldal elérhetősége? ;)

Nem lehet linkelni a fórumon, de gondolom privátban el tudjátok intézni. Ahogy látom még korlát van nálad ezért nem tudsz üzenetet küldeni, de talán fogadni igen.
 
Hidd el szívesen segítenék, de úgyis az lenne, hogy "aukciós oldal moderálva". Meg a GA-s fiúk sem szoktak ennek nagyon örülni érthető okokból. De amúgy Gúgli a barátod és az aukciós oldal kifejezés is eléggé árulkodó...
 
Mondjuk úgy, hogy "nemzetközi aukciós oldal", legalábbis én onnan vettem mindent. Viszont ott csak Paypal számlával tudsz vásárolni!
Linket sajna hiába is kérnél, az automoderáció a privát üzeneteket is vizsgálja, és átírja a linket
 
Sziasztok!
Már úgy 2 hónapja követem ezt az Arduino-s projectet, és ezen felbuzdulva vettem én is egy MEGA 2560-at, egy Nano-t (jó lesz másra :) ) , DS18B20, reléket meg mindenféle kütyüt ami kellhet.
Össze is ollóztam az általatok közreadott kódokból egy sajátot, és most úgy néz ki a megadott hőmérsékletnél ki-be kapcsolgatja egy relé a fűtést, ezenkívül a szűrőt gombnyomáskor leállítja 5 percre etetéshez.

Az a problámám, hogy én a DS1302 óramodult vettem meg, és nem bírom használni. Az időt sikerült beállítani rajta, ki is írja serialon mp-ként, de nem tudom felhasználni arra amire ti, hogy időzítsek vele.
Tudnátok segíteni benne?
Leírom, hogy melyik kódot használom most hozzá, hátha abban van a megoldás:

Kód beillesztése:
// DS1302_Serial_Easy (C)2010 Henning Karlsen
 
// web: http://www.henningkarlsen.com/electronics
 
//
 
// A quick demo of how to use my DS1302-library to
 
// quickly send time and date information over a serial link
 
//
 
// I assume you know how to connect the DS1302.
 
// DS1302:  CE pin    -> Arduino Digital 2
 
//          I/O pin  -> Arduino Digital 3
 
//          SCLK pin  -> Arduino Digital 4
 
 
 
#include <DS1302.h>
 
 
 
// Init the DS1302
 
DS1302 rtc(2, 3, 4);
 
 
 
void setup()
 
{
 
  // Set the clock to run-mode, and disable the write protection
 
  rtc.halt(false);
 
  rtc.writeProtect(false);
 
 
 
  // Setup Serial connection
 
  Serial.begin(9600);
 
 
 
  // The following lines can be commented out to use the values already stored in the DS1302
 
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
 
  rtc.setTime(12, 0, 0);    // Set the time to 12:00:00 (24hr format)
 
  rtc.setDate(6, 8, 2010);  // Set the date to August 6th, 2010
 
}
 
 
 
void loop()
 
{
 
  // Send Day-of-Week
 
  Serial.print(rtc.getDOWStr());
 
  Serial.print(" ");
 
 
 
  // Send date
 
  Serial.print(rtc.getDateStr());
 
  Serial.print(" -- ");
 
 
 
  // Send time
 
  Serial.println(rtc.getTimeStr());
 
 
 
  // Wait one second before repeating :)
 
  delay (1000);
 
}
 
Sziasztok!
Már úgy 2 hónapja követem ezt az Arduino-s projectet, és ezen felbuzdulva vettem én is egy MEGA 2560-at, egy Nano-t (jó lesz másra :) ) , DS18B20, reléket meg mindenféle kütyüt ami kellhet.
Össze is ollóztam az általatok közreadott kódokból egy sajátot, és most úgy néz ki a megadott hőmérsékletnél ki-be kapcsolgatja egy relé a fűtést, ezenkívül a szűrőt gombnyomáskor leállítja 5 percre etetéshez.

Az a problámám, hogy én a DS1302 óramodult vettem meg, és nem bírom használni. Az időt sikerült beállítani rajta, ki is írja serialon mp-ként, de nem tudom felhasználni arra amire ti, hogy időzítsek vele.
Tudnátok segíteni benne?
Leírom, hogy melyik kódot használom most hozzá, hátha abban van a megoldás:

Kód beillesztése:
// DS1302_Serial_Easy (C)2010 Henning Karlsen
 
// web: http://www.henningkarlsen.com/electronics
 
//
 
// A quick demo of how to use my DS1302-library to
 
// quickly send time and date information over a serial link
 
//
 
// I assume you know how to connect the DS1302.
 
// DS1302:  CE pin    -> Arduino Digital 2
 
//          I/O pin  -> Arduino Digital 3
 
//          SCLK pin  -> Arduino Digital 4
 
 
 
#include <DS1302.h>
 
 
 
// Init the DS1302
 
DS1302 rtc(2, 3, 4);
 
 
 
void setup()
 
{
 
  // Set the clock to run-mode, and disable the write protection
 
  rtc.halt(false);
 
  rtc.writeProtect(false);
 
 
 
  // Setup Serial connection
 
  Serial.begin(9600);
 
 
 
  // The following lines can be commented out to use the values already stored in the DS1302
 
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
 
  rtc.setTime(12, 0, 0);    // Set the time to 12:00:00 (24hr format)
 
  rtc.setDate(6, 8, 2010);  // Set the date to August 6th, 2010
 
}
 
 
 
void loop()
 
{
 
  // Send Day-of-Week
 
  Serial.print(rtc.getDOWStr());
 
  Serial.print(" ");
 
 
 
  // Send date
 
  Serial.print(rtc.getDateStr());
 
  Serial.print(" -- ");
 
 
 
  // Send time
 
  Serial.println(rtc.getTimeStr());
 
 
 
  // Wait one second before repeating :)
 
  delay (1000);
 
}


Szia!
Én úgy látom, hogy az aktuális idő kiolvasás nálad string-be történik, ami azért baj, mert ha ezzel akarsz valamit kezdeni, akkor vizsgálnod kéne hogy mikor jön a :
Értsd: vizsgálati rutint kéne írni hogy aszongya: első két karakter kiolvas -> legyen eltárolva órának, megnéz hogy valóban a : elválasztó jel jön-e, 3.4. karakter kiolvas -> legyen perc, 5.6. karakter legyen másodperc. Ez így szerintem túl bonyolult.

Szerintem próbáld meg ezt a kiolvasó rutint beilleszteni, persze a szükséges változók deklarálásával:

void get_time() //Idő kiolvasási rutin
{
Wire.beginTransmission(rtc); // start communication over i2c with DS1307
Wire.write(0x00); // Write the value of the register to point to
Wire.endTransmission(); // End communication over i2c with DS1307

Wire.requestFrom(rtc,7); // This will request 7 bytes of data

//starting from the '0' the register
ss=bcd_to_dec(Wire.read());
mm=bcd_to_dec(Wire.read());
hh=bcd_to_dec(Wire.read());
d=bcd_to_dec(Wire.read());
DD=bcd_to_dec(Wire.read());
MM=bcd_to_dec(Wire.read());
YY=bcd_to_dec(Wire.read());
Wire.endTransmission();
}

remélem segített!
 
Szia!
Én úgy látom, hogy az aktuális idő kiolvasás nálad string-be történik, ami azért baj, mert ha ezzel akarsz valamit kezdeni, akkor vizsgálnod kéne hogy mikor jön a :
Értsd: vizsgálati rutint kéne írni hogy aszongya: első két karakter kiolvas -> legyen eltárolva órának, megnéz hogy valóban a : elválasztó jel jön-e, 3.4. karakter kiolvas -> legyen perc, 5.6. karakter legyen másodperc. Ez így szerintem túl bonyolult.

Szerintem próbáld meg ezt a kiolvasó rutint beilleszteni, persze a szükséges változók deklarálásával:

void get_time() //Idő kiolvasási rutin
{
Wire.beginTransmission(rtc); // start communication over i2c with DS1307
Wire.write(0x00); // Write the value of the register to point to
Wire.endTransmission(); // End communication over i2c with DS1307

Wire.requestFrom(rtc,7); // This will request 7 bytes of data

//starting from the '0' the register
ss=bcd_to_dec(Wire.read());
mm=bcd_to_dec(Wire.read());
hh=bcd_to_dec(Wire.read());
d=bcd_to_dec(Wire.read());
DD=bcd_to_dec(Wire.read());
MM=bcd_to_dec(Wire.read());
YY=bcd_to_dec(Wire.read());
Wire.endTransmission();
}

remélem segített!


Ja még szükséged lesz a bcd_to_dec rutin beillesztésére is. Ez annyit csinál hogy a binárisan kódolt decimális értéket (amiben az óramodul tárolja az időt) decimális érékké konvertálja, hogy halandó emberek is tudjanak vele dolgozni:

int bcd_to_dec(int bcd)
{ return bcd/16*10 + (bcd%16);}
 
Szia!
Én úgy látom, hogy az aktuális idő kiolvasás nálad string-be történik, ami azért baj, mert ha ezzel akarsz valamit kezdeni, akkor vizsgálnod kéne hogy mikor jön a :
Értsd: vizsgálati rutint kéne írni hogy aszongya: első két karakter kiolvas -> legyen eltárolva órának, megnéz hogy valóban a : elválasztó jel jön-e, 3.4. karakter kiolvas -> legyen perc, 5.6. karakter legyen másodperc. Ez így szerintem túl bonyolult.

Szerintem próbáld meg ezt a kiolvasó rutint beilleszteni, persze a szükséges változók deklarálásával:

...KÓD...

remélem segített!


Szia!
sajnos valami nem jó abban amit írtál, mert a kód ellenőrzésekor hibát talál:

_1302_henningkarlsen.ino: In function 'void get_time()':
_1302_henningkarlsen:98: error: 'Wire' was not declared in this scope
_1302_henningkarlsen:105: error: 'ss' was not declared in this scope
_1302_henningkarlsen:105: error: 'bcd_to_dec' was not declared in this scope
_1302_henningkarlsen:106: error: 'mm' was not declared in this scope
_1302_henningkarlsen:107: error: 'hh' was not declared in this scope
_1302_henningkarlsen:108: error: 'd' was not declared in this scope
_1302_henningkarlsen:109: error: 'DD' was not declared in this scope
_1302_henningkarlsen:110: error: 'MM' was not declared in this scope
_1302_henningkarlsen:111: error: 'YY' was not declared in this scope

Amúgy nem I2c-n kapcsolódik ez az óramodul, lehet, hogy ez a baj?
 
Szia!
sajnos valami nem jó abban amit írtál, mert a kód ellenőrzésekor hibát talál:

_1302_henningkarlsen.ino: In function 'void get_time()':
_1302_henningkarlsen:98: error: 'Wire' was not declared in this scope
_1302_henningkarlsen:105: error: 'ss' was not declared in this scope
_1302_henningkarlsen:105: error: 'bcd_to_dec' was not declared in this scope
_1302_henningkarlsen:106: error: 'mm' was not declared in this scope
_1302_henningkarlsen:107: error: 'hh' was not declared in this scope
_1302_henningkarlsen:108: error: 'd' was not declared in this scope
_1302_henningkarlsen:109: error: 'DD' was not declared in this scope
_1302_henningkarlsen:110: error: 'MM' was not declared in this scope
_1302_henningkarlsen:111: error: 'YY' was not declared in this scope

Amúgy nem I2c-n kapcsolódik ez az óramodul, lehet, hogy ez a baj?


Kell:

#include <Wire.h>
Deklarálni ss, mm, stb-t. (byte ss,mm,hh,d,DD,MM,YY; )

Kell:
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
függvény,
Setup-ba:
Wire.begin();

Viszont: hogy is kapcsolódik az óramodul?
 
Ajjaj :eek:
"It is not I2C, it's not OneWire, and it is not SPI. The most used name is "3-wire interface". "
Hát, akkor a saját libraryt kell használnod.
Viszont milyen formában kapod meg az időt?
Egy formázott sztringben?

Ez a kód:

Kód beillesztése:
void loop()
 
{
 
  // Send time
 
  Serial.println(rtc.getTimeStr());
 
  // Wait one second before repeating :)
 
  delay (1000);
 
}
És ez az eredmény serial monitoron:
16:40:13
16:40:14
16:40:15
16:40:16
 
Ez a kód:

Kód beillesztése:
void loop()
 
{
 
  // Send time
 
  Serial.println(rtc.getTimeStr());
 
  // Wait one second before repeating :)
 
  delay (1000);
 
}
És ez az eredmény serial monitoron:
16:40:13
16:40:14
16:40:15
16:40:16
Akkor a string--et egésszé kell alakítani. Ezzel:
Arduino - StringSubstring
Arduino - StringToInt

pl. valamistr = rtc.getTimeStr();


int ora = valamistr.substring(0,2).toInt();
és így tovább.
 
Kell:

#include <Wire.h>
Deklarálni ss, mm, stb-t. (byte ss,mm,hh,d,DD,MM,YY; )

Kell:
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
függvény,
Setup-ba:
Wire.begin();

Viszont: hogy is kapcsolódik az óramodul?

rodenj mindent megválaszolt már :)
 
Odáig jutottam, hogy minden 10. mp-ben kiírja serialon, hogy "mehet". A mp-el való kisérletezést azért választottam, hogy jobban tudjam tesztelni.
Ezt így sikerült:
Kód beillesztése:
void loop()
{
  String ido = rtc.getTimeStr();
  Serial.println(ido);
  int ora = ido.substring(7).toInt();
 
  if (ora == 0) {
 
    // Send time
    Serial.println("mehet");
    digitalWrite (13, HIGH);
  }
  else {
    digitalWrite (13, LOW);
 
    delay (1000);
 
  }
}

Jó úton járok?
Egyébként mit jelent a substring utáni zárójelben lévő szám?
 
Odáig jutottam, hogy minden 10. mp-ben kiírja serialon, hogy "mehet". A mp-el való kisérletezést azért választottam, hogy jobban tudjam tesztelni.
Ezt így sikerült:
Kód beillesztése:
void loop()
{
  String ido = rtc.getTimeStr();
  Serial.println(ido);
  int ora = ido.substring(7).toInt();
 
  if (ora == 0) {
 
    // Send time
    Serial.println("mehet");
    digitalWrite (13, HIGH);
  }
  else {
    digitalWrite (13, LOW);
 
    delay (1000);
 
  }
}

Jó úton járok?
Egyébként mit jelent a substring utáni zárójelben lévő szám?
Igen, jó úton jársz :)
A substring után lévő szám magyarázata az általam linkelt arduinós oldalon ott van:
string.substring(from, to)
Tehát, ha 16:55:00 a kapott sztringed, akkor az óra ebből from 0, to 2 - nullától kell kezdeni a számolást, és bár nem logikus, de a "to" az eggyel több legyen, mint ami neked kell.
Tehát a perc az int perc= ido.substring(3,5).toInt(); lesz. A int sec= (ido.substring(6,8).toInt());

Ha nem haragszol, javasolnék egy oldal meglátogatását, ott lehet ingyenes oktatásra is jelentkezni. (megj: semmi közöm a linkelt oldalhoz, én is tanultam ott dolgokat)
http://avr.tavir.hu/
 
Köszönöm, az óra már tökéletesen működik :)
Próbálom beállítani most az etetőgombot.
A kód elején az "unsigned long indul;" sort megadtam, majd pedig ez jön a loopon belül:
Kód beillesztése:
void loop()
{
  bouncer.update ( );
 
  //--------------Szűrő műveletek-----------------------------
  if ((bouncer.read() == HIGH) && (bouncer.duration() > 50) && digitalRead(szuro_rele) == LOW) //Ha a gomb békén van hagyva és a szűrő megy
  {
    digitalWrite(szuro_rele, LOW);  // A szűrő menjen tovább
  }
 
  if ((bouncer.read() == LOW) && (bouncer.duration() > 50) && digitalRead(szuro_rele) == LOW)  // Ha a gomb meg van nyomva működő szűrésnél
  {
    digitalWrite(szuro_rele, HIGH);  // Szűrő kikapcs
 
    indul = millis();
  }
 
  if (millis() > (indul+240000)) { // Szűrő kikapcs 4 percre
    digitalWrite(szuro_rele, LOW);
  }
  if (millis() > (indul+248000)) { // Kaja feltúrás 8mp-ig :D
    digitalWrite(szuro_rele, HIGH);
  }
  if (millis() > (indul+428000)) { // Újabb 3 perc kajaidő :)
    digitalWrite(szuro_rele, LOW);
  }
}

A probléma a következő. Anélkül, hogy hozzányúlnék a gombhoz, az Arduino indítása után lefut az etetőprogram magától (egyszer).
Miért? Mit lehet tenni?
Egyébként a gomb nyomására tökéletesen lefut az etetőprogram amit szerettem volna elérni vele, tehát leáll->megy egy picit->leáll újra majd szűr a következő etetésig.
 
Köszönöm, az óra már tökéletesen működik :)
Próbálom beállítani most az etetőgombot.

A probléma a következő. Anélkül, hogy hozzányúlnék a gombhoz, az Arduino indítása után lefut az etetőprogram magától (egyszer).
Miért? Mit lehet tenni?
Egyébként a gomb nyomására tökéletesen lefut az etetőprogram amit szerettem volna elérni vele, tehát leáll->megy egy picit->leáll újra majd szűr a következő etetésig.


Azt nem tudom, miért fut le induláskor, de indulás után 4 perccel mindig le fog futni, 4 perc 8 másodperc után beindul, és kb. ~7 perc után végleg leáll a szűrő.
Nem is kell gombokat nyomogatni ehhez.
 
Azt nem tudom, miért fut le induláskor, de indulás után 4 perccel mindig le fog futni, 4 perc 8 másodperc után beindul, és kb. ~7 perc után végleg leáll a szűrő.
Nem is kell gombokat nyomogatni ehhez.
else ágba az utolsó if-nél
digitalWrite(szuro_rele, HIGH);
 
Back
Oldal tetejére