Buonasera a tutti, mi sto divertendo con la realizzazione di una stazione meteo basata su Arduino UNO; bene la parte TX (a parte una prossima sostituzione di un DHT11), rilevo invece uno strano problema sulla parte RX (ancora da finire: ottimizzazione registrazioni, eliminazione String, ecc.).
Tutto funziona se alimentato tramite PC, se attacco invece un carica batterie NOKIA il programma non funziona anche se rilevo una tensione corretta sui vari VCC e GND.
Qualcuno sa spiegarmi cosa succede?
Allego schema Fritzig e programma.
Grazie + saluti
Enrico
#include <EEPROM.h>
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Time.h> //http://www.arduino.cc/playground/Code/Time
#include <Wire.h> //http://arduino.cc/en/Reference/Wire
#include <TimeLib.h>
// SD
#include <SD.h>
#include <SPI.h>
//HC-12
#include <VirtualWire.h>
#include <SoftwareSerial.h>
// Creazione oggetto SD
File file;
// Crea il collegamento HC-12
SoftwareSerial HC12(3, 2); // RX, TX
#include <PCF8574_HD44780_I2C.h>
// Address 0x27, 20 chars, 4 line display
PCF8574_HD44780_I2C lcd(0x27, 20, 4);
// Definizioni variabili
String X ;
int t_max;
int t_min;
int t;
int h;
int t_max_old;
int t_min_old;
int oldmyday;
#define countof(a) (sizeof(a) / sizeof(a[0]))
void setup(void)
{
HC12.begin(9600);
Serial.begin(9600);
setSyncProvider(RTC.get); // the function to get the time from the RTC
lcd.init(); // LCD Initialization
lcd.backlight(); // Backlight ON
Serial.println ("** Basato su LCD_RTC_Prova05_i2c - Arduino UNO **");
// leggo un valore sulla EEPROM
t_max_old = EEPROM.read(1);
t_min_old = EEPROM.read(2);
// Imposta la comunicazione SD
if (!SD.begin(10)) {
Serial.println("Errore SD");
}
}
void loop(void)
{
// Controlla la presenza della SD
int SD_OK;
if (!SD.begin(10)) {
Serial.println("SD non presente");
SD_OK = 0;
} else {
SD_OK = 1;
}
// imposta la comunicazione HC-12
if (HC12.available() ) {
X = HC12.readString();//read string
Serial.println(
X);
int value = X.toInt();
t = (value / 100) - 49;
h = (value - ((t + 49) * 100));
// Controlla temperatura max/min
if (t > t_max) {
t_max = t;
EEPROM.write(1, t_max);
}
if (t < t_min) {
t_min = t;
EEPROM.write(2, t_min);
}
// controllo se devo registrare su SD
if (SD_OK == 1) {
ctrwrite();
}
lcd.clear();
lcd.print(day());
lcd.setCursor(2, 0);
lcd.print("/");
lcd.setCursor(3, 0);
lcd.print(month());
lcd.setCursor(5, 0);
lcd.print("/");
lcd.setCursor(6, 0);
lcd.print(year());
lcd.setCursor(11, 0);
lcd.print(hour());
lcd.setCursor(13, 0);
lcd.print(":");
lcd.setCursor(14, 0);
if (minute() < 10) {
lcd.print("0");
}
lcd.print(minute());
lcd.setCursor(16, 0);
lcd.print(":");
lcd.setCursor(17, 0);
if (second() < 10) {
lcd.print("0");
}
lcd.print(second());
lcd.setCursor(0, 1); // Set the cursor to col 0, row 0
lcd.print("Temp.:" + String(t) + char(0xDF) + "- Umid.:" + String(h) + "%");
lcd.setCursor(0, 2); // Set the cursor to col 0, row 2
lcd.print("Oggi max: " + String(t_max) + " " + char(0xDF) + "C ");
lcd.setCursor(5, 3); // Set the cursor to col 5, row 3
lcd.print("min.: " + String(t_min) + " " + char(0xDF) + "C " );
delay(10);
}
// Scrivo la data/ora su LCD
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(day());
lcd.setCursor(2, 0);
lcd.print("/");
lcd.setCursor(3, 0);
lcd.print(month());
lcd.setCursor(5, 0);
lcd.print("/");
lcd.setCursor(6, 0);
lcd.print(year());
lcd.setCursor(11, 0);
lcd.print(hour());
lcd.setCursor(13, 0);
lcd.print(":");
lcd.setCursor(14, 0);
if (minute() < 10) {
lcd.print("0");
}
lcd.print(minute());
lcd.setCursor(16, 0);
lcd.print(":");
lcd.setCursor(17, 0);
if (second() < 10) {
lcd.print("0");
}
lcd.print(second());
delay (1000);
}
void ctrwrite() {
oldmyday = EEPROM.read(0);
if (day() != oldmyday) {
writeSD();
EEPROM.write(0, day());
delay (10);
}
}
void writeSD()
{
Serial.println("Apro SD");
// controllo se il file esiste
if (SD.exists("Valori.txt"))
{
file = SD.open("Valori.txt", FILE_WRITE);
} else {
// lo creo e inserisco la testata
file = SD.open("Valori.txt", FILE_WRITE);
file.write("Data");
file.write("/");
file.write("temp. max");
file.write("/");
file.write("temp. min");
file.write("\n" ); // vado a capo per dati
}
delay (50);
int newday = (day() - 1);
// scrivo la data
file.write(newday);
file.write(".");
file.write(month() );
file.write(".");
file.write(year() );
file.write("/");
// scrivo la temperatura max registrata
char newt_max[3];
snprintf_P( newt_max,
countof(newt_max),
PSTR("%02u"),
(t_max));
file.write(newt_max);
file.write("/");
// scrivo la temperatura min registrata
char newt_min[3];
snprintf_P( newt_min,
countof(newt_min),
PSTR("%02u"),
(t_min));
file.write(newt_min);
file.write("/");
// vado a capo per altri dati
file.write("\n" );
file.close();
Serial.println("chiudo SD");
// ripato con le temperatura max/min
t_max = t;
t_min = t;
// aggiungo 50 °C per evitare negativi e inserisco i valori sulla EEPROM
//********************* controllare su EEPROM
EEPROM.write(1, t_max);
EEPROM.write(2, t_min);
}
RX_StazioneMeteo.pdf (772 KB)