-
masterlegnano.
User deleted
Naturalmente scherzo...................
Però che sia un mostriciattolo in crescita è quasi vero
Un minimo di descrizione:
In casa ho un impianto complesso (nel senso matematico del termine, gira di 90 gradi sull'asse immaginario e sparisce nella 4 dimensione)
due idropellet, una caldaia a metano di soccorso
un impianto solare termico per ACS, con seconda serpentina come termoboiler
due condizionatori con pompa di calore
Solare fotovoltaico e accumulo per il fotovoltaico
Naturalmente tutto questo AmbaAradam è dotato di tutti i suoi automatismi (termostati e similia)
ma l'integrazione dei sistemi è carente, molto carente
In pratica è più facile mandare un uomo sulla Luna che capire se avrò acqua calda per la doccia stasera :-)
e quindi mi sto ingegnando per "domotizzare" il tutto
Perché sto scrivendo tutto questo?
per ringraziarvi, tutti, collettivamente
singolarmente siete tanti, troppi
quello che sto facendo lo sto facendo grazie a quello che fate giorno per giorno rispondendo e scambiando le vostre conoscenze su questo forum
e grazie a voi adesso posso imbastire il mio Mostro
Quindi un Magnifico
GRAZIE VOI TUTTI
per la vostra pazienza e per il vostro spirito di condivisione
E dopo i doverosi ringraziamenti....
un minimo di roadmap (come a dire obbiettivi)
vorrei realizzare un sistema:
basato su Arduino
a logica distribuita (= una scheda Arduino per ogni apparecchio)
che accenda, spenga e supervisioni le due macchine a pellet
che accenda, se serve, la macchina a metano come soccorritore
che accenda e spenga, nella mezza stagione, le due pompe di calore
che accenda e spenga, in estate, i condizionatori
con interfaccia web
con due termosonde esterne (a sud e a nord) per una regolazione PRO-attiva delle potenze erogate
con una scorta di cialde tale da potermi fare il caffè fino a Natale (no, qui scherzo)
comandabile da una APP android (no, questo mi rifiuto)
e sopratutto che mi dica se avrò acqua calda per la doccia :-). -
.
Complimenti, seguirò il tread. Anche io volevo creare un automatismo con arduino per evitare di dover aprire e chiudere le valvole quando passo dal pannello solare ACS all'accumulo ACS dell stufa a pellet e lo scalda acqua a metano.
Anzi, come la vedete se apro una sezione del forum proprio ad Arduino per rendere automatici i sistemi di riscaldamento con multigeneratori ?. -
masterlegnano.
User deleted
Non sarebbe male, anche perché con un sapiente uso della ricerca, le informazioni si trovano, come le ho trovate io
ma quanta fatica....
ci tengo però a sottolineare che la mia per ora è solo una road map
sto provando le varie tecniche necessarie, per ora la parte PC -> Arduino -> Stufa sembra che vada. -
.
Perchè due termostufe? . -
masterlegnano.
User deleted
Perché due idro pellet?
sono storie lunghe, legate all'evoluzione della casa e della famiglia
diciamo che in origine erano in due parti e adesso no
se mi permetti una battuta
queste non sono le stufe che state cercando
QUESTI NON SONO I DROIDI CHE STIAMO CERCANDO
possiamo andare
POTETE ANDARE
Invece un quesito, per qualcuno più esperto di me:
allora:
il PC dialoga con la stufa, con un adattatore che ho costruito trovando qui in giro le info
Arduino anche dialoga con la stufa
l'accensione e la lettura vanno abbastanza bene
lo spegnimento NO
ovvero se metto la stufa in spegnimento via seriale rimane in pulizia finale per sempre
qualcuno di voi ha la soluzione?
Appena posso provo a passare da pulizia finale a stop in maniera esplicita, ma mi scoccerebbe doverlo fare da codice
OPS, scusate
la macchina in oggetto è una nordika elisir idro
una cosa per volta, adesso automatizzo questa. -
.
Bella domanda...
(per me troppo difficile...)
...c'è chi ne sa più di me.... -
masterlegnano.
User deleted
Ieri sera non ci sono riuscito, a provare
comunque per la proposta di wroclaw per una sezione Arduinica ++
stasera descrivo con maggior precisione quello che ho fatto finora, e quello che spero di fare in futuro, così magari chi è più esperto di me mi fa da "bussola". -
masterlegnano.
User deleted
OK, è il momento di restituire qualcosa a questo magnifico forum
cosa sono riuscito a scoprire ed a fare finora:
Primo:
la scheda ha una porta seriale non molto standard, 4 fili, solo 3 usati
ma uno è il +20V, non ci serve
la scheda comunica in Half duplex con livelli TTL
serve un adattatore per passare in Full Duplex e livelli adatti
io ho spezzato la cosa in due:
un adattatore per portare la comunicazione in Full Duplex e livelli TTL
per Arduino ci si ferma qui, i livelli TTL vanno bene
L'adattatore è questo
Niente, non mi riesce di allegare un immagine, come posso fare?
Il suo schema fidocad è il seguente:CODICE[FIDOCAD]
MC 60 30 0 0 200
MC 80 60 1 0 280
MC 80 45 0 0 115
FCJ
TY 90 55 4 3 0 0 0 * 10K
TY 90 50 4 3 0 0 0 *
MC 95 30 0 0 000
FCJ
TY 105 40 4 3 0 0 0 * Tx
TY 105 35 4 3 0 0 0 * Tx
MC 95 75 0 0 000
FCJ
TY 105 85 4 3 0 0 0 * Rx
TY 105 80 4 3 0 0 0 * Rx
LI 35 30 60 30 0
LI 75 30 95 30 0
LI 80 60 80 55 0
LI 80 45 80 30 0
LI 50 75 50 30 0
LI 90 75 95 75 0
LI 70 75 50 75 0
SA 80 30 0
SA 50 30 0
LI 35 30 33 30 0
EV 33 32 29 28 0
TY 30 35 5 3 0 0 0 * RTx
Qualsiasi transistor NPN per piccoli segnali va bene (io BC337)
Se volgiamo collegarci ad un PC serve un adattatore da TTL a Seriale, se il PC ha una seriale, altrimenti un adattatore verso USB
si trovano facile sulla baia, basati sul CHIP 2102, e basta per non fare pubblicità
Come si collegano:
dalla stufa, porta seriale, cercate i due fili che hanno tra loro una tensione di circa 5 Volt, è facile, uno non è collegato, una ha 20Volt, rimangono solo 2
Quello al più è il TRx, quello al meno è Gnd
Occhio a non fare corto con i puntali del tester misurando le tensioni
il mio consiglio è provare a collegarvi prima al PC, con il CP2102
RX su Rx dell'adattatore, Tx sul Tx, GND sul Gnd
usate un programma per la comunicazione seriale, io ho Linux, non Windows, quindi uso Moserial
i parametri sono 1200 Bps, 8 bit Nessuna parità e 2 bit di stop
Occhio a togliere l'handshacking: moserial di default fa handshacking Hardware, quindi non trasmette
Mettere No handshaking
I parametri da trasmettere sono in esadecimale, quindi serve cambiare il modo di funzionamento di moserial e spippolare un po' con la calcolatrice,
se me lo chiedete (e me lo insegnate) posto qualche schermata
Adesso cena, si va avanti alla prossima puntata
Edited by masterlegnano - 15/3/2017, 20:31. -
masterlegnano.
User deleted
Importantissimo, pericolo di danni
me ne sono accorto per caso
Usate solo PC che hanno l'alimentatore "sicuro": bene a terra, senza correnti di dispersione
oppure solo portatili a batteria
dicevo, me ne sono accorto per caso
usavo il portatile, mi si stava scaricando la batteria, ho connesso l'alimentatore
la stufa ha cominciato a sbagliare le letture di temperatura
Questo significa che l'alimentatore ha una piccola corrente di dispersione
e questa corrente, attraverso il Gnd della USB e poi della seriale arriva alla scheda della stufa
falsando le misure, se siamo fortunati
bruciando qualcosa, se siamo sfortunati
Vi ho avvisati appeno lo ho scoperto
quindi: Occhio al PC. -
masterlegnano.
User deleted
Avanti con le puntate di questa quasi infinita storia
a parte che è finito l'inverno mentre io sto ancora aspettando le radio dalla Cina
vabbeh, pazienza
la stufa accetta una comunicazione seriale a 1200 baud, 8 bit di dati, nessuna parità e due bit di stop
Arduino non può gestire una comunicazione del genere, almeno non "nativamente"
dato che io voglio creare delle "stazioni" con Arduino, tra loro collegate via radio, una stazione per ogni "macchina"
servono 2 porte seriali, una per comunicare con la stufa, una per comunicare tra le stazioni (e lasciamo stare che questa parte mi prenderà il suo bel tempo)
Inoltre l'unica seriale dell'arduino uno serve per la programmazione, provoca il riavvio dell'arduino quando si apre, e vorrei tenerla per poter fare eventualmente i debug
Per fortuna sull'arduino è possibile creare delle seriali software, che sono meno performanti e coode di quella nativa, ma per i nostri scopi vanno bene
quindi serve dichiararle:CODICE#include <SoftwareSerial.h>
// Gestione stufa
// step 1: solo echo verso un PC
// step 2: formattazione dei dati
const byte rxPin = 2;
const byte txPin = 3;
const byte r2Pin = 4;
const byte t2Pin = 5;
Come vedete mi son portato avanti ed ho già dichiarato anche la seconda seriale (per la radio)
per quanto riguarda invece l'uso, bisogna prima inizializzarle:CODICESoftwareSerial ser1(rxPin, txPin); // serve per la stufa
SoftwareSerial ser2(r2Pin, t2Pin); // serve per la comunicazione
e poi usarle coi metodi print(), println(), write(), read(), ed available()
per leggere un valore dalla stufa serve trasmettere due byte che sono:
primo byte, 0 oppure 32 (in esadecimale si scrive: 0x00 oppure 0x20)
per le due aree di memoria della stufa chiamate RAM (0x00) oppure EEPROM (0x20)
secondo byte: un numero da 0 a 255 (0x00 - 0xff) per dire quale valore vogliamo leggere
la stufa risponde con una coppia di byte, che sono:
primo byte: il checksum (alzi la mano chi non sa cos'è un checksum) tra il risultato e l'ultimo byte ricevuto
secondo byte: il valore richiesto
quindi una funzione che legga il valore della stufa deve:
-aprire la comunicazione seriale
-trasmettere 0x00 se vogliamo un valore in RAM oppure 0x32 (EEPROM)
-trasmettere l'indirizzo che vogliamo leggere
e qui ci si sbizarrisce sugli indirizzi, dato che non ci sono due post che dicono la stessa cosa
comunque alcuni punti fermi l ho raggiunti:
0x00 0x03 è la temperature dell'acqua (in mezzi gradi, dovete dividere per due)
0x00 0x21 è lo stato della stufa (da 0 = spento a 7= pulizia finale)
0x00 0x32 è il tempo che manca alla pulizia braciere
dopo trasmessi i due byte bisogna:
-passare in ascolto
-aspettare il tempo necessario per ricevere la risposta
-calcolare il checksum e se i conti non tornato ripetere l'operazione
-se invece i conti tornano, il secondo byte ricevuto è il numero che ci serve
naturalmente ho scritto la parte di progrmma che fa tutto questoCODICEbyte doma_nda(byte msb , byte lsb)
{
char stringa[3];
// trasmette alla stufa il codice e restituisce il risultato//
// non esegue il test di integrità
// step 2 esegue il test di integrità
digitalWrite(led, HIGH);
//un ciclo, prova tre volte, se ricevuto OK fa break, altrimente restituisce default
for (int j = 0; j < 3; j++)
{
ser1.write(msb);
ser1.write(lsb);
ser1.listen();
//ok adesso 1/3 secondo di ascolto
delay(300);
for (int i = 0 ; ser1.available() > 0 ; i++)
{
stringa[i] = ser1.read();
}
ser2.listen();
// effettuo il test
if (msb + lsb + stringa[1] == stringa[0])
{
//test OK
return stringa[1];
break;
}
else
{
return 0;
}
digitalWrite(led, LOW);
}
}
a questo punto basta solo porre la domanda giusta :-)CODICEdoma_nda(00, 33))
per ricevere di ritorno lo stato della stufa
magari anche stamparlo sul monitor serialeCODICESerial.print(F("Stato della stufa: "));
Serial.println(doma_nda(00, 33));
e con questo oggi vi lascio
grazie per l'attenzione. -
masterlegnano.
User deleted
Il vero problema del frammento di programma di ieri .....
a proposito: non arrabbiatevi se ogni tanto parlo di codice
per i programmatore il codice è il programma, frammento di codice è un pezzetto di programma, magari usato come esempio, come nel mio precedente post,
dicevo, che il vero problema di questo frammento di programma è che la seriale della stufa funziona a 2 bit di stop, e tutte le seriali di arduino (sia HW che SW) funzionano a 1 bit di stop
in teoria siccome i bit di stop sono Space (come a dire lo stato di riposo dell'interfaccia seriale) basterebbe aggiungere un piccolo ritardo dopo la trasmissione e attendere un piccolo tempo durante la ricezione
purtroppo ho provato, e la comunicazione diventa erratica
insomma si capisce che la trasmissione avviene, e circa una volta su due avviene OK, ma spesso si ricevono valore errati, e non voglio nemmeno sapere cosa succede alla stufa se li riceve LEI i valori errati.......
insomma così non va bene
grazie agli amici del forum di arduino.cc sono riuscito a modificare la libreria softwareserial per adattarla alle nostre esigenze
si tratta di fare due semplici modifiche aggiungendo i ritardi dei quali ho appena scritto sulle routine di ricezione e trasmissione della softwareserial
e per soprammercato ho aggiunto anche la possibilità di escluderlo se vogliamo creare due istanze della software serial, una con 2 bit di stop per la stufa e una con un bit di stop per la comunicazione tra i vari nodi del M.O.S.T.R.O.
riassumendo le modifiche fatte sono:
aggiungere un parametro in più alla funzione nel file softwareserial.h
aggiungere un parametro in più alla funzione nel file softwareserial.cpp
sempre nel file .cpp aggiungere due condizioni (al parametro) che raddoppiano l'ultimo bit trasmesso
in righe di codice diventa:
dentro in SoftwareSerial.hCODICEuint16_t _inverse_logic:1;
//mxc
uint16_t _dual_bit:1;
e più avantiCODICEpublic:
// public methods
//mxc
SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false, bool dual_bit=false);
invece in SoftwareSerial.cpp:CODICE// skip the stop bit
tunedDelay(_rx_delay_stopbit);
DebugPulse(_DEBUG_PIN1, 1);
//mxc aggiunto secondo stop bit
if(_dual_bit)
tunedDelay(_rx_delay_stopbit);
// Re-enable interrupts when we're sure to be inside the stop bit
setRxIntMsk(true);
al(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false, bool dual_bit=false);
//omissis
//
// Constructor
//
SoftwareSerial::SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic , bool dual_bit) :
_rx_delay_centering(0),
_rx_delay_intrabit(0),
_rx_delay_stopbit(0),
_tx_delay(0),
_buffer_overflow(false),
_inverse_logic(inverse_logic),
_dual_bit(dual_bit)
//omissis
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
// mxc aggiunto secondo stop bit in trasmissione
if (_dual_bit)
tunedDelay(_tx_delay);
return 1;
Spero che sia abbastanza chiaro, casomai chiedete
con queste modifiche alla softwareserial è possibile aprire una seriale soft con un parametro in più, che permette di specificare il doppio bit di stopCODICESoftwareSerial ser1(rxPin, txPin, false, true); // serve per la stufa
SoftwareSerial ser2(r2Pin, t2Pin); // serve per la comunicazione
notare i due parametri in più sulla prima seriale creata, in particolare il primo serve se si vuole invertire i livelli logici
il secondo è quello aggiunto da me, serve per aggiungere il secondo bit di stop
per soprammercato la cosa funziona anche per velocità differenti e per ogni condizione della softserial, è quindi una feature ri-usabile anche in altri progetti
dopo questa modifica la comunicazione con la stufa viaggia diritta come un fuso
ed anche per oggi basta, buona giornata a tutti
Ho appena editato i listati, per separare bene le righe da me aggiunte, così risaltano di più
Edited by masterlegnano - 22/3/2017, 17:46. -
claudio_co.
User deleted
Mi intrometto, scusate.
Intanto l'adattatore per le stufe deve essere una cosa SERIA, perché se bruciate la scheda sono augelli per diabetici.
In secondo luogo avevo anche io ipotizzato l'uso di Arduino, ma poi l'ho scartato a favore di oggetti magari più complessi ma di costo ancora inferiore.
La ragione è semplice: come adattatore locale Arduino è più che adeguato, ma come gestore fa decisamente pena.
CONFERMO INVECE che tutti i dispositivi devono avere una OTTIMA alimentazione (sia che si adoperi Arduino sia che si adoperi altro).
E comunque il progetto è molto interessante.
Ciao a tutti
Claudio. -
masterlegnano.
User deleted
E quindi come HW cosa mi consigli?
faccio ancora in tempo a dirottare il progetto. -
claudio_co.
User deleted
Beh io i sistemi di riscaldamento li controllo con qualcosa di simile al RaspberryPi, magari con WIFI integrato che renda più semplice la connessione e non imponga tanti fili in giro per casa.
Il problema infatti è LA MOGLIE, in questo caso.. -
masterlegnano.
User deleted
Per claudio_co
scusami, mi sembrava di aver capito che avevi usato HW meno costoso per la stufa
alla fine mi terrò il mio arduino, credo....
ah..., e poi
hai notato anche tu strani "tempi" comandando la stufa da seriale?
perché a me sembra che i tempi di accensione e di pulizia finale non siano molto giusti, comandando da seriale
Edited by masterlegnano - 22/3/2017, 17:40.