richiesta modifica codice

Ma forse il problema potrebbe essere anche un altro.. mettiamo che nel codice verifica se lo stato del pin è alto esegue delle operazioni, se è di nuovo alto (si ripreme il pulsante) fa altre operazioni.

if(stato==1){ 
 fai questo;
  if (stato==1){
   fai quest'altro;
  }
}

In questo caso se non mette il delay dopo la prima serie di operazioni, quando preme il bottone la prima volta(essendo che lo preme una persona :D) non potrebbe avere il tempo di rilasciarlo che il codice ha già passato il secondo controllo!

grazie per l'interesse ragazzi :slight_smile:

Vi spiego come funziona il mio progetto:

Arduino 1 rev3
display lcd 20x4 i2c preso su ebay con relativa libreria
scheda da 4 relay presa sempre su ebay
rtc della df robot ( df...??non ricordo bene )
2 contatti magnetici, i classici da antifurto
scheda ethernet originale

Il magnete e' collegato alla porta sezionale del garage in modo tale che l'arduino sappia sempre in che stato si trova la porta.
Collegati a 2 relay ci sono 2 led a 230v che sono al piano di sopra, in cucina.
Praticamente quando la porta e' chiusa ci sara' un led verde acceso, quando da chiusa si apre lampeggera' un led rosso e quando sara' aperta rimarra' acceso il led rosso con il verde spento.
ovviamente quando si stara' chiudendo lampeggera' il led verde.

un terzo relay e' utilizzato, inseme all'rtc, per fare in modo che si possa accendere la luce del garage quando si e' in un perido dell'anno e del giorno in cui ci sara' scuro. tipo da ottobre ad aprile quando si apre il garage dalle 17:00 alle 8:00 si dovra' accendere la luce.

il display serve cosi di bellezza per far vedere l'ora e lo stato della porta.

la scheda ethernet volevo usarla inizialmente per creare una pagina web con lo stato della porta e dei pulsanti per poter aprire/chiudere la porta ( relay 4 sul contatto della centralina ) e magari accendere la luce.

Come vedete il progetto non ha chissa quale utilita' ma ho deciso di fare questo lavoro in garage per la facilita' di spostamento con i cavi e la possibilita' di montare una cassetta di derivazione con dentro le varie schede.

Io sono un elettricista per lavoro quindi so dove mettere le mani per collegare i relay con tensioni pericolose.

Inizialmente mi ero stampato una scheda con il press and peel con il circuito di alimentazione, l'rtc, i relay e i morsetti per collegare il bus i2c e i contatti magnetici. Purtroppo pare che per inesperienza la scheda non sia molto stabile e non offre una precisione sul segnale. Per questo ho deciso di comprare tutto a parte con i relay, rtc e l'alimentatore 5v 1A

Questa sera postero' il codice, ora sono in pausa pranzo con il tablet e faccio un po' fatica a recuperarlo da gdrive.

Scusate per le lettere accentate ma non so come mai ma non me le da :slight_smile:

Buon pomeriggio, grazie!

tu stai cercando guai seri ]:smiley: non puoi motorizzare automaticamente una porta/cancello se non ci sono tutte le cose omologate e certificate tipo fotocellule, laMPEGGIANTI GIALLI,

non è che non si puo e che non è legale ,

se l'impianto no ha "tutto" e anche di un certificato di istallazione rilasciato da un tecnico

Che siete maliziosi :stuck_out_tongue: Si capisce che il progetto è per casa sua, ha pure detto che non ha una grande utilità!

sciorty:
Che siete maliziosi :stuck_out_tongue: Si capisce che il progetto è per casa sua, ha pure detto che non ha una grande utilità!

Tra l'altro non legge e perde i pezzi

eppoi chi lodice che non può progettare ed installare un impianto di apertura - chiusura con un microcontrollore??

fracrema:
un terzo relay e' utilizzato, inseme all'rtc, per fare in modo che si possa accendere la luce del garage quando si e' in un perido dell'anno e del giorno in cui ci sara' scuro. tipo da ottobre ad aprile quando si apre il garage dalle 17:00 alle 8:00 si dovra' accendere la luce.

Perchè un sensore di luce faceva tanto schifo??

Praticamente col tuo sistema se per caso un giorno di agosto alle 13.30 c'è un eclisse totale o un temporale pazzesco che non si vede una mazza la luce non si accende?

boh... anche io volevo automatizzare l'apertura (gia motorizzata) del box auto,

ma caso vuole sono incappato in un sito che "spiegava tutto"

ora uno potrebbe fare quello che vuole a casa sua fino a che non succedono i guai

ci sono poche cose pericolose

cancelli automatici gas 220volt ed è meglio informarsi bene prima di far "modifiche innocenti "

su questo tipo di cose

GINGARDU:
tu stai cercando guai seri ]:smiley: non puoi motorizzare automaticamente una porta/cancello se non ci sono tutte le cose omologate e certificate tipo fotocellule, laMPEGGIANTI GIALLI,

non è che non si puo e che non è legale ,

se l'impianto no ha "tutto" e anche di un certificato di istallazione rilasciato da un tecnico

Ciao, hai perfettamente ragione..è il mio lavoro :slight_smile: di fatti io vado soltanto ad agire sul contatto della centralina per il passo passo( apri-stop-chiudi)..niente di più :slight_smile:

pablos:
metti questo condensatore in parallelo al contatto, non so come è fatto il tuo programma e che devono fare questi contatti, ma buona parte dei rimbalzi li tagli fuori, provare per credere. Fammi sapere

ciao

ps come fate a mettere "qui" con un link collegato?

Ciao, ho messo un condensatore da 100nF, va bene lo stesso no?

sei tu che lo devi dire XD se va bene lo stesso

niki77:

fracrema:
un terzo relay e' utilizzato, inseme all'rtc, per fare in modo che si possa accendere la luce del garage quando si e' in un perido dell'anno e del giorno in cui ci sara' scuro. tipo da ottobre ad aprile quando si apre il garage dalle 17:00 alle 8:00 si dovra' accendere la luce.

Perchè un sensore di luce faceva tanto schifo??

Praticamente col tuo sistema se per caso un giorno di agosto alle 13.30 c'è un eclisse totale o un temporale pazzesco che non si vede una mazza la luce non si accende?

eh lo so..hai ragione. Solo che un sensore crepuscolare potrei metterlo soltanto fuori dal garage in un punto troppo vicino alla luce esterna che già si accende con un sensore di movimento/crepuscolare la quale mi andrebbe a interferire sulla lettura.
Per portarlo sul palo dell'antenna dovrei fare troppa strada con i fili e non mi conviene sinceramente

Eccovi il codice che ho:

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
#include <ByVacLCD.h>
int addr; ByVacLCD 

lcd = ByVacLCD(0x21,4,20);
int rtc[7];

int countdown = 180;
int count_t = 0;

int luxPin = 7;
int lux_active = 0;

int ledPin5_2 = 5;
int ledPin6_3 = 6;
int sensore_magnetico_1 =2;
int sensore_magnetico_2 =3;

int val1 = 0;
int val2 = 0;
int val1_1 = 1;
int val2_2 = 0;

int val_chiusa = 0;
int val_in_apertura = 0;
int val_aperta = 0;
int val_in_chiusura = 0;

void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.clear(); 
 
  pinMode(ledPin5_2, OUTPUT);
  pinMode(ledPin6_3, OUTPUT);
  pinMode(luxPin, OUTPUT);
  pinMode(sensore_magnetico_1, INPUT);
  pinMode(sensore_magnetico_2, INPUT); 
  
}

void loop()
{

  
val1 = digitalRead(sensore_magnetico_1);
  
  if(val1 == LOW){                     
    val1_1 = 1;
    val2_2 = 0;
    digitalWrite(ledPin5_2, HIGH);
    Serial.println(val_chiusa);
      if( val_chiusa==0 ){
      lcd.setCursor(3,0);
      lcd.print("chiusa              ");
      val_chiusa=1;
      }
 
  }   
  
  if(val1 == HIGH){                     
    digitalWrite(ledPin5_2, LOW);

      lcd.setCursor(3,0);
      lcd.print("aperta");      
      val_chiusa=0;
    
    if( val1_1 == HIGH ){
   
      while(val1_1 == HIGH){
 
        lcd.setCursor(3,0);
        lcd.print("in apertura         ");
        lux();
         val_chiusa=0;
        digitalWrite(ledPin6_3, HIGH);
        delay(500);
        digitalWrite(ledPin6_3, LOW);
        delay(500);
        val1 = digitalRead(sensore_magnetico_1);
        val2 = digitalRead(sensore_magnetico_2);
 
        if((val1 == LOW || val2 == LOW)) { val1_1 = LOW; }
        ora();
      }       
    }
  }  
  
  val2 = digitalRead(sensore_magnetico_2);
  
  if(val2 == LOW) { 
    val2_2 = 1;      
    
    digitalWrite(ledPin6_3, HIGH);
      lcd.setCursor(3,0);
      lcd.print("aperta              ");
      val_chiusa=0;
  } 
    
  if(val2 == HIGH) { 
    digitalWrite(ledPin6_3, LOW);
    if(val2_2 == HIGH){

      
      while(val2_2 == HIGH){ 
    
        //lcd.clear();
        lcd.setCursor(3,0);
        lcd.print("in chiusura         ");    
        val_chiusa=0;
        digitalWrite(ledPin5_2, HIGH);
        delay(500);
        digitalWrite(ledPin5_2, LOW);
        delay(500);
        val1 = digitalRead(sensore_magnetico_1);
        val2 = digitalRead(sensore_magnetico_2);      
        
        if((val1 == LOW || val2 == LOW)) { val2_2 = LOW; }
        ora();
      }  
    }
  }  
  
  
  
  ora();
  if(lux_active == 1){
      lux_close();
  }
  

}

void lux()
{
  
  RTC.get(rtc,true);
  
  if( lux_active == 0 ){
    if(rtc[5]>=3 && rtc[5]<=9){
      if(rtc[2]>=20  || rtc[2]<=8){ 
        lux_active = 1;
        digitalWrite(luxPin, HIGH);

      } 
    }
  }

}


void lux_close(){

  /*if(val_chiusa==0){
    digitalWrite(luxPin, LOW);
    lux_active = 0;
  }*/
  
  if( count_t >= countdown){
    digitalWrite(luxPin, LOW);
    count_t = 0;
    lux_active = 0;
  }else{
    delay(1000); 
    count_t = count_t + 1;
    }
}
  
void ora()
{
   // rtc -> lcd
    lcd.setCursor(0,0);  
    RTC.get(rtc,true);
    if(rtc[2]<10){ lcd.print("0"); }
    lcd.print(rtc[2]);
    lcd.print(":");
    if(rtc[1]<10){ lcd.print("0"); }    
    lcd.print(rtc[1]);//min
    lcd.print(":"); 
    if(rtc[0]<10){ lcd.print("0"); }    
    lcd.print(rtc[0]);//sec    
    lcd.print(" ");
    lcd.print(rtc[4]);//giorno
    lcd.print("/");
    lcd.print(rtc[5]);//mese
    lcd.print("/");
    lcd.print(rtc[6]);//anno
    delay(1); 
 }

sciorty:
Ma forse il problema potrebbe essere anche un altro.. mettiamo che nel codice verifica se lo stato del pin è alto esegue delle operazioni, se è di nuovo alto (si ripreme il pulsante) fa altre operazioni.

if(stato==1){ 

fai questo;
 if (stato==1){
  fai quest'altro;
 }
}



I casi sono infiniti, non è che si può analizzare ogni singola possibilità. ;)
In base alle esigenze l'utente struttura il suo codice.

leo72:
I casi sono infiniti, non è che si può analizzare ogni singola possibilità. :wink:
In base alle esigenze l'utente struttura il suo codice.

Giusto, è che pensavo che per rimbalzo si intendesse il fatto che il rilascio effettivo del bottone ha un certo tempo :cold_sweat:

No, il "rimbalzo" di cui si parla è puramente elettrico ed è dato dai falsi contatti scaturiti dalle scintille del contatto meccanico.

leo72:
No, il "rimbalzo" di cui si parla è puramente elettrico ed è dato dai falsi contatti scaturiti dalle scintille del contatto meccanico.

A dir la verità io avevo capito che dovevo aggiungere quel pezzo di codice perchè i contatti sono a circa 6-8 metri dall'arduino e quindi si potrebbero generare delle interferenze..dico una stupidata?

Il "rimbalzo", o "bounce" in inglese, è un fatto puramente elettromeccanico.
Senza HW per filtrare le scintille date dal contatto "nudo e crudo" del pulsante, puoi avere letture errate.
Basta che tu colleghi un pulsantino ad un pin e fai un semplice codice per cambiare lo stato del led integrato nell'Arduino per vedere come con una semplice pressione alle volte il led cambi più di 1 volta.
Si ovvia via software con diversi trucchi, il più semplice è il delay tra 2 letture consecutive.

La lunghezza dei cavi casomai influisce sul segnale letto: con cavi molto lunghi, 5Vcc potrebbero arrivarti attenuati, con una tensione inferiore alla soglia che il pin fissa come minima per la lettura dello stato HIGH, ad esempio.

quindi alla fine dovrei aggiungere un delay qui:

if(val1 == LOW){                     
    val1_1 = 1;
    val2_2 = 0;
    digitalWrite(ledPin5_2, HIGH);

e farlo diventare così:

if(val1 == LOW){                     
    delay (50);
    val1_1 = 1;
    val2_2 = 0;
    digitalWrite(ledPin5_2, HIGH);

Ho capito bene?

Dipende da cosa devi fare. Sinceramente non capisco quel delay messo così, a meno che tu non voglia ritardare la riposta del pulsante.

L'uso del delay nel debounce è giusto per intercalare 2 letture di un pin.
All'inizio si parlava di antirimbalzo per cercare di evitare false letture sui pulsanti. La soluzione te l'ho già data. Ripeto (con il codice che hai messo ora):

if (digitalRead(pin) == LOW)) {                     
    delay(50);
    if (digitalRead(pin) == LOW)) {
        val1_1 = 1;
        val2_2 = 0;
        digitalWrite(ledPin5_2, HIGH);
    }
}

Così ha un senso