Arduino ja pitkä viive

Olis tarvetta useamman tunnin (2-4) viiveelle.
Tällä olisi tarkotus ohjata relettä.
Joten miten tämä olisi helpoin toteuttaa?
delay funktio ei tunnu oikein toimivan näissä pitkissä viiveissä… :cry:

Arduinossahan on “millis()” - funktio, joka palauttaa ohjelman alusta kuluneiden millisekuntien määrän. Ja tämä “vuotaan yli” vasta viikkojen päästä ohjelman alusta. Numerot ovat epäkäytännöllisen suuria, mutta jakolaskuillahan niistä selviää…

Teoriassa on myös mahdollista pistää sopivan lyhyt (1-60 s) delay looppiin ja näin tuottaa tarvittavan pitkä viive. Kummankaan metodin tarkkuudesta en osaa sanoa. Kokeilisin mieluummin ensimmäistä.

arduino.cc/en/Reference/Millis

Ääh…

Ei tuo millis tunnu sen paremmin toimivan…

Siis pitäs saaha sellanen looppi kuin
rele päälle 4h->rele pois 2h->loopin alkuun

Eli ao. koodi pitäisi saahatoimimaan käytännössä.

void setup() {                
  pinMode(2, OUTPUT);     
}

void loop() {
  digitalWrite(2, HIGH);
  delay(144400000); //4h viive
  digitalWrite(2, LOW);
  delay(7200000); //2h viive
}

Mitekäs tuo “time”-kirjasto toimisi. Siitä saisi napattua ajan ja päiväyksen helposti - maailman tappiin saakka !

arduino.cc/playground/Code/Time

Tätä on toki vähän hankala kommentoida, kun sovelluksen käyttökohteesta ei ole mitään tuntumaa…

Tän ois tarkotus pätkiä Nokialaisen latausta → saadaan (ainakin teoriassa) laturista tehtyä ns. ylläpitolaturi.
Aika releellähän tuo ois helppo tehä mutku ovat kalliita ja autokäyttöön ei ole oikeen saatavilla kellokytkimiäkään… :stuck_out_tongue:

Arghduinon kontrollerista ei tietenkään löydy reaaliaikakelloa (RTC)? Sillähän tuon luulisi olevan varsin yksinkertainen juttu. Onko mahdollista lisätä RTC-piiri laudalle? Kuumaliimaa ja hyppylankoja jos ei muuten… :slight_smile:

Muita jippoja: Timeri tekemään keskeytyksiä mahdollisimman tarkkaan sekunnin välein, ja sitten timerikeskeytykseen laskuri pitämään kirjaa kuluneista sekunneista ja arvot sen perusteella, pitääkö relettä naksutella.

Autokäyttö mainittu, eli jos tunnin pitää tosiaan olla tunti, pitää huomioida, että kiteen toiminta riippuu lämpötilasta, kosteudesta ja tärinästä. Onko siis tiedossa, onko Arduinon kello peräisin peruskiteestä vai kompendoidusta kideoskillaattorista?

Ois mulla yks ylimääränen BQ3287EAMT -RTC lutikka, mutta en osaa käyttää sitä tän arduinon kaa. :blush:

Edit: Ainakin tää atmeg328 lutikka sisältää ton kans mut en ymmärrä miten se otetaan arduinolla käyttöön…
atmel.com/dyn/resources/prod … oc8271.pdf ja sivu 158

AVR:issä RTC tarkoittaa käytännössä vain sitä, että (useimmiten Timer/Counter2:sta, ainakin ATmega8/48/88/164/324/644) yhtä timeria voidaan käyttää asynkronisesti ulkoisella esim 32,768 kHz:n kellokiteellä riippumatta itse kontrollerin kellosignaalista, joka voi olla sisäinen RC-osku tai ulkoinen kide tai resonaattori tms.

Elikkä siis tuolla kellokiteellä (32,768 kHz) saadaan timerille asetettua sellainen prescaler, että se tuottaa tasan sekunnin välein keskeytyksen, riippumatta itse prossua käyttävästä taajuudesta, jolla se ei aina välttämättä onnistu suoraan. Olen tuota käyttänyt muutamissa omissa projekteissa, kun itse kontrolleri pyörii sisäisellä epätarkalla RC:llä, mutta haluan vähän tarkemman kellon niin käytän TC2:sta asynkronisesti watch crystallilla, ja sitten itse RTC softalla. Tietysti tarkkuus riippuu aina siitä kiteestä, ja sen taajuus vaihtelee sitten jonkin verran lämpötilan, kosteuden, piirilevyn leiskan, kuun asennon, valuuttakurssien yms mukaan…

Jos se sovellus on vain ja ainoastaan tuo, että se kytkee relettä päälle ja pois tasaisin väliajoin, niin tekisin ainakin itse timerilla ja sekunteja (ja/tai myös minuutteja/tunteja erikseen) laskevalla muuttujalla/muuttujilla. Nuo delay loopit ja funktiot kun riippuvat todella paljon kääntäjästä ja kääntäjän optimointitasosta ja eivät ole koskaan kovin tarkkoja ja muutenkin ikäviä, jos sen laitteen olisi tarkoitus tehdä yhtään mitään muuta tuon lisäksi.

PS. jos relettä ohjaat, niin kai ohjaat sitä esim. ulkoisella BJT tai FET transistorilla? Ja älä unohda free wheeling diodia releeltä, tai muuten poltat koko laitteesi!

Ja koska autokäyttö mainittu, niin huomioi että auton 12V on abaut kaikkea muuta kuin 12V. Vissiin jonkun standardin tms. mukaan autokäytön laitteiden pitäisi kestää jopa useiden satojen volttien jännitepiikkejä (hämärä muistikuva…), olikohan vieläpä molempiin suuntiin (eli myös negatiivinen käyttiksen polariteetti). Eli se jännitteensyöttö ja regulointi ja suojaukset sen mukaan, jos haluaa sen vermeen kestävän…

Homma pelittää jo DS1307+ kelolla kuin junanvessa.
Pitää tuossa laitella juttua tästä nettiin kuhan saan ton valmiiksi… :slight_smile:

Itse nyt painiskellut tämän saman kyseisen ongelman kanssa. Arduinoa hyödyntäen olisi tarkoitus saada ohjattua 5v relettä. Releen pitäisi olla vetäneenä tietty aika ja ajan saisi valita DIP-kytkimillä.(1-63minuuttia). Ongelma nyt tosin on että delay komento ei tunnu toimivan noin pitkillä ajoilla riittävän hyvin ja samoin tuo Millis() komentokin tuntuu epävarmalta. Koko hässäkkä ottaa sähkönsä 12v akusta.

Tuon ajan nyt ei tarvitse ihan täysin sekunnilleen olla oikein, mutta edes vähän sinnepäin(+/-10%) kun saisi niin hyvä tulisi.

Laite tulee sijaitsemaan ulkona, joten käyttölämpötilakin menee reilusti pakkasen puolelle talvella.

Onko ideoita miten tätä kannattaisi lähteä toteuttamaan?

Ongelma vissiin ratkaistu. Tein NE555 piirillä oskilaattorin, joka tuottaa noin 100 pulssia sekunnissa ja arduinolla sitten koodiin sijoitettu laskuri joka laskee noita pulsseja ja vertailee annettujen arvojen mukaan. Ainakin yhtäkkiä tuo tuntui pysyvän hyvin ajassa noin reilun tunnin testiohjauksella. En sitten tiedä miten tuo tulee toimimaan pakkasilla.