Alimentazione Arduino UNO (risolto - saldatura deteriorata)

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)