Ciao a tutti, da tempo avevo preso arduino e messo in un cassetto... ora ho deciso finalmente di metterci mano, e ovviamente iniziano i primi problemi.. da superare.
Spiego brevemente.. tempo fa ho fatto una piccola domotica per casa, in delphi, usando 1wire.. ma sono stanco di avere un pc acceso con tutti i problemi che ne possono derivare alla sua rottura.. quindi vorrei alleggerire tutto il sistema passando ad arduino.
La logica ce l'ho tutta, visto che ho fatto il primo programma, ho trovato le varie librerie e sto facendo i primi test, tutto sembra funzionare (ma c'è ancora parecchio lavoro da fare, soprattutto per l'interfaccia web).
Ora il mio primo ostacolo.. ho lavorato con tutti sensori di temperatura e gestite le accesioni/spegnimenti con una scheda con ds2408.. ho capito come leggerla ma non ancora come scriverla.. quindi accendere e spegnere i vari device collegati.
Nella libreria OneWire c'è DS2408_Switch, perfetta.. legge e funziona.. ma come faccio a scrivere? 2 righe di esempio?
Grazie, questa libreria l'avevo già vista e la stavo provando, ma con scarsi risultati.
La lotta continua..
Doh... errore mio.. ho analizzato meglio il codice e ho trovato l'inghippo...
Funziona a meraviglia!!
Ora inizio a mettere assieme tutti i pezzi del puzzle..
Appena avrò un risultato funzionante non mancherò di pubblicare il tutto.. magari serve pure ad altri
Ciao, visto che ci ho messo un po a pulire il codice e trovare la logica e i comandi per pilotare i relè spero di far cosa gradita riportando qui sotto il codice essenziale per fare quanto serve...
Sicuramente si può fare ancora in modo più semplice e pulito.. ma in questo modo è ben chiara la logica di funzionamento.
#include <WProgram.h>
#include <DS2408.h>
#include <OneWire.h>
#include <string.h>
DS2408 ds(2); //pin di collegamento 1 wire
Device rele={0x29, 0xD6, 0xE3, 0x03, 0x00, 0x00, 0x00, 0x49}; //indirizzo chip 1wire
byte accendi;
bool A,B,C,D,E,F,G,H;
void setup() {
accendi=0;
A=false;
B=false;
C=false;
D=false;
E=false;
F=false;
G=false;
H=false;
}
void loop() {
A=!A; //accende e spegne semplicemente il primo relè...
//basta impostare a true o false da A a H per accendere ogni canale
accendi=0;
if (H) {accendi=0;} else {accendi=1;}
if (G) {accendi=accendi*2;} else {accendi=accendi*2+1;}
if (F) {accendi=accendi*2;} else {accendi=accendi*2+1;}
if (E) {accendi=accendi*2;} else {accendi=accendi*2+1;}
if (D) {accendi=accendi*2;} else {accendi=accendi*2+1;}
if (C) {accendi=accendi*2;} else {accendi=accendi*2+1;}
if (B) {accendi=accendi*2;} else {accendi=accendi*2+1;}
if (A) {accendi=accendi*2;} else {accendi=accendi*2+1;}
ds.set_state(rele, accendi);
delay(5000);
Hai lasciato WProgram, quindi stai usando l'IDE 023 o 022?
Il funzionamento è semplice. La libreria passa un byte al DS dove i singoli bit (1 o 0) comandano l'accensione o lo spegnimento dei relè.
Tutti quegli if servono per creare il byte da inviare.
Probabilmente ci sono metodi più semplici per fare quella operazione.
PaoloP:
Probabilmente ci sono metodi più semplici per fare quella operazione.
Quel codice è uno spreco di risorse. Crea 8 byte (un boolean è un byte) e poi usa una catena di if e moltiplicazioni per settare i singoli bit di un'altra variabile da spedire. Quello che ho suggerito è un metodo più semplice: prendi 1 solo byte e manipoli direttamente quello. Non servono gli 8 byte iniziali, il set/clear di un bit (corrispondente ad un singolo relé) già trasformando:
A = false
in
bitClear(accendi, 0);
Grazie per i suggerimenti... avendo programmato su pc fino a poco tempo fa, le risorse non sono mai state un grosso problema... e con arduino sono subito arrivato a tappo, o quasi.
Cercherò di ottimizzare il codice con i vostri suggerimenti.