Sketch per gestione crepuscolare e motori

Ciao a tutti,
Ho necessità di un motore che si attivi con un interruttore crepuscolare.
Il valore di intensità verrà impostato da un potenziometro.

Il risultato deve essere che dato il valore impostato di luminosità al mattino deve attivarsi e poi attivarsi nuovamente a sera.

Gestirò con un ponte H e dei fine corsa il verso del motore.

Ho preparato uno sketch al quale aggiungerò poi il controllo motori. Il controllo fine corsa e’ simulato da un ciclo FOR.

Cortesemente potete dare un’occhiata e vedere se puo’ andare?

A monitor sembra funzionare tutto correttamente ma magari stò facendo qualche errore clamoroso. E’ il primo sketch che “invento”, fino ad ora mi sono limitato a replicare i vari esempi.

Ecco il codice, grazie in anticipo

//Predisposizione Sensore Luminosità
int luminosita;                  //Valore della luminosita
int pinSensore = A0;             //Sensore Luminosita'

//Aggiunta di un potenziometro
int spegnimento;
int potenziometro = A1;

//Aggiunta variabile per Giorno e Notte 0 giorno 1 notte
int day=1;


void setup()
{
  Serial.begin(9600);             //Comunicazione con PC SOLO DEMO
  pinMode(pinSensore,INPUT);     //Dichiaro sensore in ingresso
  pinMode(potenziometro,INPUT);    //Dichiaro sensore regolazione  

}

void loop()
{
  luminosita = analogRead(pinSensore);       //Leggo luminosita
  Serial.print("La luminosita' nella stanza e':");  //Scrivo luminosita SOLO DEMO
  Serial.println(luminosita);                        //Scrivo luminosita SOLO DEMO
  spegnimento = analogRead(potenziometro);        //Leggo valore potenziometro per spegnimento
  Serial.print("Il valore impostato sul potenziomentro e':");   //Scrivo valore potenziomentro SOLO DEMO
  Serial.println(spegnimento);                               //Scrivo valore potenziomentro SOLO DEMO
  delay(2000);                                          //SOLO DEMO

  //BLOCCO AZIONAMENTO MOTORI

  if(luminosita > spegnimento && day==1)  //Standard Cancello è notte. Se luminosità maggiore e stato è notte aziono il cancello
  {
    Serial.println("E' giorno");            //SOLO DEMO
    for(int x=0; x<5 ; x++){                //SIMULO IL FINE CORSA, sostituirò con comandi per fine corsa 
      Serial.println("Apro il cancello");
    }
    day=0;                                   //Sposto lo stato da Notte a Giorno
  }

  else
    if (luminosita < spegnimento && day==0)     //Eseguo il comando inverso
    {

      Serial.println("E' notte");
      for(int x=0; x<5 ; x++){
        Serial.println("Chiudo il cancello");
        day=1;


      }


    }
}

Uhm... giorno e notte alternati in quel modo non sono molto sicuri. Basta un supernuvolone per farti saltare l'alternanza.

Si l'ho pensato, anche se in realtà basta settare il potenziometro a livelli molto bassi per mantere aperto il tutto con pochissima luce.
Alla fine si aprirebbe e chiuderebbe la porta :slight_smile:

Hai qualche consiglio per una gestione migliore?

Ciao,
potresti usare questa libreria:

per il calcolo dell'orario di alba e tramonto.
Qui una spiega:
http://playground.arduino.cc/Italiano/SunLight

flaterik:
Hai qualche consiglio per una gestione migliore?

Forse abbinare un RTC per sapere indicativamente se è giorno o notte. Se ad esempio vedi buio alle 8 non è come vederlo alle 20: nel primo caso sai che si può trattare del nuvolone, nel secondo sai che può essere calata la sera.

Oppure usare la funzione di alba e tramonto suggerita.

Il potenziometro vorrei usarlo anche per forzare chiusura e apertura , come fosse un interruttore diciamo.

A scanso di equivoci potrei combinare RTC e potenziometro.

In caso di potenziometro a fondo scala , 0 o 1023 forzo la chiusura, altrimenti combino con l'orario

Ciao a tutti, ho sistemato un po' lo sketch con i finecorsa reali.

Non ho montato il secondo ancora sul prototipo quindi il codice e' testato e sembra funzionare per il primo step.

Che ne pensate?
C'e' qualcosa che non vi convince o nn va bene?
Aggiungero' alla fine il controllo sull'orario, devo un attimo studiare la libreria.

A prescindere da quello vorrei avere un vostro parere a riguardo

EDIT
Ops, ho dimenticato di incollarlo.
Provvedo dopo

Eccolo

//Predisposizione Sensore Luminosità
int luminosita;                  //Valore della luminosita
int pinSensore = A0;             //Sensore Luminosita'

//Aggiunta di un potenziometro
int spegnimento;
int potenziometro = A1;

//Aggiunta variabile per Giorno e Notte 0 giorno 1 notte
int day=1;

//Aggiunta fine corsa1

int finecorsa1 = 2;    //dichiaro il pin del finecorsa
int finecorsa2 = 5;    //dichiaro il secondo pin finecorsa
int finecorsa1stato;    // dichiaro la variabile per il suo stato
int finecorsa2stato;    // dichiaro la variabile per il suo stato

//Controllo Motori
const int motor1Pin = 3;    // Pin 1 motore
const int motor2Pin = 4;    // Pin 2 motore
const int enablePin = 9;    // Attiva e disattiva motore

void setup()
{
  Serial.begin(9600);             //Comunicazione con PC SOLO DEMO
  pinMode(pinSensore,INPUT);     //Dichiaro sensore in ingresso
  pinMode(potenziometro,INPUT);    //Dichiaro sensore regolazione 
  pinMode(finecorsa1,INPUT);       //Dichiaro sensore finecorsa1
  pinMode(motor1Pin, OUTPUT);      //Dichiaro pin1 motore
  pinMode(motor2Pin, OUTPUT);      //Dichiaro pin2 motore
  pinMode(enablePin, OUTPUT);      //Dichiaro pin attivo e disattivo motore

  digitalWrite(enablePin, LOW); 

}

void loop()
{
  luminosita = analogRead(pinSensore);       //Leggo luminosita
  finecorsa1stato= digitalRead(finecorsa1);    //Leggo stato finecorsa
  Serial.print("Lo stato del finecorsa e':");
  Serial.println(finecorsa1stato);
  Serial.print("La luminosita' nella stanza e':");  //Scrivo luminosita SOLO DEMO
  Serial.println(luminosita);                        //Scrivo luminosita SOLO DEMO
  spegnimento = analogRead(potenziometro);        //Leggo valore potenziometro per spegnimento
  Serial.print("Il valore impostato sul potenziomentro e':");   //Scrivo valore potenziomentro SOLO DEMO
  Serial.println(spegnimento);                               //Scrivo valore potenziomentro SOLO DEMO
  delay(2000);                                          //SOLO DEMO


  //BLOCCO AZIONAMENTO MOTORI

  if(luminosita > spegnimento && day==1)  //Standard Cancello è notte. Se luminosità maggiore e stato è notte aziono il cancello
  {

    Serial.println("E' giorno");            //SOLO DEMO
    Serial.println("Apro il cancello");

    while(finecorsa1stato == 1){
      finecorsa1stato= digitalRead(finecorsa1);
      digitalWrite(enablePin, HIGH); 
      digitalWrite(motor1Pin, HIGH);
      digitalWrite(motor2Pin,LOW);
    }
    digitalWrite(enablePin, LOW);
    day=0;                                   //Sposto lo stato da Notte a Giorno
  }

  else
    if (luminosita < spegnimento && day==0)     //Eseguo il comando inverso
    {

      Serial.println("E' notte");
      Serial.println("Chiudo il cancello");
      while(finecorsa2stato == 1){
        finecorsa2stato= digitalRead(finecorsa2);
        digitalWrite(enablePin, HIGH); 
        digitalWrite(motor1Pin, LOW);
        digitalWrite(motor2Pin,HIGH);
      }
      digitalWrite(enablePin, LOW);
      day=1;


    }
}