Arduino Forum

International => Italiano => Hardware => Topic started by: ziobill on Nov 18, 2013, 01:25 pm

Title: Problema alimentazione?
Post by: ziobill on Nov 18, 2013, 01:25 pm
Ciao ragazzi,
ho scritto un piccolo codice per riprodurre un termostato che tramite sonda prenda temperatura  e accenda o spenga un frigo o una resistenza riscaldante per mantenere il range impostato.
Ho un problema e non comprendo il motivo.

Dopo alcune ore circa 6-7 (assolutamente non so di preciso) l'arduino non svolge piu' lo switching dei rele'.
Non so se si impalla qualcosa nel software o magari l'alimentazione non e' corretta, io sto usando un alimentatorino (riciclato da un vecchio HUB USB) che e' a 5V.
Non vorrei che questo alimentatore sia troppo piccolo, ma la cosa strana e' che le prime ore funziona senza problemi.
Secondo voi e' un problema sul codice o potrebbe anche essere un prob di alimentazione?
Che alimentatore mi consigliate?

Grazie ragazzi.
Mario
Title: Re: Problema alimentazione?
Post by: uwefed on Nov 18, 2013, 01:48 pm
Non sono a casa. Quando ritorno consulteró la mia sfera magica.   ;) ;) ;)

Ci dai troppo poche informazioni.
Per aiutarti ci serve lo sketch, il circuito, i dati di targa del alimentatore, il modello di scheda relé che usi e una foto del cablaggio.
Comunque io scometto sullo sketch.
Ciao Uwe

Title: Re: Problema alimentazione?
Post by: ziobill on Nov 18, 2013, 02:01 pm
hai ragione... scusa per le poche informazioni, provo a migliorare:

Il progettino e' un "termostato" che accende e spegne un frigorifero e un cavo riscaldante (posto nel frigo) in modo da mantenere un certo range di temperatura che imposto. In piu' con lo shield ethernet (W5100) mi avvia un server web che mi dice la temperatura e mi fa impostare il range.
C'e' anche una funzione "salva frigorifero" che fa si che il frigo non si riaccenda prima di un toto di secondi dall'ultimo spegnimento.

Lo schema di collegamento e' il seguente:
(http://www.nostress.it/fermentazione.png)

La resistenza e' 4,7K

la scheda a 2 rele che ho usato e' questa (scusa se posto il link ad ebay, spero che si capisca qual'e'):
(http://i.ebayimg.com/t/Arduino-compatible-2-Channel-5V-Relay-Module-Expansion-Board-/00/s/ODAwWDgwMA==/z/28kAAOxy4~BSQed8/$(KGrHqN,!nsFItNGZHN+BSQed74Bnw~~60_12.JPG)

il codice per arduino e' il seguente:
Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
#include <secTimer.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2,177);
EthernetServer server(80);
String receivedText = String(255);

int cold = 7;
int hot = 6;
char floatbuf[32];
 
int MIN = 23;
int MAX = 30;

int time;
secTimer myTimer;
byte state=1;
unsigned long seconds=0;
const int chipSelect = 4;

#define CALDO 0
#define FREDDO 1

int ultimostato = NULL;
int ultimoff = 0;
int secure_time = 120;

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
 
  // if the file opened okay, write to it:
 
 
  myTimer.startTimer();
  seconds=myTimer.readTimer();
  pinMode(cold, OUTPUT);
  pinMode(hot, OUTPUT);
 
  // Start up the library
  sensors.begin();
}

void loop(void)
{
  EthernetClient client = server.available();
if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (receivedText.length() < 55) {
          receivedText += c;
        }
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          client.print("<html><head><title>Arduino Webserver</title></head><body>");
          client.print("La temperatura del sensore e':");
          client.println(sensors.getTempCByIndex(0));
          client.print("</br>");
          client.print("La temperatura impostata e':");
          client.print("Min: ");
          client.print(MIN);
          client.print("  Max: ");
          client.print(MAX);
         
         
          client.println("<h1>Controllo Temperatura!</h1>");
          client.print("<form method=get>Inserisci la temperatura (MAX=? oppure MIN=?): <input type=text size=10 name=temp>&nbsp;<input type=submit></form>");
            //client.print("<form method=get>Inserisci la temperatura Massima: <input type=text size=10 name=max>&nbsp;<input type=submit></form>");
          client.println("</body></html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
     delay(1);
     Serial.println("questo e' il received text");
    Serial.println(receivedText); // uncomment this line to debug ;-)
 
    // do something with the text
    int firstPos = receivedText.indexOf("?");
    if (firstPos > -1) {
      int lastPos = receivedText.indexOf(" ", firstPos);
      String theText = receivedText.substring(firstPos+12, lastPos); // 10 is the length of "?the_text="
      String theTextScelta = receivedText.substring(firstPos+6, firstPos+9); // 10 is the length of "?the_text="
      // if your text contains spaces they will be replaced with "+"
      Serial.println("***********************");
      Serial.println(theTextScelta);
      Serial.println(theText);
      Serial.println("***********************");
     
      theText.toCharArray(floatbuf, sizeof(floatbuf));
      int TheTextINT = atoi(floatbuf);
     
      if (theTextScelta == "MIN")
        MIN = TheTextINT;
      if (theTextScelta == "MAX") 
        MAX = TheTextINT;
    }
    receivedText = "";
    client.stop();
    Serial.println("client disonnected");
}
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
 
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0)); 
 
  time=myTimer.readTimer();
 
  if (sensors.getTempCByIndex(0) < MIN)
  {
    digitalWrite(hot, LOW);
    digitalWrite(cold, HIGH);
    Serial.print("Riscaldamento...");
    ultimostato = CALDO;
  }
  else if (sensors.getTempCByIndex(0) > MAX && (time-=secure_time) > ultimoff)
  {
    digitalWrite(hot, HIGH);
    digitalWrite(cold, LOW);
    Serial.print("Raffreddamento...");
    ultimostato = FREDDO;
  }
  else if (sensors.getTempCByIndex(0) > MIN || sensors.getTempCByIndex(0) < MAX)
  {
    digitalWrite(hot, HIGH);
    digitalWrite(cold, HIGH);
    Serial.print("Temperatura OK!");
   
    if (ultimostato == FREDDO)
    {
       ultimoff = myTimer.readTimer();
       ultimostato = NULL;
    }
  }/*
  Serial.println();
  Serial.print("ULTIMOSTATO: ");
  Serial.println(ultimostato); 
  Serial.print("ULTIMOFF: ");
  Serial.println(ultimoff); 
  Serial.print("Timer: ");
  Serial.println(myTimer.readTimer());
  Serial.print("secure Timer: ");
  Serial.println(secure_time);
  Serial.print("MIN: ");
  Serial.println(MIN);
  Serial.print("MAX: ");
  Serial.println(MAX); */
}


Purtroppo non ho le specifiche dell'alimentatore qui' con me ora.

Spero che le informazioni aggiunte siano leggermente utili.
Ciao e grazie ancora.

Mario
Title: Re: Problema alimentazione?
Post by: PaoloP on Nov 18, 2013, 10:39 pm

Comunque io scometto sullo sketch.


Io sull'esaurimento della RAM.
--> http://www.leonardomiliani.com/2012/come-sapere-loccupazione-di-ram-del-proprio-sketch/
e poi non dimenticare di usare la funzione F().
Title: Re: Problema alimentazione?
Post by: ziobill on Nov 19, 2013, 07:52 am


Comunque io scometto sullo sketch.


Io sull'esaurimento della RAM.
--> http://www.leonardomiliani.com/2012/come-sapere-loccupazione-di-ram-del-proprio-sketch/
e poi non dimenticare di usare la funzione F().


mi sa che c'hai ragione...
AVR Memory Usage
----------------
Device: Unknown

Program:   24696 bytes
(.text + .data + .bootloader)

Data:       1733 bytes
(.data + .bss + .noinit)


che ne pensi?
levando i serial.print che non mi servivano raggiungo quersto:

AVR Memory Usage
----------------
Device: Unknown

Program:   23898 bytes
(.text + .data + .bootloader)

Data:       1477 bytes
(.data + .bss + .noinit)


potrebbe essere quello il prob?
Title: Re: Problema alimentazione?
Post by: PaoloP on Nov 19, 2013, 07:09 pm
Sostituisci tutti i Serial.print e Client.print e println in modo che diventino, da così
Code: [Select]
Serial.print("xxxx");
a così
Code: [Select]
Serial.print(F("xxxx"));

Devi sostituire t(" con t(F(" e "); con "));
Per i println n(" con n(F("
Usa trova e sostituisci nell'IDE.
Title: Re: Problema alimentazione?
Post by: ziobill on Nov 19, 2013, 07:36 pm

Sostituisci tutti i Serial.print e Client.print e println in modo che diventino, da così
Code: [Select]
Serial.print("xxxx");
a così
Code: [Select]
Serial.print(F("xxxx"));

Devi sostituire t(" con t(F(" e "); con "));
Per i println n(" con n(F("
Usa trova e sostituisci nell'IDE.


in realta' ho gia' commentato tutti i serial.print in quanto non ho necessita' della console.
con tutto commentato i valori erano quelli del secondo avr:

AVR Memory Usage
----------------
Device: Unknown

Program:   23898 bytes
(.text + .data + .bootloader)

Data:       1477 bytes
(.data + .bss + .noinit)


Ma, solo per info, avr tiene conto dei commenti si?
cmq i valori di memoria sono quelli.

Grazie raga, fatemi sapere.
Mario
Title: Re: Problema alimentazione?
Post by: uwefed on Nov 19, 2013, 10:14 pm
Lo stesso trucchetto con F() devi farlo anche nei
client.println e client.print
Ciao Uwe
Title: Re: Problema alimentazione?
Post by: PaoloP on Nov 21, 2013, 05:39 pm
Ma se richiami la funzione freeram durante il loop che valori restituisce?

Quote from: http://www.leonardomiliani.com/2012/come-sapere-loccupazione-di-ram-del-proprio-sketch/
Funzione freeRam
La funzione si chiama freeRam ed è stata pubblicata per la prima volta su JeeLabs.org:

Code: [Select]
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

Basta inserire questa funzione nel vostro sketch e richiamarla: essa restituirà un valore di tipo int che rappresenta il numero di byte di SRAM in quel momento ancora liberi - tale valore potrete stamparlo su seriale oppure visualizzarlo su un LCD.


La funzione la trovi anche nella libreria SdFatUtil che includi con
Code: [Select]
#include <SdFatUtil.h>
e usi nel loop con
Code: [Select]
Serial.println(FreeRam());
Nota: quella della lib SD ha la F maiuscola.