Strano problema di alimentazione.....davvero strano

Salve gente,

ho davvero uno stranissimo problema…prima vi spiego cosa ho e poi il problema…Arduino 2009 alimentato tramite un trasfo a 12v 10A la cui uscita è regoltata dal IC7805 per avere anche i 5v ai quali ho connesso una shield con 8 relay…la shield è pilotata da un 74HC595…di contorno ho anche una shileld SD.

il problema:
Se alimento il Arduino tramite jack fornendogli i 5v provenienti dal 7805 e collegando dopo pochi secondi l’ USB (perche se accendo il tutto contemporaneamente si verifica la stranezza) i vari relè vengono accesi e spenti come da programma, se invece tolgo l’ usb e lascio la sola alimentazione a 5v (jack nero) il relay n.1 una volta acceso non si spegne piu…mentre gli altri continuano as accendersi e spegnersi come da programma.

Praticamente se uso 'alimentazione tramite jack 5v + USB tutto funziona regolarmente altrimenti nada !!!

ho provato ad alimentare Arduino tramite Vin ma non cambia niente.

Avete qualche idea

detta cosi' e' strana davvero, visto che non esistono i fantasmi deve esserci qualcosa di nascosto.
oltre ad un controllo ai gnd in comune, credo tu debba postare delle foto ed uno schema elettrico

per pilotare gli 8 relay mi servo come ho detto dello shift register, impostando un valore iniziale b1= 0b11111111 (tutti i led dei relay spenti) e per attivare e disattivare il singolo bit uso nell'ordine bitClear(b1,x) e bitSet(b1,x) ed alla fine del ciclo :

digitalWrite(latchPin,LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, b1);
  digitalWrite(latchPin, HIGH);

Allora sto notando che :

  • se accendo il tutto i relay impazziscono e dopo pochi secondi inserisco l'usb Arduino si resetta ed inizia a funzionare regolarmente.
  • se invece di usare bitClear e bitSet passo il valore ad es. b1= 0b11111110 per accendere e b1= 0b11111111 per spegnere il relativo pin 0 la STRANEZZA non si verifica piu

sono sempre piu perplesso

Sketch completo e schema elettrico aiuterebbero.

questo è lo sketch:

#include "Wire.h"
#include <SD.h>
#include <DHT.h>

#define DS1307_ADDRESS 0x68
#define DHTPIN3 A0
#define DHTPIN2 A2
#define DHTPIN1 A1
#define DHTTYPE1 DHT11   // DHT 11
#define DHTTYPE2 DHT22   // DHT 22  (AM2302)

DHT dht1(DHTPIN1, DHTTYPE1);
DHT dht2(DHTPIN2, DHTTYPE1);
DHT dht3(DHTPIN3, DHTTYPE2);

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display

File myFile;

int latchPin =9;
int dataPin = 10;
int clockPin = 8;
int x =0;

//ShiftReg. 76543210
byte b1 = 0b11111111 ; 
byte b2 = 0b00000000 ; 

void setup(){
  Wire.begin();
  //Serial.begin(9600);
  //setDateTime(); //MUST CONFIGURE IN FUNCTION
  lcd.init();
  lcd.backlight();
  pinMode(latchPin,OUTPUT);
  pinMode(dataPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  lcd.setCursor(0,0);
  lcd.print(" **SysProg v1.02**");
  lcd.setCursor(0,1);
  lcd.print(" Starting System....");
  if (!SD.begin(4)) {
    lcd.setCursor(0,1);
    lcd.print(" SD Shield ERROR !!!");
    return;
  } else {
  lcd.setCursor(0,1);
  lcd.print("    SD Shield ON    "); }
  
   dht1.begin();
   dht2.begin();
   dht3.begin();
   delay(1000);
   lcd.clear();
}

void loop(){
  
  //lcd.init();
  lcd.setCursor(0,0);
  lcd.print(" **SysProg System**");
  lcd.setCursor(2,2);
  String dtime = printDate();
  lcd.print(dtime);
  delay(1000);
  lcd.clear();
  
   int h1 = dht1.readHumidity();
   int t1 = dht1.readTemperature();
   int h2 = dht2.readHumidity();
   int t2 = dht2.readTemperature();
   int h3 = dht3.readHumidity();
   int t3 = dht3.readTemperature();

   int Hmedia = (h1+h2+h3)/3;
   int Tmedia = (t1+t2+t3)/3;
   
   int tsec=printSec();
       
  if (x==0) b1=0b11111110; 
  if (x==1) b1=0b11111101; 
  if (x==2) b1=0b11111011; 
  if (x==3) b1=0b11110111; 
  if (x==4) b1=0b11101111; 
  if (x==5) b1=0b11011111; 
  if (x==6) b1=0b10111111; 
  if (x==7) b1=0b01111111; 
  
  lcd.setCursor(0,2);
  lcd.print(x);
  x++;
  if (x==8) x=0;
  delay(1000);
   lcd.clear();
   
   
   File dataFile = SD.open("log.txt", FILE_WRITE);
    
    if (dataFile) {
      dataFile.println(dtime);
      dataFile.close();
    } else {
      lcd.println("ERROR open log.txt");
      delay(1000);
    }
   
   lcd.setCursor(0,0);
   lcd.print("Temp ");
   lcd.print(Tmedia);
   lcd.print("C ");
   lcd.print("Humid ");
   lcd.print(Hmedia);
   lcd.print("%RH");
   lcd.setCursor(0,1);
   lcd.print(" 1# T: ");
   lcd.print(t1);
   lcd.print("C ");
   lcd.print("H: ");
   lcd.print(h1);
   lcd.print("%RH");
   lcd.setCursor(0,2);
   lcd.print(" 2# T: ");
   lcd.print(t2);
   lcd.print("C ");
   lcd.print("H: ");
   lcd.print(h2);
   lcd.print("%RH");
   lcd.setCursor(0,3);
   lcd.print(" 3# T: ");
   lcd.print(t3);
   lcd.print("C ");
   lcd.print("H: ");
   lcd.print(h3);
   lcd.print("%RH");
   
   delay(2000);

   digitalWrite(latchPin,LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, b1);
   shiftOut(dataPin, clockPin, LSBFIRST, b2);
   digitalWrite(latchPin, HIGH);

   lcd.clear();
   
}



//************ INIZIO codice DS1307 *****************

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

String printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  String dataora = "";

  //print format date ES.  3/1/11 23:59:59
  dataora +=monthDay;
  dataora +="/";  
  dataora +=month;
  dataora +="/";
  dataora +=year;
  dataora +=" ";
  dataora +=hour;
  dataora +=":";
  dataora +=minute;
  dataora +=":";
  dataora +=second;
  
  return dataora;
  
}

int printSec(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int second = bcdToDec(Wire.read());
  return second;
  
}
//************ FINE codice DS1307 *****************

regolatore di tensione

Sul connettore nero di alimentazione e su Vin devi dare una tensione di almeno 7 e ripettivamente 6,5V perche lo stabilizzatore funzioni.
Se NON usi la USB puoi collegare i 5V su gnd e il pin +5V
Ciao Uwe

Non avevo fatto caso che i 5v li applica al connettore, e non va bene

miseria !!! che cavolo di ingenuità non ci posso credere.......putroppo ho risolto la stranezza ma sembra in fila come le salsicce :grin: ora succede che dopo 10-15min di attività impazzisce il mio LCD passandomi caratteri strani e porzioni dei dati che dovrebbe visualizzare come da programma.

Sembra però che il tutto continui a funzionare, quindi i relay si accendono e spengono a dovere, scrive regolarmente sulla SD ma lo schermo mi stampa dei caratteri stranissimi.......lcd è pilotato dal PCF8574.

credevo fosse un problema di RAM visto che stampavo molto sul lcd, ho quindi provato a ridurre i print e soprattuto uso la sintassi lcd.print(F("testo da stampare"))

ma niente non è servito..... :~

Potrebbe essere un problema di RAM esaurita. Succede molto spesso scrivendo su LCD un sacco di stringhe.

Sostituisci tutto quello che è così:

lcd.print(" SD Shield ERROR !!!");

così:

lcd.print(F(" SD Shield ERROR !!!"));

Attenzione. La funzione F(), che legge i dati direttamente dalla Flash del microcontrollore senza prima copiarli nella RAM, funziona SOLO con le stringhe racchiuse da "" e non con variabili. Quindi NON puoi fare lcd.print(F(miaVar)); //ERRORE!!

leo, non lo aveva giá provato?

Un altro candidato per riempire la RAM sono i String. Prova a non usarli

Al posto di

String dtime = printDate();
lcd.print(dtime);

passa alla funzione la posizione del cursore e fa stampare la data/ora dalla funzione chiamata.

Ciao Uwe

gia fatto....putroppo.......l'ho evidenziato ora sopra

riducendo ancora i print sul lcd.....grrrrrrrr.......e riducendo i dati da far scrivere sulla SD sono arrivato a non far comparire i caratteri strani, ma putroppo si blocca su una videata e li rimane ......mentre sotto tutto il resto va

ad ogni ciclo resetto l' UNICA String con dtime =""; alla quale ora durante il ciclo faccio accodare i dati da passare alla SD, con tanti dtime += "testo da aggiungere";

ora voglio provare ad adattare il tutto per usare sprintf() vediamo.....anche se oramai ci provero domani a ri-ri-ri-modificare il codice.

dacci il codice delle prove.

Non usare proprio le stringhe perché la memoria usata non viene liberata.

Ciao Uwe

Usa le stringhe String, solo dentro un blocco dove stampi, cioè

void loop()
{
     // myString ancora non esiste
    {
        String myString("stampami");
        // myString ora esiste 
        lcd,print(myString);
    }
    // myString non esiste, è stata distrutta all'uscita del blocco precedente. 

}

Ovviamente la creazione di oggetti e la loro distruzione comporta un tempo di computazione che deve essere valutato
così da decidere se è accettabile o meno.

PS: se String ha un problema interno di cui non conosco allora è possibile che parte della memoria non venga liberata
all'uscita del blocco di codice {}.

Ciao.

Non afferro la necessitá di usare una stringa per poi stamparla. Non puoi stampare i vari pezzi direttament sul LCD?

Ciao Uwe

uwefed:
Non afferro la necessitá di usare una stringa per poi stamparla. Non puoi stampare i vari pezzi direttament sul LCD?

Ciao Uwe

Infatto non ho detto di usare String per forza, ma se deve farlo e si trova la comodità per farlo e siccome può tornare utile anche con gli array di stringhe e con qualunque oggetto temporaneo, ho dato il consiglio su come risolvere. Ovviamente se l'oggeto non è temporaneo e se un const char * va messo in flash.

Es, potrebbe facilmente concatenare più const char * convertendoli in String e su questi usare l'operatore "+", se il tempo
per creare questi oggetti temporanei è compatibile con l'applicazione non vedo perchè non si debba fare.

Però è vero che usare String può esaurire la memoria a disposizione, cosa che avviene per qualunque oggetto di dimensioni non banali come un char.

Ciao.

Uwe, lui ha pubblicato uno sketch dove non usava la funzione F(), alle 22 e qualcosa gli ho suggerito di farlo. Alle 22:58 lui ha modificato il suo post dicendo di usare la funzione F().
Se tronicman mi mischia le carte in tavola non è colpa mia :stuck_out_tongue_closed_eyes:

leo, ho modificato il post per evidenziare proprio il fatto che usavo la funzione F(),perche magari come nel tuo caso poteva sfuggire alla vista…cmq non importa figuriamoci posso aver fatto qualche arrosto io

questo lo sketch aggiornato…ho postato la prima versione che credevo facesse sbarellare i relay e risolto quello ho proseguito nella compilazione completandolo…ora è quello definitivo

#include "Wire.h"
#include <SD.h>
#include <DHT.h>

#define DS1307_ADDRESS 0x68
#define DHTPIN3 A0
#define DHTPIN2 A2
#define DHTPIN1 A1
#define DHTTYPE1 DHT11   // DHT 11
#define DHTTYPE2 DHT22   // DHT 22  (AM2302)

DHT dht1(DHTPIN1, DHTTYPE1);
DHT dht2(DHTPIN2, DHTTYPE1);
DHT dht3(DHTPIN3, DHTTYPE2);

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display

File myFile;

int latchPin =9;
int dataPin = 10;
int clockPin = 8;

//ShiftReg. 76543210
byte b1 = 0b11111111 ; 
byte b2 = 0b00000000 ; 

void setup(){
  Wire.begin();
  //Serial.begin(9600);
  //setDateTime(); //MUST CONFIGURE IN FUNCTION
  lcd.init();
  lcd.backlight();
  pinMode(latchPin,OUTPUT);
  pinMode(dataPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  lcd.setCursor(0,0);
  lcd.print(F(" **SysProg v1.02**"));
  lcd.setCursor(0,1);
  lcd.print(F(" Starting System...."));
  if (!SD.begin(4)) {
    lcd.setCursor(0,1);
    lcd.print(F(" SD Shield ERROR !!!"));
    return;
  } else {
  lcd.setCursor(0,1);
  lcd.print(F("    SD Shield ON    ")); }
  
   dht1.begin();
   dht2.begin();
   dht3.begin();
   delay(1000);
   lcd.clear();
}

void loop(){
  
  lcd.setCursor(0,0);
  lcd.print(F(" **SysProg System**"));
  lcd.setCursor(2,2);
  String dtime ="";
  dtime += printDate();
  lcd.print(dtime);

  delay(1000);

   int h1 = dht1.readHumidity();
   int t1 = dht1.readTemperature();
   int h2 = dht2.readHumidity();
   int t2 = dht2.readTemperature();
   int h3 = dht3.readHumidity();
   int t3 = dht3.readTemperature();
   int Tmedia, Hmedia;
   
   if (t1 < 1 || !isnan(t1)){ Tmedia = (t2+t3)/2;}
   else if (t2 < 1 || !isnan(t2)) {Tmedia = (t1+t3)/2;}
   else if (t3  <1 || !isnan(t3)) {Tmedia = (t2+t1)/2;}
    else  {Tmedia = (t1+t2+t3)/3;}
    
   if (h1 < 1 || !isnan(h1)){ Hmedia = (h2+h3)/2;}
   else if (h2 < 1 || !isnan(h2)) { Hmedia = (h1+h3)/2;}
   else if (h3 < 1 || !isnan(h3)) {Hmedia = (h2+h1)/2;}
    else { Hmedia = (h1+h2+h3)/3;}
    
   int tsec=printSec();
   int tmin=printMin();
   
   lcd.setCursor(0,0);
   lcd.print(F(" *Tm: "));
   lcd.print(Tmedia);
   lcd.print(F("C  "));
   lcd.print(F("*Hm: "));
   lcd.print(Hmedia);
   lcd.print(F("% "));
   lcd.setCursor(0,1);
   lcd.print(F("  T1: "));
   lcd.print(t1);
   lcd.print(F("C   "));
   lcd.print(F("H1: "));
   lcd.print(h1);
   lcd.print(F("% "));
   lcd.setCursor(0,2);
   lcd.print(F("  T2: "));
   lcd.print(t2);
   lcd.print(F("C   "));
   lcd.print(F("H2: "));
   lcd.print(h2);
   lcd.print(F("% "));
   lcd.setCursor(0,3);
   lcd.print(F("  T3: "));
   lcd.print(t3);
   lcd.print(F("C   "));
   lcd.print(F("H3: "));
   lcd.print(h3);
   lcd.print(F("% "));
   
   dtime += "-";
   dtime += Tmedia;
   dtime += "-";
   dtime += t1;
   dtime += "-";
   dtime += t2;
   dtime += "-";
   dtime += t3;
   dtime += "-";
   dtime += Hmedia;
   dtime += "-";
   dtime += h1;
   dtime += "-";
   dtime += h2;
   dtime += "-";
   dtime += h3;
   
   delay(3000);
   lcd.clear();
        
   if (Tmedia < 22) 
        { bitClear(b1,5); 
          lcd.setCursor(0,0);
          lcd.print(F("Temperatura....BASSA"));
          dtime += "-Temp. BASSA";
        } else {
          bitSet(b1,5); }
   if (Tmedia > 32) 
        { bitClear(b1,0); 
          bitClear(b1,1);
          bitClear(b1,2);
          bitClear(b1,3);
          lcd.setCursor(0,0);
          lcd.print(F("Temperatura.....ALTA"));
          dtime += "-Temp. ALTA";
        } else {
          bitSet(b1,0);
          bitSet(b1,1);
          bitSet(b1,2);
          bitSet(b1,3);}
          
   if (Hmedia < 75) 
        { bitClear(b1,6);
          bitClear(b1,4);  
          lcd.setCursor(0,1);
          lcd.print(F("Umidita........BASSA"));
          dtime += "-Umid. BASSA";
        } else {
          bitSet(b1,6);
          bitSet(b1,4); }       
   if (Hmedia > 95) 
        { bitClear(b1,2); //top fan
          bitClear(b1,0); //front 2
          bitClear(b1,1); //front
          lcd.setCursor(0,1);
          lcd.print(F("Umidita.........ALTA"));
          dtime += "-Umid. ALTA";
        } else {
          bitSet(b1,2); 
          bitSet(b1,1);
          bitSet(b1,1);}
    
    
    if (tmin < 8) 
      { bitClear(b1,3); 
        bitClear(b1,2);
        lcd.setCursor(0,2);
        lcd.print(F("Ricambio Aqua.....ON"));
        dtime += "-Ric. ACQUA";}
        
    if (tsec < 8) 
      { bitClear(b1,0); 
        bitClear(b1,1); 
        lcd.setCursor(0,3);
        lcd.print(F("Effetto Vortice...ON"));
        dtime += "-Eff. VORTICE";}
    
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, b1);
    shiftOut(dataPin, clockPin, LSBFIRST, b2);
    digitalWrite(latchPin, HIGH);     
    delay(2000);
   
 if (tsec < 5) {
   File dataFile = SD.open("log.txt", FILE_WRITE);
    
    if (dataFile) {
      dataFile.println(dtime);
      dataFile.close();
    } else {
      lcd.println(F("ERROR open log.txt"));
      delay(1000);
    }
  }
  
  lcd.clear();
}



//************ INIZIO codice DS1307 *****************
void setDateTime(){

  byte second =      16; //0-59
  byte minute =      22; //0-59
  byte hour =        23; //0-23
  byte weekDay =     4; //1-7
  byte monthDay =    23; //1-31
  byte month =       5; //1-12
  byte year  =       13; //0-99

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0); //stop Oscillator

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(0); //start 

  Wire.endTransmission();

}

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

String printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  String dataora = "";

  //print format date ES.  3/1/11 23:59:59
  dataora +=monthDay;
  dataora +="/";  
  dataora +=month;
  dataora +="/";
  dataora +=year;
  dataora +=" ";
  dataora +=hour;
  dataora +=":";
  dataora +=minute;
  dataora +=":";
  dataora +=second;
  
  return dataora;
  
}

int printSec(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  return second;
  
}

int printMin(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  return minute;
  
}
//************ FINE codice DS1307 *****************

grazie a tutti per il vostro fondamentale supporto

ancora grazie

sto provando con

char array[20];
char datiSD;

   array[0] =  Serial.print(printDate()); //se scrivo array[0] =  printDate(); mi restituisce errore
   array[1]= Tmedia;
   array[2]= t1;
   array[3]= t2;
   array[4]= t3;
   array[5]= Hmedia;
   array[6]= h1;
   array[7]= h2;
   array[8]= h3;

 for(int i=0;i<20;i++){ datiSD += array[i]; }  

  Serial.print(datiSD); //lo stampo sulla seriale et voilà vedo tutto
 
   File dataFile = SD.open("log.txt", FILE_WRITE);
    
    if (dataFile) {
      dataFile.println(datiSD); //putroppo qui scrive solo caratteri strani
      dataFile.close();
    } else {
      lcd.println(F("ERROR open log.txt"));
      delay(1000);
    }

ma come vedete dai commenti nel codice…non mi scrive sulla sd…e quindi non posso provare se dopo i 10-15min si blocca lcd in una schemata (ed il resto sotto continua correttamente)

Mi sembra che la SD voglia nomi col percorso completo riferito a root, per cui “log.txt” non va bene, deve essere “/log.txt”

leo72:
Mi sembra che la SD voglia nomi col percorso completo riferito a root, per cui "log.txt" non va bene, deve essere "/log.txt"

grazie leo......ma fino ad ora ha sempre funzionato......solo ora che ho eliminato tutte le String ed ho sostituico i char mi da problemi

cmq appena arrivo a casa provo subito come hai detto

ANCORA GRAZIE !!!!