AcquaPortal Forum Acquario Dolce e Acquario Marino

AcquaPortal Forum Acquario Dolce e Acquario Marino (http://www.acquariofilia.biz/forum.php)
-   Fai da te marino (http://www.acquariofilia.biz/forumdisplay.php?f=60)
-   -   codice display e alba/tramonto arduino. eccolo! (http://www.acquariofilia.biz/showthread.php?t=332658)

superpozzy 11-11-2011 21:18

codice display e alba/tramonto arduino. eccolo!
 
visto che qualcuno me lo chiede in mp e se ne parla giusto qua in giro adesso, vi posto il codice alba/tramonto e display.

chiaramente:
1) dovete adattare i collegamenti al VOSTRO display, perchè non tutti funzionano allo stesso modo. questo è per schermi hitachi HD44780 e compatibili... il mio è 20x4
ho lasciato tutta la parte decrittiva per mia comodità. voi potete anche cancellarvela... ;-);
2) dovete avere un RTC;
3) è fatta per mia esigenza, quindi ha tre stringhe per le mie 3 tipologie di led: "progfreddo" sono i 20.000°K, "progcaldo" i 10.000°K e "progblu" i royal blu.
4) la stringa alba/tramonto ha segnato sopra l'orario che va da 00 (mezzanotte) a 23 (secondo voi?) e sotto le 3 stringhe con la PERCENTUALE di luminosità di quei led che varia in 60 minuti.
perciò se dalle 9 alle 10 la stringa dei led varia da 50 a 100, significa che in un'ora raggiunge il 100%.
se volete farlo in più tempo basta che allungate i tempi (es. ore 9 50%, ore 10 75%, ore 11 100%).

tutto quello che so l'ho scritto.
ora arrangiatevi! -28

ps: chiaramente lo sketch non visualizza HELLO WORLD come scritto.... ;-)



codice:

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>
#include <Time.h> 
#include <Wire.h> 
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

const int Button1 = 0;   
const int Button2 = 1; 
const int LedFreddo = 9, LedCaldo = 10, LedBlu = 11;

int posx=0,posy=1;

LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
String MenuArray[5][5]={{"Titolo 1"  ,"Titolo 2"  ,"Titolo 3"  ,"Titolo 4"  ,"Titolo 5"},
                        {"Submenu 1 1","Submenu 2 1","Submenu 3 1","Submenu 4 1","Submenu 5 1"},
                        {"Submenu 1 2","Submenu 2 2","Submenu 3 2","Submenu 4 2","Submenu 5 2"},
                        {"Submenu 1 3","Submenu 2 3","Submenu 3 3","Submenu 4 3","Submenu 5 3"},   
                        {"Submenu 1 4","Submenu 2 4","Submenu 3 4","Submenu 4 4","Submenu 5 4"} } ;

//                        00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20  21  22  23 
const int ProgFreddo[24]={  0,  0,  0,  0,  0,  1,  5, 30, 70,100,100,100,100,100,100,100,100,100, 40, 20, 10,  0,  0,  0};
const int ProgCaldo[24]= {  0,  0,  0,  0,  0,  0,  0,  3, 30, 70,100,100,100,100,100, 70,100,100,100, 70,  0,  0,  0,  0};
const int ProgBlu[24]=  {  4,  4,  4,  4,  4,  6, 15, 30, 50, 70,100,100, 80, 50, 50,100,100,100,100,100,100, 50,  4,  4};
                       
int OutFreddo, OutCaldo, OutBlu;

void setup() {
  Serial.begin(9600);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
  pinMode(LedFreddo, OUTPUT);
  pinMode(LedCaldo, OUTPUT);
  pinMode(LedBlu, OUTPUT);
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4);
  // Print a message to the LCD.
  setSyncProvider(RTC.get);  // the function to get the time from the RTC
}

void loop() {
  int i;
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):

  CalcolaLed();
  VisualizzaOra();
  delay(1000);
  // print the number of seconds since reset:
  lcd.clear();
}

void DisplayMenu() {

  if (!digitalRead(Button1)==HIGH) {
    posx++;
    if (posx>4) posx=0;
  }
  if (!digitalRead(Button2)==HIGH) {
    posy++;
    if (posy>4) posy=1;
  }

  lcd.setCursor(4,2) ;
  lcd.print(MenuArray[0][posx]);
  lcd.setCursor(4,3) ;
  lcd.print(MenuArray[posy][posx]); 
}

void VisualizzaOra(){
 
  lcd.setCursor(12,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());
}

void CalcolaLed() {
  int OraAttuale, OraFutura, Minuto, Differenza;
  float Incremento, Attuale, T1;
  OraAttuale= hour()%24;
  OraFutura = (OraAttuale+1)%24;
  Minuto=minute();
//--------------------------------------------------------------------------- 
  Differenza=ProgFreddo[OraFutura]-ProgFreddo[OraAttuale];
  Incremento=Differenza/60.0;
  Attuale=Incremento*Minuto+ProgFreddo[OraAttuale];
  OutFreddo= Attuale * 255 / 100 ;
  lcd.setCursor(0,0);
  lcd.print("F:");
  lcd.print((int)Attuale);
//--------------------------------------------------------------------------- 
  Differenza=ProgCaldo[OraFutura]-ProgCaldo[OraAttuale];
  Incremento=Differenza/60.0;
  Attuale=Incremento*Minuto+ProgCaldo[OraAttuale];
  OutCaldo= Attuale * 255 / 100 ;
  lcd.setCursor(0,1);
  lcd.print("C:");
  lcd.print((int)Attuale);
//--------------------------------------------------------------------------- 
  Differenza=ProgBlu[OraFutura]-ProgBlu[OraAttuale];
  Incremento=Differenza/60.0;
  Attuale=Incremento*Minuto+ProgBlu[OraAttuale];
  OutBlu= Attuale * 255 / 100 ;
  lcd.setCursor(0,2);
  lcd.print("B:");
  lcd.print((int)Attuale);
//---------------------------------------------------------------------------   
  analogWrite(LedFreddo, OutFreddo);
  analogWrite(LedCaldo, OutCaldo);
  analogWrite(LedBlu, OutBlu);

  T1=analogRead(A0)*0.49;
  lcd.setCursor(0,3);
  lcd.print("T:");
  lcd.print((int)T1);
}

pps: io ho usato mosfet per il pwm.

ppps: qua non me lo incolonna giusto, penso che nel programma di arduino lo faccia...

pppps: prima di dire che non funziona, controllate BENE i vostri collegamenti... -28

Ciccio66 11-11-2011 21:32

GrandeSimone...ma non ci capisco una mazza.....

Ovvio non ho l'arduino...ma ho Gino il facchino....

zebrasoma78 11-11-2011 21:33

Bravo simo!!!#70
Deduco che a te funzioni....
chiedo troppo per un video??? ( ovviamente dovresti stringere di molto i tempi...) ma era per capite se fa gli scatti tra un valore e l'altro....

ciauz!

superpozzy 11-11-2011 21:40

è questo.
è un po' vecchio e con i collegamenti ancora provvisori, ma si capisce...

sembra che sia montato e ci siano dei cambi frame, ma è il flash dei led che sballa il sensore della camera...

Clicca per vedere il video su YouTube Video

billykid591 12-11-2011 10:18

Quote:

Originariamente inviata da superpozzy (Messaggio 1061238083)
visto che qualcuno me lo chiede in mp e se ne parla giusto qua in giro adesso, vi posto il codice alba/tramonto e display.

chiaramente:
1) dovete adattare i collegamenti al VOSTRO display, perchè non tutti funzionano allo stesso modo. questo è per schermi hitachi HD44780 e compatibili... il mio è 20x4
ho lasciato tutta la parte decrittiva per mia comodità. voi potete anche cancellarvela... ;-);
2) dovete avere un RTC;
3) è fatta per mia esigenza, quindi ha tre stringhe per le mie 3 tipologie di led: "progfreddo" sono i 20.000°K, "progcaldo" i 10.000°K e "progblu" i royal blu.
4) la stringa alba/tramonto ha segnato sopra l'orario che va da 00 (mezzanotte) a 23 (secondo voi?) e sotto le 3 stringhe con la PERCENTUALE di luminosità di quei led che varia in 60 minuti.
perciò se dalle 9 alle 10 la stringa dei led varia da 50 a 100, significa che in un'ora raggiunge il 100%.
se volete farlo in più tempo basta che allungate i tempi (es. ore 9 50%, ore 10 75%, ore 11 100%).

tutto quello che so l'ho scritto.
ora arrangiatevi! -28

ps: chiaramente lo sketch non visualizza HELLO WORLD come scritto.... ;-)



codice:

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>
#include <Time.h> 
#include <Wire.h> 
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

const int Button1 = 0;   
const int Button2 = 1; 
const int LedFreddo = 9, LedCaldo = 10, LedBlu = 11;

int posx=0,posy=1;

LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
String MenuArray[5][5]={{"Titolo 1"  ,"Titolo 2"  ,"Titolo 3"  ,"Titolo 4"  ,"Titolo 5"},
                        {"Submenu 1 1","Submenu 2 1","Submenu 3 1","Submenu 4 1","Submenu 5 1"},
                        {"Submenu 1 2","Submenu 2 2","Submenu 3 2","Submenu 4 2","Submenu 5 2"},
                        {"Submenu 1 3","Submenu 2 3","Submenu 3 3","Submenu 4 3","Submenu 5 3"},   
                        {"Submenu 1 4","Submenu 2 4","Submenu 3 4","Submenu 4 4","Submenu 5 4"} } ;

//                        00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20  21  22  23 
const int ProgFreddo[24]={  0,  0,  0,  0,  0,  1,  5, 30, 70,100,100,100,100,100,100,100,100,100, 40, 20, 10,  0,  0,  0};
const int ProgCaldo[24]= {  0,  0,  0,  0,  0,  0,  0,  3, 30, 70,100,100,100,100,100, 70,100,100,100, 70,  0,  0,  0,  0};
const int ProgBlu[24]=  {  4,  4,  4,  4,  4,  6, 15, 30, 50, 70,100,100, 80, 50, 50,100,100,100,100,100,100, 50,  4,  4};
                       
int OutFreddo, OutCaldo, OutBlu;

void setup() {
  Serial.begin(9600);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
  pinMode(LedFreddo, OUTPUT);
  pinMode(LedCaldo, OUTPUT);
  pinMode(LedBlu, OUTPUT);
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4);
  // Print a message to the LCD.
  setSyncProvider(RTC.get);  // the function to get the time from the RTC
}

void loop() {
  int i;
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):

  CalcolaLed();
  VisualizzaOra();
  delay(1000);
  // print the number of seconds since reset:
  lcd.clear();
}

void DisplayMenu() {

  if (!digitalRead(Button1)==HIGH) {
    posx++;
    if (posx>4) posx=0;
  }
  if (!digitalRead(Button2)==HIGH) {
    posy++;
    if (posy>4) posy=1;
  }

  lcd.setCursor(4,2) ;
  lcd.print(MenuArray[0][posx]);
  lcd.setCursor(4,3) ;
  lcd.print(MenuArray[posy][posx]); 
}

void VisualizzaOra(){
 
  lcd.setCursor(12,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());
}

void CalcolaLed() {
  int OraAttuale, OraFutura, Minuto, Differenza;
  float Incremento, Attuale, T1;
  OraAttuale= hour()%24;
  OraFutura = (OraAttuale+1)%24;
  Minuto=minute();
//--------------------------------------------------------------------------- 
  Differenza=ProgFreddo[OraFutura]-ProgFreddo[OraAttuale];
  Incremento=Differenza/60.0;
  Attuale=Incremento*Minuto+ProgFreddo[OraAttuale];
  OutFreddo= Attuale * 255 / 100 ;
  lcd.setCursor(0,0);
  lcd.print("F:");
  lcd.print((int)Attuale);
//--------------------------------------------------------------------------- 
  Differenza=ProgCaldo[OraFutura]-ProgCaldo[OraAttuale];
  Incremento=Differenza/60.0;
  Attuale=Incremento*Minuto+ProgCaldo[OraAttuale];
  OutCaldo= Attuale * 255 / 100 ;
  lcd.setCursor(0,1);
  lcd.print("C:");
  lcd.print((int)Attuale);
//--------------------------------------------------------------------------- 
  Differenza=ProgBlu[OraFutura]-ProgBlu[OraAttuale];
  Incremento=Differenza/60.0;
  Attuale=Incremento*Minuto+ProgBlu[OraAttuale];
  OutBlu= Attuale * 255 / 100 ;
  lcd.setCursor(0,2);
  lcd.print("B:");
  lcd.print((int)Attuale);
//---------------------------------------------------------------------------   
  analogWrite(LedFreddo, OutFreddo);
  analogWrite(LedCaldo, OutCaldo);
  analogWrite(LedBlu, OutBlu);

  T1=analogRead(A0)*0.49;
  lcd.setCursor(0,3);
  lcd.print("T:");
  lcd.print((int)T1);
}

pps: io ho usato mosfet per il pwm.

ppps: qua non me lo incolonna giusto, penso che nel programma di arduino lo faccia...

pppps: prima di dire che non funziona, controllate BENE i vostri collegamenti... -28

Un lavoro interessante e codice snello però ho due critiche (senza offesa si intende) da farti la prima riguarda l'uso del delay (di 1 secondo) nel Loop...così facendo blocchi il programma e l'uso dei tasti menu viene ritardato.......secondo non mi piace l'uso degli array predefiniti per l'alba tramonto..non puoi da menu scegliere i tempi di accensione spegnimento e..con passi predefiniti ho l'impressione che la dimmerazione venga scattosa....potevi sfruttare di più l'RTC........appena posso posterò il codice che sto usando io per la prossima plafo che sto relaizzando (anche se è per il dolce).....è preso in parte da altre realizzazioni (vedi typhoon)...e modificato....di contro rispetto al tuo è decisamente molto più lungo anche se più completo.

superpozzy 12-11-2011 11:24

si, infatti io ho fatto il più semplice possibile. era, diciamo, più che altro un programmino provvisorio per vedere su funzionava il tutto...
e poi non ho avuto più voglia di modificarlo... :-))

comunque posso dirti che perlomeno non è scattoso...

ps: non l'ho fatto io, eh! ma mio cugino ing. io non c'ho capito un caxxo! :-D

il mio problema più grosso è non far sciogliere il mosfet, a causa dei 4/5A che ci passano dentro....

allora aspetto il tuo per provarlo! -28

billykid591 12-11-2011 15:10

Quote:

Originariamente inviata da superpozzy (Messaggio 1061238867)
si, infatti io ho fatto il più semplice possibile. era, diciamo, più che altro un programmino provvisorio per vedere su funzionava il tutto...
e poi non ho avuto più voglia di modificarlo... :-))

comunque posso dirti che perlomeno non è scattoso...

ps: non l'ho fatto io, eh! ma mio cugino ing. io non c'ho capito un caxxo! :-D

il mio problema più grosso è non far sciogliere il mosfet, a causa dei 4/5A che ci passano dentro....

allora aspetto il tuo per provarlo! -28

Il mio è fatto per pilotare dei driver appositi con ingresso dimmerabile PWM...ciò non toglie che può essere collegato a dei mosfet

superpozzy 12-11-2011 15:35

mi fai vedere i driver?

billykid591 12-11-2011 18:27

Quote:

Originariamente inviata da superpozzy (Messaggio 1061239255)
mi fai vedere i driver?

sono dei semplici driver comprati su ebay da un venditore Cinese (un classico)..sono da 350 ma e 700 ma (ma ci sono anche altri tipi)..puoi comandare fino a 6 7 led (da 1 o 3 w) per ognuno.....dipende dall'alimentazione (io li alimento a 24 volt)

superpozzy 12-11-2011 18:39

eh, io li ho da 10w i led...
va beh, dai, aspetto il tuo codice!


Tutti gli orari sono GMT +2. Attualmente sono le 01:03.

Powered by vBulletin versione 3.8.9
Copyright ©: 2000 - 2024, Jelsoft Enterprises Ltd.
Traduzione italiana Team: AcquaPortal
User Alert System provided by Advanced User Tagging v3.2.5 Patch Level 2 (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Copyright Zero Pixel Srl

Page generated in 0,13277 seconds with 14 queries