ho un videocitofono avidsen modello nordstrom con relative pulsantiere da uno (cod. 102297) e due tasti ( cod .112297 ) (una al cancello principale e l'altra al secondo cancello).
Come da immagini.
Il citofono utilizza un sistema a 4 file come da immagine allegata (non ho ben capito se questo sistema a 4 fili è proprietario oppure uno standard!?).
Le pulsantiere hanno l'uscita per comandare una elettroserratura a 12V o un automatismo per cancelli (come da allegato).
Sulla pulsantiera da un tasto il contatto per l'apertura dell'elettroserattura non funziona più, andando a testare con un multimetro ho notato che i due contatti sono in corto, quindi, sarà rotto qualcosa all'interno.
Volevo comunque non perdere la possibilità di aprire il cancelletto dal videocitofono. Ho notato che il comando di apertura viaggia sul cavo che porta l'audio. Su tale cavo vi è una tensione a 5V ma quando premo sul videocitofono l'apriporta la tensione va a 0V.
Volevo quindi usare questo per comandare un relè per aprire il cancelletto. Ad esempio intercettando tale passaggio a 0V con un arduino e di conseguenza azionando dallo stesso arduino il relè.
int numeroPressioni = 0;
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change:
const long interval = 5000;
void setup()
{
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(11, OUTPUT);
}
void loop()
{
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
//Serial.println(voltage);
if(voltage == 0){
Serial.println("Voltaggio ingresso: " + String(voltage));
Serial.println("Numero pressioni: " + String(numeroPressioni + 1));
if(numeroPressioni == 1){
Serial.println("Apro cancelletto!");
numeroPressioni = 0;
digitalWrite(11, 1);
delay(1000);
digitalWrite(11, 0);
delay(1000); // Wait for 1000 millisecond(s)
}else{
numeroPressioni++;
delay(2000);
}
}
// check to see if it's time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
if(numeroPressioni > 0){
numeroPressioni = 0;
Serial.println("Azzero numero pressioni!");
}
}
}
gfucka:
. . . Ho notato che il comando di apertura viaggia sul cavo che porta l'audio. Su tale cavo vi è una tensione a 5V ma quando premo sul videocitofono l'apriporta la tensione va a 0V.
Hai 4 fili: GIALLO, NERO, ROSSO e BIANCO. Fra quali di questi hai misurato una tensione da 5V che va a 0 quando premi il pulsante sul videocitofono?
Infatti è proprio per evitare questi falsi positivi che userei un arduino.
Ho notato che anche quando viene premuto il campanello la tensione sul cavo bianco scende a 0V, per tale motivo con un arduino potrei monitorare il numero di volte che scende a 0V nell'arco di (ad es.) 30 secondi e azionare il relè.
Quindi per aprire il cancelletto sarà necessario premere due volte consecutive il tasto di apertura.
Come faccio ad usare un opto per rilevare la tensione che va a 0V?
gfucka:
Quindi per aprire il cancelletto sarà necessario premere due volte consecutive il tasto di apertura.
Nel mio caso il falso positivo durava pochi msec, quindi ho messo un controllo sulla durata dell'impulso. Con qualche prova ho trovato il valore di soglia corretto (nel mio caso 150 msec).
gfucka:
Come faccio ad usare un opto per rilevare la tensione che va a 0V?
Tenendo sempre presente che io non sono un esperto nella parte hardware, puoi prendere spunto dal mio schema (con la correzione sui pin del 4N35 indicata da LELEBUM al post #47 - punto 2).
Oppure guardando in rete https://www.arduinotronics.com/ingressi-optoisolati-per-arduino/
fratt:
Nel mio caso il falso positivo durava pochi msec, quindi ho messo un controllo sulla durata dell'impulso. Con qualche prova ho trovato il valore di soglia corretto (nel mio caso 150 msec).
Con cosa lo hai fatto il controllo sulla durata? A livello di firmware?
Adesso non ho sotto mano il codice.
Cmq, in linea di principio, rilevi il cambio di stato del pin.
Ti segni il valore di millis() quando il pin cambia stato e te lo segni di nuovo quando torna allo stato precedente.
Per differenza trovi la durata dell'impulso.
Non capisco però perchè usare l'optoisolatore?
Uno schema del genere non potrebbe andare? Dove al posto del led ci metto il relè
L'alimentatore emula i 5V che arrivano dal videocitofono.
su qesto @pgiagno può essere sicuramente più preciso di me...
cmq io userei un optoisolatore anche se in teoria sei nel range di tensione supportato da arduino, proprio perché IN TEORIA sei nel range supportato... in pratica potrebbe anche esserci un caso che non hai misurato in cui arriva una tensione più alta... con l'opto tieni tutto separato e corri meno rischi.
Poi secondo me con l'opto stai più sereno anche lato citofono... corri meno rischi che arduino interferisca col corretto funzionamento del citofono.
fratt:
su qesto @pgiagno può essere sicuramente più preciso di me...
cmq io userei un optoisolatore anche se in teoria sei nel range di tensione supportato da arduino, proprio perché IN TEORIA sei nel range supportato... in pratica potrebbe anche esserci un caso che non hai misurato in cui arriva una tensione più alta... con l'opto tieni tutto separato e corri meno rischi.
Poi secondo me con l'opto stai più sereno anche lato citofono... corri meno rischi che arduino interferisca col corretto funzionamento del citofono.
Perdonami ma nel tuo circuito come fai a rilevare la tensione sul pin A0?? da quello che vedo non è collegata nessuna alimentazione tra l'uscita dell' optoisolatore quindi quando ricevi o non ricevi tensione dal citofono vedrai soltanto un circuito aperto o chiuso.
Ok ma comunque anche con digitalRead leggi sempre 0 in quel modo...l'opto non da tensione ma chiude o apre un contatto...
boh forse sono io che non sto capendo qualcosa...
Allora...
Il pin di ingresso è impostato come INPUT_PULLUP, quindi è normalmente a livello high.
Quandi l'opto chiude va a livello low.
Cmq questa è la soluzione che ho adottato io. Ormai è operativa da qualche settimana e per quello che serve a me funziona bene.
Però non credo sia l'unica soluzione valida. Se ne trovi una più adatta benvenga... Se poi la spieghi qua magari imparo anche qualcosa di nuovo.