Salve a tutti, avrei bisogno di un'aiuto urgente. Ho creato la Ciabatta domotica, un progetto di Mauro Alfieri.
sul display dovrebbe uscirmi la data e l'ora ma invece mi esce solo ciò che riportato in foto.
Questo è il programma seguente. Cos'è che devo modificare?
#include <SoftwareSerial.h> //includi tutte le librerie necessarie al funzionamento della ciabatta arduino pro. In particolare la Wire, l’RTC e la LiquidCrystal_i2C;
// servono per i rispettivi moduli, mentre al SoftwareSerial ti serve per comunicare con il modulo BT;
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
/*********************************************************************/
#define BT_TX_PIN 7 //definisce i due pin Tx ed Rx al quale è collegato il modulo HC-06 (BT);
#define BT_RX_PIN 8
/*********************************************************************/
SoftwareSerial mySerial(BT_TX_PIN, BT_RX_PIN); //crea l’istanza dell’oggetto SoftwareSerial che userà per comunicare con il modulo bluetooth;
RTC_DS1307 RTC; // crea l’istanza dell’oggetto RTC che serve per comunicare con l’RTC;
LiquidCrystal_I2C lcd(0x27,20,4); //crea l’istanza dell’oggetto LiquidCrystal che serve per inviare i messaggi sul display;
/*********************************************************************/
char lettera; //crea le variabili di buffer, per scrivere sul display, e dei pin a cui sono connessi i relé;
char buffer[16];
byte rele1=2;
byte rele2=3;
byte rele3=4;
byte rele4=5;
int previousSec = 0; //definisci la variabile globale di tipo int che userà per tener traccia del passare del tempo per aggiornare l’ora sul display;
uint8_t SPENTO[8] = {0x0E, 0x11, 0x11, 0x11, 0x0A, 0x0E, 0x0E, 0x04,}; //definisci due “custom character” ossia due caratteri disegnati
uint8_t ACCESO[8] = {0x0E, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x04,}; //, uno rappresenta una lampadina accesa ed uno quella spenta;
/*********************************************************************/
void setup() {
Serial.begin(9600); //inizializza tutte le istanze verso Seriale, mySerial, Rtc e Lcd;
mySerial.begin(9600);
Wire.begin();
RTC.begin();
lcd.init();
lcd.backlight(); // invia il comando di accensione della retroilluminazione del display;
pinMode(rele1, OUTPUT); //imposta i pin connessi ai rele come OUTPUT e porta a HIGH le rispettive uscite;
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
digitalWrite(rele3, HIGH);
digitalWrite(rele4, HIGH);
if (! RTC.isrunning()) { //servono a impostare l’orario dell’RTC la prima volta che lo colleghi ad arduino;
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(DATE, TIME));
}
lcd.createChar( 0,SPENTO ); //definisci i due caratteri speciali, disegnati da te alle linee 40-41, come indici 0 ed 1 da usare nello sketch;
lcd.createChar( 1,ACCESO );
lcd.setCursor ( 0,0 );
lcd.print("Ciabatta BT v.2"); //scrivi sulla prima linea del display il testo “Ciabatta BT v.2” e attendi 2 secondi prima di pulire il display con il metodo clear();
delay(2000);
lcd.clear();
lcd.setCursor( 12,0 ); //imposta il cursore nella posizione 12, della prima linea, e disegna i 4 caratteri personalizzati;
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
}
/*********************************************************************/
void loop() {
DateTime now = RTC.now(); // richiedi all’RTC la data e l’ora corrente;
if(now.second() != previousSec) { //verifica che il secondo corrente “now.second()” sia diverso da quello precedentemente visualizzato e memorizzato nella variabile previousSec;
lcd.setCursor( 0,0 ); //quando il tempo trascorso tra l’ultimo aggiornamento dell’orario è differente esegui l’aggiornamento;
sprintf(buffer,"%02d:%02d:%02d",now.hour(),now.minute(),now.second()); //dell’orario sul display. In questo modo ottieni solo gli aggiornamenti continui del display al cambio di ogni;
lcd.print( buffer ); //secondo;
previousSec = now.second(); //assegna il secondo corrente, ossia quello appena visualizzato alla variabile previousSec;
}
if(mySerial.available()) { //quando arriva un carattere sul buffer seriale bluetooth, quindi dal cellulare, esegui le linee successive;
lettera = mySerial.read(); //leggi la prima lettera presente nel buffer seriale;
switch (lettera) { //se la lettera ricevuta è “A” allora porta l’usicta corrispondente al rele 1 a LOW, scrivi sul monitor seriale “relay 1 on” e richiama la funzione;
case 'A': //viewSocket() passandole il numero di relay e lo stato: in questo caso true ( acceso );
digitalWrite(rele1, LOW);
Serial.println("relay 1 on");
viewSocket( 1,true );
break;
case 'S': // esegui le medesime operazioni viste per il passaggio 100-104 per ciascuna delle lettere ricevute dal seriale bluetooth della ciabatta arduino pro;
digitalWrite(rele1, HIGH);
Serial.println("relay 1 off");
viewSocket( 1,false );
break;
case 'Q':
digitalWrite(rele2, LOW);
Serial.println("relay 2 on");
viewSocket( 2,true );
break;
case 'W':
digitalWrite(rele2, HIGH);
Serial.println("relay 2 off");
viewSocket( 2,false );
break;
case 'E':
digitalWrite(rele3, LOW);
Serial.println("relay 3 on");
viewSocket( 3,true );
break;
case 'R':
digitalWrite(rele3, HIGH);
Serial.println("relay 3 off");
viewSocket( 3,false );
break;
case 'T':
digitalWrite(rele4, LOW);
Serial.println("relay 4 on");
viewSocket( 4,true );
break;
case 'Y':
digitalWrite(rele4, HIGH);
Serial.println("relay 4 off");
viewSocket( 4,false );
break;
}
}
}
void viewSocket(byte num, boolean status) { //definisci la funzione viewSocket() con i due parametri attesi: num: il numero di relè coinvolto e status: lo stato del relè: acceso/spento ( true/false)
lcd.setCursor( ( 11+num ),0 ); // calcola la posizione X del cursore come (11+num) ossia 12 per il relè 1, 13 per il 2, ecc… e posiziona il cursore;
if ( status ) { //se “status” è true procedi con la visualizzazione della luce accesa e del messaggio sulla seconda linea;
lcd.write(1); //essendo il relay acceso ( status = true ) visualizza la lampadina accesa ( carattere speciale 1 );
lcd.setCursor ( 0,1 ); //essendo il relay acceso ( status = true ) visualizza la lampadina accesa ( carattere speciale 1 );
lcd.print("Acceso rele "); //scrivi la frase “Acceso rele “;
} else {
lcd.write(0); // esegui le stesse operazioni delle linee "status 1" ma con simbolo “0” e scrivendo “Spento rele “;
lcd.setCursor ( 0,1 );
lcd.print("Spento rele ");
}
lcd.setCursor ( 12,1 ); // posizionati al carattere 12 della seconda riga e scrivi il valore di num ( 1,2,3 o 4 );
lcd.print(num);
}