Go Down

Topic: Timer con accensione rele' (Read 2 times) previous topic - next topic

Vinzo

Ciao a tutti
Stamattina ho cominciato a studiare il modulino RTC DS1307
Sono riuscito ad utilizzarlo, a settare l'orario e la data, tutto ok, d'altra parte e' veramente semplice.

Ora, ho anche una shiedl con 6 rele', ho fatto una cosina simpatica col telecomando, praticamente ho assegnato ai tasti del telecomando l'accensione di ogni rele', e gia' qui una prima domanduccia, con l'alimentazione usb ce la fa ad accenderne 4, con un alimentatore esterno ne eccita 5, il sesto accende giusto la lucina sulla shield ma non si sente il "tic" del rele', inoltre si blocca il sistema e devo togliere l'alimentazione per ripristinarlo. Forse la 5v di arduino non e' sufficiente? Devo alimentare a parte la shield? Comunque questo e' il dubbio minore.

Cio' che vorrei fare e' comandare automaticamente l'accensione dei vari rele' tramite l'RTC, programmandoli a vari orari.
Immagino sia semplicissimo, ma non ho trovato informazioni.

Escludendo la parte iniziale della codifica del telecomando, per ora ho questo script per la sola parte telecomando:

Code: [Select]
int RECV_PIN = 11;                            // Pin ricevitore Ir

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(9, OUTPUT);     // Led 1
  pinMode(10, OUTPUT);    // Led 2
  pinMode(13, OUTPUT);    // Led di stato
  pinMode(8, OUTPUT);     //rele1
  pinMode(7, OUTPUT);     //rele2
  pinMode(6, OUTPUT);     //rele3
  pinMode(5, OUTPUT);     //rele4
  pinMode(4, OUTPUT);     //rele5
  pinMode(3, OUTPUT);     //rele6
 
  irrecv.enableIRIn();    // Inizializza ricevitore Ir
  Serial.begin (9600);
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);       //Risultato in esadecimale
    irrecv.resume();
    }

  if(results.value == PONOFF){
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);     
  }
    if(results.value == P1){
    digitalWrite(8, HIGH);
  }
  if(results.value == P0){
    digitalWrite(8, LOW);
  }
      if(results.value == P2){
    digitalWrite(7, HIGH);
  }
  if(results.value == P0){
    digitalWrite(7, LOW);
  }
      if(results.value == P3){
    digitalWrite(6, HIGH);
  }
  if(results.value == P0){
    digitalWrite(6, LOW);
  }
      if(results.value == P4){
    digitalWrite(5, HIGH);
  }
  if(results.value == P0){
    digitalWrite(5, LOW);
  }
   if(results.value == P5){
    digitalWrite(4, HIGH);
  }
  if(results.value == P0){
    digitalWrite(4, LOW);
  }
   if(results.value == P6){
    digitalWrite(3, HIGH);
  }
  if(results.value == P0){
    digitalWrite(3, LOW);
  }

}




Mentre l'RTC l'ho solo testato con l'esempio assieme alla libreria:

Code: [Select]
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson

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

  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();

}

void loop()
{

  Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//read seconds
  Serial.print("      ");                 // some space for a more happy life
  Serial.print(RTC.get(DS1307_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year
  Serial.println();

  delay(1000);

}

smartgatto

Non ho capito una cosa: tu hai attaccato direttamente i relè ai pin di arduino?
oppure c'è di mezzo resistenza/transistor?

pablos

No ha collegato lo shield all'alimentazione della usb, lo shield relè ha già i suoi transistors.

Non ce la fa la usb del pc a fare tutto, rischi di danneggiare anche la porta del  pc
Per attivare un relè a un orario ti basta confrontare le variabili DS1307_HR, DS1307_MIN, DS1307_SEC con  3 variabili impostate da te con qualche if magari invece di mettere == usi >=

int time1_ore= 12;
int time1_min = 0;
int time1_sec = 0;

int time2_ore= 18;
int time2_min = 20;
int time2_sec = 0;

if(DS1307_HR >= time1_ore && DS1307_MIN >= time1_min && DS1307_SEC >= time1_sec)
...........
if(DS1307_HR >= time2_ore && DS1307_MIN >= time2_min && DS1307_SEC >= time2_sec)
...........
no comment

omaroski

Se si tratta di una USB 2.0 non può fornire più di 500mA e sì se vai oltre rischi di danneggiarla. Se hai un connettore ad Y puoi collegare 2 porte contemporaneamente ed avere 1A.

uwefed

Non prendere cavi a Y perché l' Arduino stesso ha un fusibile autoripristinante da 0,5A e non combini niente. Usa un alimentatore da 5V e 1A per alimentare Arduino e la scheda.
Ciao Uwe

Go Up