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;
}
}
}
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
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.
//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;
}
}