PULSANTE ORARIO

Buona sera e buon anno a tutti vorrei chedervi un favore per risolvere un problema che ho nella mia caldaia, ho acquistato l'Arduino uno diciamo che ho le basi dell'elettronica per quanto riguarda collegare con fotoaccopiatori i rele' i pin non ci sono problemi , mentre il mio problema è il programma riesco a modificare programmi base ma a crearne uno da 0 no.

Vi spiego il mio progetto se fattibile:
Pulsante orario che acceso chiude un contatto e resta chioso fino a che non si spegne. Chude il pin nell'arduino 1 (se possibile tramite la pullup intena altrimenti metto la resistenza) Uscita classica pin13 che va in HIGT per 4 secondi e poi si spege aspettando l'apertura del contatto per andare in HIGT per 4 secondi di nuovo.
Poi (è in piu' ma tento di crearlo io) mi scrive sul monitor ogni volta che è andato in on e off
Buona serata.

Ciao, negli sketch di esempio di Arduino c'è la gestione del pulsante e delle uscite (button), oltre alla gestione della seriale (digitalreadserial); dagli un'occhiata e prova a buttare due righe di codice, è il modo migliore per imparare, poi ovviamente ti si aiuta in caso di errori o difficoltà, ma farsi scrivere il codice da 0 di solito non si usa.

Menny ha ragione,
Alcuni chiarimenti, per pulsante orario intendi un tuo termostato gia installato?
Poi quando dici di scrivere sulla seriale sarebbe utile sapere gli orari delle accensioni, quindi potresti usare la libreria swRTC di leo

Buon giorno e grazie per le risposte, come pulsante orario intendo un timer da quadro oppure un cronotermostato che al suo interno chiude un contatto pulito fino a quando finische il tempo impostato e riapre,capisco che per voi sia più facile programmare l'Arduino come termostato ma per mè che sono alle prime armi un progetto semplice è meglio poi il cronotermostato c'e' già solo che la mia caldaia a combustibile solido accetta solo che si prema il pulsante per 4 secondi per accendersi e che si prema il tasto per altri 4 s per spegnersi, e con il termostato non riesco a comandarla.
Vi allego ilo sketch che ho scritto prendendo parte di esempi ma sono fermo sullo stato del pulsante che nel mio caso deve chidersi e rimanere chiuso con un uschita HIGH di 4 s sul led 13 e quando scollegato ancora una uscita HIGH di 4 s sul pin 13

const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
Serial.begin(9600);
Serial.println("acceso");
delay(4000);
}
else {
digitalWrite(ledPin, LOW);
}
}

ciao, ho riletto 10 volte il post e dato che il programma che hai postato a parte qualche piccola correzione fa quello che chiedi, non capisco cosa vuoi dire con

sono fermo sullo stato del pulsante

quando premi (anche un piccolo impulso) il pin 13 va a 1 per 4 sec che sarà il tuo relè sui fili del crono.
quindi la accenderà se è spenta

quando lo ripremi avrai di nuovo 4 secondi il pin 13 a 1 per 4 sec
quindi la spegnerà se è accesa

Altrimenti c'e' un altra interpretazione correggimi se sbaglio

Tu hai un crono giornaliero-settimanale classico per caldaie che chiude un contatto e lo tiene chiuso per il tempo che la caldaia deve restare accesa, quando la caldaia deve spegnersi il crono apre il contatto e resta su quello stato spegnendo la caldaia fino a nuovo ordine.
Questo per una caldaia normale a gas.

La tua caldaia immagino a pellet, vuole:

  • un comando di chiusura di 4 secondi per ON della caldaia e poi si rilascia il bottone
  • un comando di chiusura di 4 secondi per OFF della caldaia e poi si rilascia il bottone

Tu vuoi continuare ad usare il crono ma modificare con un contatto impulsivo a ON di 4 secondi (sia per accenderla che per spegnerla)
Io ho sempre installato cronotermostati normali per caldaie a gas di marche note con chiuso permanente o aperto permanente, ma esistono anche quelli dove tu puoi inpostare il contatto in modo impulsivo e il tempo di chiusura di tale comando [Sono un po' carucci] queste però lavorano su 3-4 fili, perchè in questo caso c'è un dialogo digitale tra crono e caldaia.

Se vuoi usare arduino però sarebbe logico che la caldaia ti mandasse un ritorno di "ok sono accesa" e "ok sono spenta" altrimenti mandi l'impulso di 4 secondi e booo chissà avrà preso il comando .... sarà accesa? sarà spenta?.
Ora non viene specificato se la caldaia ha uno scambiatore con acqua e quindi dei radiatori o riscaldamento a getto d'aria, comunque in entrambi i casi potresti utilizzare un semplice sensore di temperatura posato sul tubo dell'acqua di mandata che non arriverà oltre 80° oppure sulla mandata dell'aria, stabilirai tu con varie prove quanto tempo impiega tra l'accensione e un Delta di temperatura utile per determinare se effettivamente c'e' stata un accensione. Il programma aspetterà 5-10 min (vedi tu) e se non è cambiato nulla arduino ritenta il comando. Questo sistema è un po' grezzo, però ti evita di aprire e manomettere l'elettronica della caldaia e sapere in un tempo acettabile .... sarà accesa? sarà spenta?. Il programma è più complesso ma più affidabile da utilizzarsi anche con un comando remoto via web.

E' questo che vuoi fare?

ciao

Questo funziona a patto che il tuo pulsante o contatto del cronoT abbia un antirimbalzo quindi un contatto sicuro privo di disturbi un condensatore in parallelo da 100.000 picofarad può andare bene (sigla su disco 104).

const int buttonPin = 2;     
const int ledPin =  13;
const int time = 4000; 
int stato = 0; //caldaia spenta
     
void setup() 
{
  Serial.begin(9600);
 pinMode(ledPin, OUTPUT);     
 pinMode(buttonPin, INPUT);     
}

void loop()
{
  if (digitalRead(buttonPin) == HIGH && stato == 0) 
  {
    stato=1;
    impulso();
    Serial.println("acceso");
  }
  
  if (digitalRead(buttonPin) == LOW && stato == 1) 
  {
    stato=0; 
    impulso();
    Serial.println("spento");
  }
}  

void impulso()
{
    digitalWrite(ledPin, HIGH);
    delay(time);
    digitalWrite(ledPin, LOW);
}

Grazie mille pablos71 è quello che cercavo lo stampo e provo a capire perchè non ci sono arrivato, per il cotatto il mio crono monta un rele' meccanico quindi dovrebbe essere al pari di un pulsante meccanico, ma il condensatore lo metto ugualmente provo a montare il tutto .

Sapete dirmi con una pila a 9 v quanto tempo lavora l'Arduino prima che si scarichi?

Provalo, ma questo sketch non analizza ingressi di ritorno per verifiche di reale stato ON/OFF, se hai bisogno scrivi
Per la durata batteria, non ho mai provato, dipende da quanta corrente assorbe, ma da quello che ho letto ogni tanto nel forum parlano di 4-5-6 ore

ciao

Ti chiedo un'ultima cosa se volessui urilizzare la resistenza interna di pollup devo inserire la riga: "digitalWrite (buttonPin, HIGH); dopo i pinMode ?

cesare75:
Ti chiedo un'ultima cosa se volessui urilizzare la resistenza interna di pollup devo inserire la riga: "digitalWrite (buttonPin, HIGH); dopo i pinMode ?

Sì.

Sta funzionando alla grande grazie ancora per l'aiuto l' unico problema se si vuol chiamare cosi' quando attivo il serial monitor e ad ogni reset o accensione dell'arduino mi attiva il pin 13.

Possiedo un palmare N50 con "Microsoft Windows Mobile for Pocket PC 2003 Second Ed." è possibile vedere il serial monitor sul palmare per controllare le accensioni ?

l' unico problema se si vuol chiamare cosi' quando attivo il serial monitor e ad ogni reset o accensione dell'arduino mi attiva il pin 13.

probabilmente hai il modello con le uscite invertite,

tutto quello che viene scritto nel void setup() è quello che viene eseguito all'accensione o al reset
quindi nega l'uscita del pin aggiungendo la linea
digitalWrite(ledPin, LOW);
dentro a void setup()

oppure digitalWrite(ledPin, HGH);

prova, non c l'ho presente in questo momento

per usare un palmare o usi uno shield Bluetooth, wifi, sempre che resti nelle vicinanze, altrimenti un etherne shield tramite rete lan, controllando da dentro o fuori casa
ciao

che intendi per modello con uscite invertite ?

x cesare75: ma questo difetto e' rpesente solo se hai la seriale attiva ? mentre se la disabiliti commentando il relativo setup non te lo fa ? Potresti aggiornare il bootloader con quello presente nell'ide 023 se ci sono rpoblemi di reset seriale.

per il discorso connessione, oltre ai metodi gia' citati, su andorid si ci puo' connettere semplicemente via cavo, sfruttando il jack audio. servono pochissimi componenti, c'e' anche una pcb gia' fatta

sul mio htc diamond ho fatto un dualboot Windowsmobile+Android, potresti vedere se c'e' possibilita' anche per il tuo modello.

per uscite invertite intendo che ... ricordo di aver letto che qualcuno aveva questo proplema, al reset tutte le porte erano in high, semplicemente perchè quel modello lavora con uscite NOT... se trovo il post magari :slight_smile:
ciao

ecco il vecchio treadh Problema "strano" con relais all'avvio di arduino - #11 by pablos71 - Generale - Arduino Forum
Pitusso risponde risolvendo il problema delle uscite a ON dopo il riavvio (5° post)

Comunque non conoscendo il tuo modello prova a cambiare pin magari 9-11 e vedi se lo fa lo stesso

ciao

:slight_smile: :slight_smile:

ora e' chiaro, sai perche' non ti seguivo ? credevo tu stessi dicendo che Arduino fosse a logica invertita

Buon Sera a tutti sono andato avanti col mio progetto ho realizzato il relè con un optoisolatore per chiudere il contatto, funziona bene ma il problema del reset rimane ho provato a vambiare porta a togliere la trasmissione seriale mettendo le stringhe che mi avete suggerito ma il problema rimane vi allego il codice:

const int buttonPin = 2;
const int ledPin = 14;
const int time = 2000;
int stato = 0; //caldaia spenta

void setup()
{
digitalWrite(ledPin, HIGH);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
}

void loop()
{
if (digitalRead(buttonPin) == HIGH && stato == 0)
{
stato=1;
impulso();
}

if (digitalRead(buttonPin) == LOW && stato == 1)
{
stato=0;
impulso();
}
}

void impulso()
{
digitalWrite(ledPin, HIGH);
delay(time);
digitalWrite(ledPin, LOW);
}

L'autoreset è un problema non di facile soluzione perché è la struttura stessa di Arduino che lo prevede all'apertura del canale seriale. Questo perché in questo modo si attiva il bootloader che viene messo in ascolto sulla seriale per verificare l'arrivo di uno sketch dall'IDE, e nel caso programmare la Flash con il nuovo codice.

Per disattivare l'autoreset potresti provare ad usare l'Optiboot 4.4 che è distribuito con l'IDE 1.0, con un condensatore elettrolitico da 10 uF infilato tra i pin RST e 5V (rispettando le polarità) oppure, modo drastico ma sicuro al 100%, tagliando il piccolo jumper di stagno presente sul PCB dell'Arduino con etichetta "RES-EN". Con l'ultimo modo devi però poi ricordarti di premere il pulsantino di reset tutte le volte che vorrai cambiare sketch, finché non risaldi un piccolo quantitativo di stagno per richiudere il ponticello.

Spetta che qui si sta facendo casino.
1: togliamo da mezzo il discorso logica invertita di pablo71, perche' non si sta usando nessuna scheda rele esterna.
2: togliamo il discorso reset perche non si ci lamenta di problemi sulla seriale.
3: il pin 14 si attiva perche nel setup e' scritto che deve attivarsi. Elimina la prima riga del setup