Visualizza la versione completa : Aquarduino: libreria "base" gestione plafoniera AGGIORNATA al 19/07/2013
Ricarico il mio progetto con arduino sperando che possa essere di aiuto a chiunque voglia cimentarsi nell'utilizzo di questa scheda.
L'obiettivo è quello di creare un controller, basato su arduino, per automatizzare la gestione del mio futuro acquario.
Al progetto ho voluto dare il nome "Aquarduino".
Per cominciare ho acquistato:
- Arduino Mega 2560 R3 rev3 ATmega2560-16AU USB Board & Free USB Cable
- Breadboard 760 Point Solderless &65pcs Jumper Cable Wire Kit for Arduino/PIC/ARM
- New Arduino I2C RTC DS1307 AT24C32 Real Time Clock Module For AVR ARM PIC
- NEW DIY IR Remote Control Kit For Arduino MCU PIC Infrared
- 1PCS 12864 Blue Backlight 128X64 Dots Graphic Matrix LCD Module Display LCM (controller ST7920)
http://imageshack.us/a/img443/9089/arduinop.png
Ho anche acquistato un adattatore della digole per interfacciare LCD tramite il protocollo seriale I2C ma, purtroppo, non ne ha voluto sapere di funzionare.
Fortunatamente LCD con controller ST7920 supporta il protocollo SPI e me la sono cavata con soli tre pin.
http://imageshack.us/a/img22/7705/lcdricevitorertc.jpg
Display
Protocollo: SPI
Pins: SCK = en = 52, MOSI = RW = 51, CS = RS = di = SS = 53
Backlight: pin 46 (PWM per effetto fade tramite mosfet). L'idea è quella di illuminare lo schermo solo quando sarà rilevato un movimento nella stanza.
Libreria: U8glib (http://code.google.com/p/u8glib/)
RTC
Protocollo: I2C
Pins: SDA = 20, SCL = 21
Vi segnalo un interessante articolo (http://www.logicaprogrammabile.it/promemoria-arduino-rtc/) per gestire le momoria interna del chip DS1307.
Ricevitore telecomando
Pin: 47
Libreria: IRremote (https://github.com/shirriff/Arduino-IRremote)
Prossimo passo: costruzione e dimerazione plafoniera a led.
Ho già provato il driver BZ 1000mA Switching (http://www.bizetashop.it/shop/20000-alimentazioneeaccessori/24000-driverled/24200-inputdc/bz-1000ma-switching-bz-drv-swt-1000ma) che lavora benissimo con l'uscita PWM di arduino.
http://imageshack.us/a/img20/7308/drivereled.png
#28#28#28
Ho buttato giù due righe di codice creando la libreria per gestire la plafoniera che sto costruendo.
La libreria fornisce le funzioni "essenziali" che potrete facilmente estendere in base alle vostre necessità.
L'effetto alba e tramonto, qualora sia impostato, viene automaticamente regolato proporzionalmente ai secondi trascorsi in relazione all'ora di accensione e spegnimento del canale.
Per ogni canale basta impostare l'ora di accensione e spegnimento, eventuali minuti iniziali/finali di durata effetto alba/tramonto, il valore massimo pwm e il pin del canale.
Interfaccia (scheda denominata Plafo.h)
// Created by Niko Furioso on 15/07/13.
#ifndef __PLAFO_H__
#define __PLAFO_H__
#include <arduino.h>
enum Channels{
blue=0,
white=1,
uv=2,
moon=3
};
const byte channelsCount=4;
class Plafo {
public:
//Costruttore
Plafo();
void setChannel(const int channel,const byte startHour,const byte startMinute,const byte endHour,const byte endMinute,const unsigned int fadeLen,const byte maxPWM,const byte pin);
void perform(const byte nowHour,const byte nowMinute,const byte nowSecond);
private:
void performChannel(void* channel,const byte nowHour,const byte nowMinute,const byte nowSecond);
unsigned long elapsedTimeToSecond(const byte startHour,const byte startMinute,const byte startSecond,const byte endHour,const byte endMinute,const byte endSecond);
};
#endif
Implementazione (scheda denominata Plafo.cpp)
// Created by Niko Furioso on 15/07/13.
#include "Plafo.h"
struct Channel{
byte startHour,startMinute,maxPWM,lastPWM,pin;
unsigned long lightLen,fadeLen;
};
Channel *channels[channelsCount];
byte lastSecond;
//Costruttore
Plafo::Plafo(){
//Creazione canali
for (byte idx=0;idx<channelsCount;idx++){
channels[idx]= new Channel();
}
lastSecond=60;
}
//Metodi publici
void Plafo::setChannel(const int channel,const byte startHour,const byte startMinute,const byte endHour,const byte endMinute,const unsigned int fadeLen,const byte maxPWM,const byte pin){
//Configurazione canale
channels[channel]->startHour=startHour;
channels[channel]->startMinute=startMinute;
channels[channel]->lightLen=elapsedTimeToSecond(startHour,startMinute ,0,endHour,endMinute,0);
channels[channel]->fadeLen=(unsigned long)fadeLen*60;
channels[channel]->maxPWM=maxPWM;
channels[channel]->pin=pin;
//Impostazione pin canale in uscita
pinMode(channels[channel]->pin,OUTPUT);
}
void Plafo::perform(const byte nowHour,const byte nowMinute,const byte nowSecond){
//Aggiornamento stato plafoniera
if (lastSecond!=nowSecond){
lastSecond=nowSecond;
for (byte idx=0;idx<channelsCount;idx++){
performChannel(channels[idx],nowHour,nowMinute,nowSecond);
}
}
}
//Metodi privati
void Plafo::performChannel(void* channel,const byte nowHour,const byte nowMinute,const byte nowSecond){
Channel *workCnl=(Channel*)channel;
//In base al valore massimo del canale determina se il pin è pwm o digitale
boolean isDigitalPin=workCnl->maxPWM==HIGH;
//Calcolo secondi trascorsi tra l'ora di accensione del canale e l'ora attuale
unsigned long elapsedSecond=elapsedTimeToSecond(workCnl->startHour,workCnl->startMinute,0,nowHour,nowMinute,nowSecond);
byte pwmValue=(isDigitalPin) ? LOW : 0;
//Verifica se il canale è acceso
if (elapsedSecond<=workCnl->lightLen){
//Verifica se alba
if (elapsedSecond<workCnl->fadeLen){
//Calcolo valore PWM in relazione ai secondi trascorsi dall'ora di inizio
pwmValue=(elapsedSecond*workCnl->maxPWM)/workCnl->fadeLen;
}//Verifica se tramonto
else if (elapsedSecond>workCnl->lightLen-workCnl->fadeLen){
//Calcolo valore PWM in relazione ai secondi mancanti all'ora di fine
pwmValue=((workCnl->lightLen-elapsedSecond)*workCnl->maxPWM)/workCnl->fadeLen;
}//Luce piena
else{
pwmValue=workCnl->maxPWM;
}
}
//Aggiorna lo stato del pin solo se il valore è effettivamente cambiato
if (workCnl->lastPWM!=pwmValue){
workCnl->lastPWM=pwmValue;
if (isDigitalPin){
digitalWrite(workCnl->pin,pwmValue);
}
else{
analogWrite(workCnl->pin,pwmValue);
}
}
}
unsigned long Plafo::elapsedTimeToSecond(const byte startHour,const byte startMinute,const byte startSecond,const byte endHour,const byte endMinute,const byte endSecond){
//Calcolo secondi tra ora di inizio e ora di fine
int elapsedHour;
elapsedHour=endHour-startHour;
if (elapsedHour<0)elapsedHour=24-startHour+endHour;
unsigned int elapsedMinute;
elapsedMinute=(unsigned int)elapsedHour*60 + endMinute-startMinute;
return (unsigned long)elapsedMinute*60 + endSecond-startSecond;
}
Per utilizzarla non resta che importarla nel vostro progetto, ad esempio:
#include "Plafo.h"
Plafo plafo;
void setup(void) {
//Channel,startHour,startMinute,endHour,endMinute,fa deLen,maxPWM,pin
plafo.setChannel(blue,18,0,4,0,30,180,7);//Dalle 18.00 alle 4.00, alba/tramonto 30 minuti, pwm massimo 180, pin 7
plafo.setChannel(white,18,15,3,45,75,180,5);//Dalle 18.15 alle 3.45, alba/tramonto 75 minuti
plafo.setChannel(uv,19,30,2,30,0,HIGH,22);//Dalle 19.30 alle 2.30, accensione immediata, pin 22 (digitale)
plafo.setChannel(moon,4,10,7,0,0,HIGH,23);//Dalle 4.10 alle 7.00
}
void loop(void) {
//Sostituire "hour","minute", "second" con le variabili dichiarate sul vostro progetto, che contengono rispettivamente l'ora, i minuti e i secondi correnti.
plafo.perform(hour,minute,second);
}
Per modificare, eliminare o aggiugere nuovi canali basta modificare "enum Channels" e la costante "channelsCount" presenti sull'interfaccia.
Spero che questa libreria vi possa essere di aiuto, naturalmente sono ben accetti consigli o segnalazioni di bug.
--------------AGGIORNAMENTI
19/07/2013 - i canali venivano ricreati ogni qualvolta venivano configurati
Complimenti per il progetto Niko....
lionfish
19-07-2013, 00:30
Niko il codice è fantastico, montato su un arduino uno e finziona una bellezza.
ho messo su un display 20x4 i2c con un I2C RTC DS1307.
riesco a far funzionare l'ora sul display ma non so dove trovare il valore pwm di un determonato pin sul tuo codice. ho visto che sono nelle lib ma non so come portarlo nel void loop().
il mio prossimo passo è installare un rotary per cambiare i valori. ho già messo le variabili al posto dei numeri. comunque grande...
Aggiornata libreria di gestione plafoniera.
Modificata l'implementazione.
Porca pupazza, ho comprato arduino per curiosita ma non ci capisco na mazza porca pupazza, pero sto post mi stuzzica....mo ce provo.......
Niko il codice è fantastico, montato su un arduino uno e finziona una bellezza.
ho messo su un display 20x4 i2c con un I2C RTC DS1307.
riesco a far funzionare l'ora sul display ma non so dove trovare il valore pwm di un determonato pin sul tuo codice. ho visto che sono nelle lib ma non so come portarlo nel void loop().
il mio prossimo passo è installare un rotary per cambiare i valori. ho già messo le variabili al posto dei numeri. comunque grande...
Grazie, mi fa piacere che la libreria ti è tornata utile.
Ciò che ti serve è la proprietà "lastPWM" del canale.
Per ottenerla devi esporla tramite una funzione pubblica in lettura da inserire sull'interfaccia ("Plafo.h"). Ad esempio:
byte lastPWMChannel(const int channel);
Per poi implementarla (su "plafo.cpp"):
byte Plafo::lastPWMChannel(const int channel){
return channels[channel]->lastPWM;
}
Per richiamare la funzione dal tuo progetto basterà quindi inserire ad esempio:
byte pwmValue=plafo.lastPWMChannel(white);
Ciao
lionfish
20-07-2013, 23:59
Grazie, mi fa piacere che la libreria ti è tornata utile.
Ciò che ti serve è la proprietà "lastPWM" del canale.
Per ottenerla devi esporla tramite una funzione pubblica in lettura da inserire sull'interfaccia ("Plafo.h"). Ad esempio:
byte lastPWMChannel(const int channel);
Per poi implementarla (su "plafo.cpp"):
byte Plafo::lastPWMChannel(const int channel){
return channels[channel]->lastPWM;
}
Per richiamare la funzione dal tuo progetto basterà quindi inserire ad esempio:
byte pwmValue=plafo.lastPWMChannel(white);
Ciao[/QUOTE]
Niko Grazie, sei un grande veramente.
domani provo i codici e ti faccio sapere.
più che utile! ho sostituito le mie centinaia di righe con le tue semplicissime ( nel numero di righe ) librerie. ieri ho implementato il rotary, un LCD 20x4 con un'interfaccia i2C ed un RTC sempre I2C. risparmiando pin sull'uno. ora implemento il menù ed il primo passo è fatto.
Grazie ancora Niko!!
a disposizione per qualunque cosa ( nel mio piccolo)
Sampei79
21-07-2013, 00:14
Già il fatto che rendi pubblico il tuo progetto di programmazione con arduino TANTO DI CAPPELLO!!! Sarà che personalmente mi sono arenato da diversi mesi con la mia programmazione con arduino.. Che tu sappia questo potrebbe funzionare anche arduino 2009?!? Mi agevolerebbe molto la mia assoluta inesperienza.. Grazie
Ciao, complimenti per il lavoro.
Quali dimmer (marca e modello) utilizzi per pilotare alba e tramonto con il PWM?
grazie ciao
lionfish
22-07-2013, 10:44
Ciao, complimenti per il lavoro.
Quali dimmer (marca e modello) utilizzi per pilotare alba e tramonto con il PWM?
grazie ciao
immagino tu intenda i driver... io uso quelli nella foto di bizetashop ma non so se ne hanno ancora, stanno smettendo la produzione dei pezzi per produrre solo plafo e BASTA!!
peccato perchè oltre a bravi e disponibili ed affidabili avevano anche tante cosine interessanti.
Ciao, complimenti per il lavoro.
Quali dimmer (marca e modello) utilizzi per pilotare alba e tramonto con il PWM?
grazie ciao
immagino tu intenda i driver... io uso quelli nella foto di bizetashop ma non so se ne hanno ancora, stanno smettendo la produzione dei pezzi per produrre solo plafo e BASTA!!
peccato perchè oltre a bravi e disponibili ed affidabili avevano anche tante cosine interessanti.
peccato veramente! Io ho gli stessi tuoi drivers da 700ma
ti devo fare prima di tutto i miei complimenti prima ancora di provare il tuo codice, ho arduino da poco e stò testando le mie capacità di apprendimento...un pò legnose data l'età -41
Ho poco tempo in questo periodo ma seguirò il tuo progetto, io devo apportare un paio di modifiche alla plafo poi la installo.
Il tuo display è na figata, io ho un 20x4 e dovrebbe bastare per l'uso. Avrei un tastierino a membrana 4x4 ma non ho piu pin sul mio ardu uno.
Stasera provo le tue libreria
GRAZIE di nuovo e se posso essere utile..
GUIDO
...come posso fare per provare il tuo codice?
grazie
lionfish
23-07-2013, 10:04
Ciao Guido,
scusa se mi permetto Niko, ti serve un arduino, prefibilmente un uno o mega, dei normali led se devi solo testare collegare i led ai pin di riferimento, (se usi Arduino Uno devi cambiare dei codici per i pin), inserisci i parametri ora, minuti etc. carica le librerie, lancia il codice ed il gioco è fatto.
Il codice è eccezionale per le poche righe e le funzionalità mi ha risparmiato fiumi di codici.
Niko ho inserito le righe per il display.....perfetto!! Grazie mille
Ciao Guido,
scusa se mi permetto Niko, ti serve un arduino, prefibilmente un uno o mega, dei normali led se devi solo testare collegare i led ai pin di riferimento, (se usi Arduino Uno devi cambiare dei codici per i pin), inserisci i parametri ora, minuti etc. carica le librerie, lancia il codice ed il gioco è fatto.
Il codice è eccezionale per le poche righe e le funzionalità mi ha risparmiato fiumi di codici.
Niko ho inserito le righe per il display.....perfetto!! Grazie mille
Ciao Lionfish
il primo passo l'ho fatto, ho arduino uno, display 20x4(in attesa di shield per bus i2c), rtc ds1307, sonda temperatura isolata ds18b20 e sensore sempre ds18b20,breadboard e jumpers , per i led ho gia ultimato la plafo...salvo qualche modifica, e ho 4 driver uguali a quelli di Niko della bizeta anzichè 1000ma sono da 700...ecco tutto:-)
il fatto è che sono riuscito fin'ora a far funzionare con codici altrui #12 tutti i componenti ma sto iniziando ora ad imparare qualche comando.
in sintesi come uso i file libreria di Nico?
Grazie della pazienza
billykid591
23-07-2013, 11:30
Ciao, complimenti per il lavoro.
Quali dimmer (marca e modello) utilizzi per pilotare alba e tramonto con il PWM?
grazie ciao
immagino tu intenda i driver... io uso quelli nella foto di bizetashop ma non so se ne hanno ancora, stanno smettendo la produzione dei pezzi per produrre solo plafo e BASTA!!
peccato perchè oltre a bravi e disponibili ed affidabili avevano anche tante cosine interessanti.
peccato veramente! Io ho gli stessi tuoi drivers da 700ma
ti devo fare prima di tutto i miei complimenti prima ancora di provare il tuo codice, ho arduino da poco e stò testando le mie capacità di apprendimento...un pò legnose data l'età -41
Ho poco tempo in questo periodo ma seguirò il tuo progetto, io devo apportare un paio di modifiche alla plafo poi la installo.
Il tuo display è na figata, io ho un 20x4 e dovrebbe bastare per l'uso. Avrei un tastierino a membrana 4x4 ma non ho piu pin sul mio ardu uno.
Stasera provo le tue libreria
GRAZIE di nuovo e se posso essere utile..
GUIDO
Se ti intendi un pò di elettronica potresti aggiungere al progetto un integrato PCF8574 (un espansore di i/o su bus I2c) collegato ai pin del display e risparmieresti un bel pò di pin di Arduino c'è anche l'apposita libreria...
...come posso fare per provare il tuo codice?
grazie
Il modo più semplice per utilizzare il codice è quello di inserire due "tabs" sul tuo progetto. Una la chiamerai "Plafo.h" dove inserirai il codice di interfaccia, l'altra "Plafo.cpp" dove inserirai il codice di implementazione.
Quindi, sulla funzione "setup" del progetto configuri i canali, mentre sulla funzione "loop" aggiorni lo stato della plafoniera.
http://www.provalotu.com/wp-content/gallery/funzione-tab/1.jpg
Se vuoi approfondire il discorso sulle librerie, puoi dare un'occhiata a questo link (http://it.emcelettronica.com/come-scrivere-libreria-arduino#_).
...come posso fare per provare il tuo codice?
grazie
Il modo più semplice per utilizzare il codice è quello di inserire due "tabs" sul tuo progetto. Una la chiamerai "Plafo.h" dove inserirai il codice di interfaccia, l'altra "Plafo.cpp" dove inserirai il codice di implementazione.
Quindi, sulla funzione "setup" del progetto configuri i canali, mentre sulla funzione "loop" aggiorni lo stato della plafoniera.
http://www.provalotu.com/wp-content/gallery/funzione-tab/1.jpg
Se vuoi approfondire il discorso sulle librerie, puoi dare un'occhiata a questo link (http://it.emcelettronica.com/come-scrivere-libreria-arduino#_).
ciao Niko
ho inserito i due tabs ma in fase di verifica mi da questo errore
http://s13.postimg.cc/7n5gjzl9v/Cattura.jpg (http://postimg.cc/image/7n5gjzl9v/)
bello il display...è grafico vero?
lionfish
24-07-2013, 00:41
Prova così..
plafo.perform(hour(), minute(), second());
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
billykid591
24-07-2013, 09:22
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
Esatto, a tal proposito ho aggiunto un commento sul codice di esempio.
lionfish
24-07-2013, 11:03
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
cosa hai per controllare lorario?
rtc? di che tipo?
che librerie usi??
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
cosa hai per controllare lorario?
rtc? di che tipo?
che librerie usi??
tiny RTC I2c modules
lionfish
24-07-2013, 15:45
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
Esatto, a tal proposito ho aggiunto un commento sul codice di esempio.
scusate immaginavo che era già configurato l'RTC.......
// io ho un libreria richiamata:
#include <DS1307RTC.h>
// definizione dell'indirizzo seriale del RTC I2C:
#define DS1307_ADDRESS 0x68
// ed una stringa che richiama i dati della libreria:
setSyncProvider(RTC.get);
anche se non c'è RTC con questa stringa prende un orario di riferimento 17:18 e funziona per circa 3 minuti poi ricomincia da 17:18
per mettere sul display l'orario io uso queste righe di codice:
lcd.setCursor(0,0);
if (day()<10) lcd.print("0");
lcd.print(day());
lcd.print("/");
if (month()<10) lcd.print("0");
lcd.print(month());
lcd.print("/");
//if (second()<10) lcd.print("0");
lcd.print(year());
lcd.setCursor(11,0);
if (hour()<10) lcd.print("0");
lcd.print(hour());
lcd.print(":");
if (minute()<10) lcd.print("0");
lcd.print(minute());
lcd.print(":");
if (second()<10) lcd.print("0");
lcd.print(second());
chiaramente "lcd" è dichiarato nella configurazione del display che è un i2C 20x4.
spero che possa aiutare a disposizione se serve.
matteociocca
24-07-2013, 20:27
ciao a tutti..
nel costruire la mia plafo mi sono cimentato anch'io con arduino..
Però dato che non volevo scervellarmi col codice ho utilizzato questo..
Non so se conoscete il typhoon reef.. vi allego il link col codice utilizzato da me e da loro =)
codice typhoon reef (https://code.google.com/p/typhon-reef/source/browse/trunk/software/typhon/typhon.pde)
quello che ho fatto io è stato ricostruire il suo hardware e caricare il programma e gioco fatto ;)
ciao Matteo!
non ho capito bene di cosa si tratta#24
matteociocca
25-07-2013, 00:14
Ciao guido.. ecco qui, questo è il prodotto che vendono già bello che pronto
boostled (http://www.boostled.com/product_p/typhon.htm)
Dato che Arduino utilizza codice open source sul sito c'è anche tutto il codice che viene utilizzato, che sarebbe il link che ti ho postato prima.
Io ho acquistato i componenti per copiare l'hardware , cioè schermo, RTC, ecc e sono andato a ricostruirlo uguale. In questo modo ho caricato il codice pari pari (poi va bhe ho tradotto le scritte sullo schermo in italiano) e basta.. =)
[QUOTE=lionfish;1062083949]Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
.........................
........................
cd.print("0");
lcd.print(minute());
lcd.print(":");
if (second()<10) lcd.print("0");
lcd.print(second());
chiaramente "lcd" è dichiarato nella configurazione del display che è un i2C 20x4.
spero che possa aiutare a disposizione se serve.
Purtroppo Lionfish sono troppo indietro con Arduino e per ora non capisco, mi rendo conto che
la soluzione di Matteo è piu pratica e realista. D'altro canto mi sono attrezzato con arduino e vorrei riuscire a farcela...insomma un bel dilemma.
Per capirci, ho un display 20x4 hd44.. compatibile e fino a ieri usavo liquidcristal ed i 16 pin, Hello world è il mio livello. Ieri mi è arrivato lcm1602 IIC per poter collegare l'lcd in i2c. E qui sono piantato#06
ho caricato questo semplice codice:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Hello, world!");
}
void loop()
{
}
importato la libreria liquidcristal_I2C
e collegato sda in a5 ed scl in a4 ma di Hello world manco l'ombra...ho provato altri pin, niente
#17
lionfish
25-07-2013, 08:50
Purtroppo Lionfish sono troppo indietro con Arduino e per ora non capisco, mi rendo conto che
la soluzione di Matteo è piu pratica e realista. D'altro canto mi sono attrezzato con arduino e vorrei riuscire a farcela...insomma un bel dilemma.
Per capirci, ho un display 20x4 hd44.. compatibile e fino a ieri usavo liquidcristal ed i 16 pin, Hello world è il mio livello. Ieri mi è arrivato lcm1602 IIC per poter collegare l'lcd in i2c. E qui sono piantato#06
ho caricato questo semplice codice:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Hello, world!");
}
void loop()
{
}
importato la libreria liquidcristal_I2C
e collegato sda in a5 ed scl in a4 ma di Hello world manco l'ombra...ho provato altri pin, niente
#17
ho notato due cose:
la prima è che hai dichiarato il display sbagliato quindi invece di
LiquidCrystal_I2C lcd(0x20,16,2);
deve essere
LiquidCrystal_I2C lcd(0x20,20,4);
questo chiaramente se l'indirizzo del display 0x20 è corretto, il mio è uguale quindi suppongo che lo sia.
seconda cosa non hai dato la posizione dell testo da scrivere quindi prima di "Hello Word" ci va
lcd.setCursor(4,1) ;
Prova e fammi sapere. i pin dovrebbero essere corretti, un check facile è che se sono montati bene quando fai il reset dell'arduino ti si dovrebbe spegnere e riaccendere il display, se così non è allora hai i collegamenti sbagliati.
fammi sapere.
ciao
ho prima di tutto trovato il collegamento corretto i2c_scanner a 0x20
ho settato 20x4 le linee display e quindi aggiunto la linea
lcd.setCursor(4,1) ;
qualcosa è cambiato... si spegne la retroilluminazione!
purtroppo sono di passaggio ma stasera ci riprovo, forse è questa da rivedere
lcd.backlight();
per ora grazie!
billykid591
25-07-2013, 17:37
ciao
ho prima di tutto trovato il collegamento corretto i2c_scanner a 0x20
ho settato 20x4 le linee display e quindi aggiunto la linea
lcd.setCursor(4,1) ;
qualcosa è cambiato... si spegne la retroilluminazione!
purtroppo sono di passaggio ma stasera ci riprovo, forse è questa da rivedere
lcd.backlight();
per ora grazie!
se fai uno schemino di come hai collegato i pin dell'LCD forse ti possiamo aiutare..comunque nei normali LCD (non seriali) il pin 1 va a massa il 2 al positivo e il 3 al centrale del trimmer di regolazione del contrasto...poi ci sono i pin di controllo e dei dati e infine gli ultimi due (15 e 16) sono il led della retroilluminazione....
se fai uno schemino di come hai collegato i pin dell'LCD forse ti possiamo aiutare..comunque nei normali LCD (non seriali) il pin 1 va a massa il 2 al positivo e il 3 al centrale del trimmer di regolazione del contrasto...poi ci sono i pin di controllo e dei dati e infine gli ultimi due (15 e 16) sono il led della retroilluminazione....
collegandolo normalmente è ok il problema è usando I2C che non riesco a farlo funzionare, forse la mia libreria liquidcrystal_I2c non va bene. Facendo uno scan seriale il display risulta 0x20 quindi è collegato correttamente suppongo
ciao guido
billykid591
25-07-2013, 22:41
se fai uno schemino di come hai collegato i pin dell'LCD forse ti possiamo aiutare..comunque nei normali LCD (non seriali) il pin 1 va a massa il 2 al positivo e il 3 al centrale del trimmer di regolazione del contrasto...poi ci sono i pin di controllo e dei dati e infine gli ultimi due (15 e 16) sono il led della retroilluminazione....
collegandolo normalmente è ok il problema è usando I2C che non riesco a farlo funzionare, forse la mia libreria liquidcrystal_I2c non va bene. Facendo uno scan seriale il display risulta 0x20 quindi è collegato correttamente suppongo
ciao guido
Hai messo le due resistenze di pull-up tra le linee SCL e SDA e il positivo?...di norma si usano due resistenze da 10 k
Non le ho messe, pensavo servissero solo in caso
di collegamento di più display... Anche sugli schemi
che ho non risultano.
Stasera provo, però ho controllato i collegamenti e
credo che ci fosse un contatto... Stasera vi aggiorno
Grazie
billykid591
26-07-2013, 18:54
Non le ho messe, pensavo servissero solo in caso
di collegamento di più display... Anche sugli schemi
che ho non risultano.
Stasera provo, però ho controllato i collegamenti e
credo che ci fosse un contatto... Stasera vi aggiorno
Grazie
Le resistenze di pull-up vanno sempre messe a meno che hai un Rtc preassemblato in cui di solito sulle lineee SCL e SDA sono gia' inserite.
Le resistenze di pull-up vanno sempre messe a meno che hai un Rtc preassemblato in cui di solito sulle lineee SCL e SDA sono gia' inserite.
ho provato con il modulo tiny rtc i2c ma non cambia il prodotto, quando parte il programma lcd si spegne, purtroppo ho resistenze 4,7 in casa e solo 1 da 10k ...ne ho alcune da 12k
comunque con quelle da 4,7 nn cambia
lionfish
28-07-2013, 12:45
ho fatto un po' di prove:
io ho display da 20x4 e 16x2 e convertitori della DFrobot due modelli diversi.
devo dire che con uno di questi ho lo stesso problema di Guido stasera provo con le resistenze.
il problema a volte non c'è con o senza RTC a volte funziona ma a volte non ne vuole sapere.
non ho trovato altre libreria decenti.
billykid591
28-07-2013, 13:58
Controllate che l'RTC e il display non siano settati sullo stesso indirizzo I2C
con un i2c scanner vedo 0x20 0x50 0x68...con rtc staccato vedo 0x20...il display
sto meditando di prendere un nuovo display magari come quello di Nico #28d#
ciao a tutti
dopo varie tribulazioni sono riuscito a far funzionare il display in SPI, ho preso un altro modulo ma nemmeno quello ne voleva sapere, fortunatamente avevo anche lapossibilità SPI
miracolo!
Ora posso studiare il codice e vedere se un giorno riuscirò anche a mettere in pratica
questo prezioso post!
...dimenticavo
prima di iniziare a fondere meningi per nulla... è compatibile con ide 1.0.5 ed windows xp?
grazie
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
Ciao, ci ho provato anch'io, con lo stesso esito.
Ti spiegheresti meglio su questo argomento?
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
Ciao, ci ho provato anch'io, con lo stesso esito.
Ti spiegheresti meglio su questo argomento?
Utilizzi un RTC ?
Posta lo spezzone di codice con cui visualizzi l'ora sul display o sulla seriale.
Aiuterà a capire ciò che, nel tuo codice, bisogna passare al metodo perform.
billykid591
07-02-2014, 18:57
Prova così..
plafo.perform(hour(), minute(), second());
mi da il medesimo errore
Così non potrà mai funzionare....devi prima dichiarare le variabili hour, minute e second e dargli un valore agganciandole ai relativi valori ritornati dal real time clock (il DS1307) e poi passarle a plafo.perform...ovviamente oltre all'RTC devi usare anche la libreria apposita (DS1307rc)
Ciao, ci ho provato anch'io, con lo stesso esito.
Ti spiegheresti meglio su questo argomento?
Utilizzi un RTC ?
Posta lo spezzone di codice con cui visualizzi l'ora sul display o sulla seriale.
Aiuterà a capire ciò che, nel tuo codice, bisogna passare al metodo perform.
Bisogna tenere conto che la classe plafo creata da niko79 funziona solo con gli IDE Arduino dalla 1 in poi con gli IDE 22, 23 non funziona perchè non supportano le classi...NDR
Eccolo:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since 1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.unixtime() + 7 * 86400L + 30);
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
delay(1000);
}
Perfetto, dopo che hai creato le due schede inserendo rispettivamente l'interfaccia e l'implementazione della classe, importa la classe e crea l'oggetto plafo sul codice principale ad esempio cosi:
#include <Wire.h>
#include "RTClib.h"
#include "Plafo.h"
RTC_DS1307 RTC;
Plafo plafo;//Plafoniera
Sul metodo setup configura i canali ad esempio cosi:
void setup () {
//Configurazione plafoniera
//Channel,startHour,startMinute,endHour,endMinute,fa deLen,maxPWM,pin
plafo.setChannel(blue,18,0,4,0,30,180,7);//Dalle 18.00 alle 4.00, alba/tramonto 30 minuti, pwm massimo 180, pin 7
plafo.setChannel(white,18,15,3,45,75,180,5);//Dalle 18.15 alle 3.45, alba/tramonto 75 minuti
plafo.setChannel(uv,19,30,2,30,0,HIGH,22);//Dalle 19.30 alle 2.30, accensione immediata, pin 22 (digitale)
plafo.setChannel(moon,4,10,7,0,0,HIGH,23);//Dalle 4.10 alle 7.00
Serial.begin(57600);
Wire.begin();
RTC.begin();
....
sul ciclo loop esegui quindi il metodo perform dell'oggetto plafo passando l'ora ottenuta con l'RTC:
void loop () {
DateTime now = RTC.now();
plafo.perform(now.hour(), now.minute(), now.second());
...
#28#28
Ho fatto così:
#include "Plafo.h"
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
Plafo plafo;
void setup(void) {
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
//Channel,startHour,startMinute,endHour,endMinute,fa deLen,maxPWM,pin
plafo.setChannel(blue,18,0,4,0,30,180,7);//Dalle 18.00 alle 4.00, alba/tramonto 30 minuti, pwm massimo 180, pin 7
plafo.setChannel(white,18,15,3,45,75,180,5);//Dalle 18.15 alle 3.45, alba/tramonto 75 minuti
plafo.setChannel(uv,19,30,2,30,0,HIGH,22);//Dalle 19.30 alle 2.30, accensione immediata, pin 22 (digitale)
plafo.setChannel(moon,4,10,7,0,0,HIGH,23);//Dalle 4.10 alle 7.00
}
void loop(void) {
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since 1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.unixtime() + 7 * 86400L + 30);
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
delay(1000);
//Sostituire "hour","minute", "second" con le variabili dichiarate sul vostro progetto, che contengono rispettivamente l'ora, i minuti e i secondi correnti.
plafo.perform(8,0,0);
}
ma mi da una sfilza di errori...
il formato orario che inserisco a fine codice è corretto?
Scusa, ma come puoi immaginare sono proprio ai primordi.
------------------------------------------------------------------------
Ecco gli errori
Plafo\plafo.cpp.o: In function `Plafo::elapsedTimeToSecond(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:91: multiple definition of `Plafo::elapsedTimeToSecond(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:91: first defined here
c:/programmi/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
Plafo\plafo.cpp.o: In function `Plafo::performChannel(void*, unsigned char, unsigned char, unsigned char)':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:49: multiple definition of `Plafo::performChannel(void*, unsigned char, unsigned char, unsigned char)'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:49: first defined here
Plafo\plafo.cpp.o: In function `Plafo::perform(unsigned char, unsigned char, unsigned char)':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:37: multiple definition of `Plafo::perform(unsigned char, unsigned char, unsigned char)'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:37: first defined here
Plafo\plafo.cpp.o: In function `Plafo::elapsedTimeToSecond(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:91: multiple definition of `lastSecond'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:91: first defined here
Plafo\plafo.cpp.o: In function `Plafo::elapsedTimeToSecond(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:91: multiple definition of `channels'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:91: first defined here
Plafo\plafo.cpp.o: In function `Plafo::setChannel(int, unsigned char, unsigned char, unsigned char, unsigned char, unsigned int, unsigned char, unsigned char)':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:24: multiple definition of `Plafo::setChannel(int, unsigned char, unsigned char, unsigned char, unsigned char, unsigned int, unsigned char, unsigned char)'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:24: first defined here
Plafo\plafo.cpp.o: In function `Plafo':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:14: multiple definition of `Plafo::Plafo()'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:14: first defined here
Plafo\plafo.cpp.o: In function `Plafo':
C:\Programmi\Arduino\libraries\Plafo/plafo.cpp:14: multiple definition of `Plafo::Plafo()'
plafo.cpp.o:C:\DOCUME~1\Piero\IMPOST~1\Temp\build8 057541304359831578.tmp/plafo.cpp:14: first defined here
#06
Perche hai modificato il metodo perform cosi:
plafo.perform(8,0,0);
Devi lasciare come ti ho suggerito, inviando l'orario sempre aggiornato del RTC.
Hai inserito le due schede con l'interfaccia e l'implementazione della classe plafo ?
Dal messaggio di errore sembrerebbe che hai creato la classe da qualche altra parte.
allora non ho capito, credevo di dover impostare un orario e sostituire hour, minute, second.
Lasciando come dici mi da questo:
http://s3.postimg.cc/71l4jpntr/prova_plafo.jpg (http://postimg.cc/image/71l4jpntr/)
Anche con le due schede:
http://s18.postimg.cc/y9so8qrxh/prova_plafo.jpg (http://postimg.cc/image/y9so8qrxh/)
billykid591
09-02-2014, 01:24
Anche con le due schede:
http://s18.postimg.cc/y9so8qrxh/prova_plafo.jpg (http://postimg.cc/image/y9so8qrxh/)
E' ovvio che ti da errore se non hai definito prima le variabili hour minute e second.....sostituiscile direttamente con i dati dell' rtc come ti ha detto niko cioe' now.hour(), now.minute() e now.second))....e dovrebbe funzionare
http://s3.postimg.cc/9yqxyrwrj/Provaplafo.jpg (http://postimg.cc/image/9yqxyrwrj/)
Dici così?
Si cosi è corretto.
Il progetto è sotto la cartella libraries di Arduino ?
Se è cosi sposta il progetto al di fuori di libraries.
cesarino.cv77
10-02-2014, 15:57
Ciao e complimenti per il lavoro!
Una domanda"",ammetto che parlo nella totale ignoranza sull'argomento"",un mio carissimo amico mi sta progettando,o meglio sta creando(prima ne ha fatto uno per lui) un controller per la mia plafoniera basato su Arduino,
Praticamente il modello utilizzato e il Leonardo,fin qui tutto bene,per quello che deve fare va benissimo,resta il fatto che il suo controller nasce senza sonda per la temperatura per raffreddare la plafo,ma fa andare in corrispettiva le ventole con l'accensione e lo spegnimento di una linea di led predefinita,per me va benissimo,lunica cosa che le ventole(collegate ad un piedino PWM) non si spengono mai,ovvero a plafo spenta continuano a girare ai minimi regimi,come è possibile?
Lui mi dice che è normale,ma io credo che dipenda piu' che altro dal modello della ventola,
E' possibile?
Ho ha sbagliato lui qualcosa nella programmazione?
bisogna capire cosa dice il codice e come ha collegato l'hardware.
Arduino esegue cio che noi vogliamo. Io la ventola l'ho attaccata direttamente senza passare da arduino...quindi sempre accesa, in attesa smonti per ammodernamenti lei è li che va...
il codice in questo caso nulla puo fare.
cesarino.cv77
10-02-2014, 20:00
No no e collegata all'Arduino!
vBulletin® v3.8.9, Copyright ©: 2000-2025, Jelsoft Enterprises Ltd.
Traduzione italiana Team: vBulletin-italia.it |