Go Down

Topic: richiesta modifica codice (Read 1 time) previous topic - next topic

niki77



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?

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

gingardu


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


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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

fracrema


tu stai cercando guai seri  ]:D   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 :) di fatti io vado soltanto ad agire sul contatto della centralina per il passo passo( apri-stop-chiudi)..niente di più :)

fracrema


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?

pablos

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

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

fracrema

Eccovi il codice che ho:

Code: [Select]
#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);
}

leo72


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.
Code: [Select]
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.

sciorty


I casi sono infiniti, non è che si può analizzare ogni singola possibilità. ;)
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  :smiley-roll-sweat:

leo72

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

fracrema


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?

leo72

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.

fracrema

quindi alla fine dovrei aggiungere un delay qui:

Code: [Select]

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


e farlo diventare così:

Code: [Select]

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


Ho capito bene?

leo72

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):
Code: [Select]

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

Così ha un senso

fracrema

Grazie Leo, purtroppo non sono capace di programmare quindi cerco di capire e provo a far qualcosa :)


Go Up