Aiutino per l'unione di due sketch differenti

Ciao a tutti
non sono un esperto di elettronica, mi diletto per puro divertimento personale.
Detto questo, bando alle ciance :slight_smile: , vorrei chiedere se qualcuno mi può dare una mano nell'unire due codici differenti.
Il mio progetto consiste nell'accendere e spegnere un relè che aprirà o chiuderà il circuito tra una batteria 12V (ricaricata con pannello solare) e un inverter.
Innanzitutto ho la necessità di tenere sotto controllo la tensione della batteria per non scaricarla completamente.
Il primo sketch infatti attacca e stacca il contatto misurando la tensione batteria (c'è un partitore di tensione con due resistenze, a 11.4V apre il circuito di collegamento - a 12V chiude), ecco il codice:

int RelPin = 13; 
int partitorePin = 1;  

int val = 0;                           

void setup() {
  pinMode(RelPin, OUTPUT);
}

void loop() {
val = analogRead(partitorePin);    
if (val< 745) {   //stacca a circa 11.4V
digitalWrite(RelPin, HIGH);   
}

if (val> 786) { //attacca a circa 12V
digitalWrite(RelPin, LOW);    
}
}

e fin qui funziona alla grande già da una settimana circa, con il codice portato su un attiny85...

Ora io vorrei anche attivare e spegnere manualmente, una sorta di "bypass" del controllo tensione mediante pulsante.
Questo perch√© di notte o mentre non sono in casa mi sento pi√Ļ sicuro spegnendo l'inverter e anche perch√© se non uso nessun carico AC √® inutile tenerlo acceso.
Attualmente ho un interruttore tra la batteria e il rel√® con cui spengo manualmente il tutto ma √® scomodo, vorrei un pulsantino pi√Ļ accessibile (diciamo dalla cucina con un filo) con cui spegnere comodamente in casa piuttosto che dover andare in soffitta ogni volta...
Quindi ho scritto (copiato dal web :grin:) il seguente codice:

#define RelPin 13                
#define Pulsante 8              
int val = 0;                  
int precedente_val = 0;          
int stato = 0;                

void setup() {                
  pinMode(RelPin, OUTPUT);       
  pinMode(Pulsante, INPUT);     
}

void loop() {
  val = digitalRead(Pulsante); 


  if ((val == HIGH) && (precedente_val == LOW)){
    stato = 1 - stato;
    delay(15);                
  } 

  precedente_val = val;            

    if (stato == 1) {
    digitalWrite(RelPin, HIGH);  
  } 
  else {
    digitalWrite(RelPin, LOW);    
  }
}

E anche questa parte funziona perfettamente.
Non riesco proprio a capire come poterli unire assieme, facendo sì che arduino in ogni caso attacchi/stacchi il collegamento in base alla tensione ma ogni qual volta voglio spenga il tutto con la pressione del pulsante...

PS tutto poi se funziona lo porterò sull'attiny85...

Grazie anticipatamente per ogni consiglio vogliate darmi...

Emanuele

Il secondo codice accende/spegne in base al valore della variabile stato.
Se anche nel primo codice lavori con la variabile stato allora √® pi√Ļ semplice metterli insieme.
Primo codice, modifica:

if (val< 745) {   //stacca a circa 11.4V
  stato=1;   
}
if (val> 786) { //attacca a circa 12V
  stato=0;
}

Ma intervallo verificato è minore di 745 o maggiore di 786, tra i due valori non fai nulla ? da 746 a 785 ?

nid69ita:
Ma intervallo verificato è minore di 745 o maggiore di 786, tra i due valori non fai nulla ? da 746 a 785 ?

Grazie, ora modifico e faccio subito un test.
No in quell'intervallo teoricamente non dovrebbe accadere nulla: se la batteria è scarica il circuito rimarrà aperto fino a che la tensione non sarà risalita nuovamente a un minimo di 12v. Questo accade la mattina, appena sorge il sole e il pannello fotovoltaico inizia a generare tensione.

Solo per maggiore efficienza, al posto di questo:

#define RelPin 13                
#define Pulsante 8

usa le const byte; come la #define non crea delle variabili costanti, il compilatore è furbo, però ne dichiari il tipo cosa che con #define non puoi fare:

const byte RelPin=13;
const byte Pulsante=8;

La variabile stato pu√≤ essere pi√Ļ piccola, come un byte invece di int, sprechi ben un byte :smiley:

byte stato = 0;    //   byte=0-255   (8 bit)      int=-32768+32767  (16 bit)

Stessa cosa per val e precedente_val. (Secondo sketch, nel primo la val DEVE essere int)

Ah, occhio che non puoi usare la variabile val per tutte due gli sketch quando li metti insieme.
Per il primo chiamala val1 di tipo int e per il secondo val2 di tipo byte :grin:

botlegz:
Ciao a tutti
non sono un esperto di elettronica, mi diletto per puro divertimento personale.
Detto questo, bando alle ciance :slight_smile: , vorrei chiedere se qualcuno mi può dare una mano nell'unire due codici differenti.
Il mio progetto consiste nell'accendere e spegnere un relè che aprirà o chiuderà il circuito tra una batteria 12V (ricaricata con pannello solare) e un inverter.
Innanzitutto ho la necessità di tenere sotto controllo la tensione della batteria per non scaricarla completamente.
Il primo sketch infatti attacca e stacca il contatto misurando la tensione batteria (c'è un partitore di tensione con due resistenze, a 11.4V apre il circuito di collegamento - a 12V chiude), ecco il codice:

int RelPin = 13; 

int partitorePin = 1;

int val = 0;

void setup() {
  pinMode(RelPin, OUTPUT);
}

void loop() {
val = analogRead(partitorePin);   
if (val< 745) {   //stacca a circa 11.4V
digitalWrite(RelPin, HIGH);   
}

if (val> 786) { //attacca a circa 12V
digitalWrite(RelPin, LOW);   
}
}




e fin qui funziona alla grande già da una settimana circa, con il codice portato su un attiny85...

Ora io vorrei anche attivare e spegnere manualmente, una sorta di "bypass" del controllo tensione mediante pulsante.
Questo perch√© di notte o mentre non sono in casa mi sento pi√Ļ sicuro spegnendo l'inverter e anche perch√© se non uso nessun carico AC √® inutile tenerlo acceso.
Attualmente ho un interruttore tra la batteria e il rel√® con cui spengo manualmente il tutto ma √® scomodo, vorrei un pulsantino pi√Ļ accessibile (diciamo dalla cucina con un filo) con cui spegnere comodamente in casa piuttosto che dover andare in soffitta ogni volta...
Quindi ho scritto (copiato dal web :grin:) il seguente codice:



#define RelPin 13               
#define Pulsante 8             
int val = 0;                 
int precedente_val = 0;         
int stato = 0;

void setup() {               
  pinMode(RelPin, OUTPUT);       
  pinMode(Pulsante, INPUT);     
}

void loop() {
  val = digitalRead(Pulsante);

if ((val == HIGH) && (precedente_val == LOW)){
    stato = 1 - stato;
    delay(15);               
  }

precedente_val = val;

if (stato == 1) {
    digitalWrite(RelPin, HIGH); 
  }
  else {
    digitalWrite(RelPin, LOW);   
  }
}




E anche questa parte funziona perfettamente.
Non riesco proprio a capire come poterli unire assieme, facendo sì che arduino in ogni caso attacchi/stacchi il collegamento in base alla tensione ma ogni qual volta voglio spenga il tutto con la pressione del pulsante...

PS tutto poi se funziona lo porterò sull'attiny85...

Grazie anticipatamente per ogni consiglio vogliate darmi...

Emanuele

mah mi sembra un po' troppo semplice ]:D,
es la lettura tensione dovrebbe essere almeno una decina di letture prese a qualche secondo di distanza poi divise per 10
e il "pulsante" farei cambiare una variabile con un 300 millisecondi di "ritardo debounce"