Arduino brickato dopo tot ore di funzionamento

Ciao a tutti, ho realizzato con arduino nano (clone) un sistema di termoregolazione che semplicemente legge la temperatura da un sensore DS18B20 e tramite un transistor Bjt usato come interruttore, modula la velocità di una ventola pc con un'onda quadra pwm il tutto con isteresi.
Il sistema ha alimentazione compresa tra 12.5 e 14 proveniente da una batteria auto. (14V quando è sotto carica da un alimentatore di ricarica batteria collegato alla 220V).

Il primo progetto ha funzionato regolarmente per circa un anno (non sempre acceso in maniera continuativa) dopodiché arduino si è fermato con led fisso e non è più stato possibile riprogrammarlo. Sostituito con uno nuovo questo è durato poco più che qualche giorno e poi led fisso.

Quello che volevo chiedere è dove ho sbagliato nel realizzare l'hw, se mancano delle protezioni e come intervenire per migliorarlo (es. mettere uno stadio di alimentazione bulk fisso a 12v se servisse)

Lo sketch usato è questo:

#include <OneWire.h>
#include <DallasTemperature.h>

#define PIN_FAN 3
#define PIN_LED 13
#define PIN_ONE_WIRE_TEMP 8
#define MIN_TEMP_FAN_ON 43
#define MIN_TEMP_FAN_OFF 39
#define TEMP_FAN_CONST_LOW 30
#define MAX_TEMP_FAN_ON 50

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(PIN_ONE_WIRE_TEMP);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup() {
  // put your setup code here, to run once:
  pinMode(PIN_FAN, OUTPUT);
  pinMode(PIN_ONE_WIRE_TEMP, INPUT);
  pinMode(PIN_LED, OUTPUT);
  //Serial.begin(9600);

  // Start up the library
  sensors.begin();
  analogWrite(PIN_FAN, 0);
}

bool LedIsOn = false;
bool startFirst = true;

void temp2Led(int temp)
{
  int dec = temp / 10;
  int unit = temp % 10;

  digitalWrite(PIN_LED, LOW);
  for (int ii = 1; ii <= dec; ii++)
  {
    digitalWrite(PIN_LED, HIGH);
    delay(200);
    digitalWrite(PIN_LED, LOW);
    delay(200);
  }

  delay(1000);

  for (int ii = 1; ii <= unit; ii++)
  {
    digitalWrite(PIN_LED, HIGH);
    delay(200);
    digitalWrite(PIN_LED, LOW);
    delay(200);
  }
  delay(2500);
}

void loop() {
  // put your main code here, to run repeatly:
  float temp;

  //Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("DONE");

  //Serial.print("Temperature for Device 1 is: ");
  temp = sensors.getTempCByIndex(0);
  //Serial.print(temp);

  if (temp < 10 || temp > 70)
  {
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(750);              // wait for a second
    digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);              // wait for a second
  }
  else
  {
    temp2Led(int(temp));
  }

  if (temp > (MIN_TEMP_FAN_ON))
  {
    if (startFirst)
    {
      startFirst = false;
      analogWrite(PIN_FAN, 255);
      delay(2000);
    }

    if (temp >= MAX_TEMP_FAN_ON)
    {
      analogWrite(PIN_FAN, 255);
      //Serial.println("Il valore PWM è ");
      //Serial.println("255");
    }
    else
    {
      analogWrite(PIN_FAN, int(temp - TEMP_FAN_CONST_LOW) * 12 + 10);
      //Serial.println("Il valore PWM è ");
      //Serial.println((temp - MIN_TEMP_FAN_ON) * 12);
    }
  }
  else if (temp < (MIN_TEMP_FAN_OFF))
  {
    analogWrite(PIN_FAN, 0);
    startFirst = true;
    //Serial.println("Il valore PWM è ");
    //Serial.println("0");
  }
  delay(1000);
}

E lo schema è questo:
(Ventole Frigo hosted at ImgBB — ImgBB)

Schema

... in conformità al regolamento, punto 7, il codice va racchiuso tra i tag CODE e non i tag quote che hai usato tu. Per questa volta correggo io, ma ricordatene per il futuro, grazie. :wink:

Guglielmo

Il sistema ha alimentazione compresa tra 12.5 e 14 proveniente da una batteria auto.

mi sembra tantino per l'arduino...

Lzan74:
... Quello che volevo chiedere è dove ho sbagliato nel realizzare l'hw, se mancano delle protezioni e come intervenire per migliorarlo (es. mettere uno stadio di alimentazione bulk fisso a 12v se servisse) ...

... ma è montato in "auto" ed è alimentato mentre il motore è acceso ? ? ?

Guglielmo

gpb01:
... ma è montato in "auto" ed è alimentato mentre il motore è acceso ? ? ?

Guglielmo

No, si tratta della batteria servizi del camper. Normalmente ha solo carichi tranne quando in campeggio viene attaccata al caricabatterie 220v.

Sappiamo dire qualcosa su del Hardware originale ma con dei cloni che ne noi ne Tu sai chi li ha fabbricati e che componenti ha usato no.

14 V sono tantini. Non hai dato delle secifiche sul circuito percui non sappiamo se hai cotto la scheda perché lo stabilizzatre diventa troppo caldo.

Ciao Uwe

uwefed:
Sappiamo dire qualcosa su del Hardware originale ma con dei cloni che ne noi ne Tu sai chi li ha fabbricati e che componenti ha usato no.

14 V sono tantini. Non hai dato delle secifiche sul circuito percui non sappiamo se hai cotto la scheda perché lo stabilizzatre diventa troppo caldo.

Ciao Uwe

Non capisco di quali specifiche parli, ho allegato lo schema del circuito nel primo post con relativo Sketch...

Lzan74:
Non capisco di quali specifiche parli

Di quelle dichiarate dal costruttore della scheda.

In ogni caso su qualsiasi Arduino meglio non entrare su Vin con più di 9V.
Quindi metti uno zener da 3.3V 1W in serie al pin Vin in modo da ridurre di 3.3V la tensione in ingresso alla scheda.

Oltre a questo non sappiamo da dove è presa la massa. Se si trova in un punto distante dalla batteria allora lungo quel percorso potrebbero formarsi ulteriori picchi di tensione che vanno a sommarsi a quella già presente. Potrebbe bastare un elettrolitico da un cento µF tra Vin e GND di Arduino.

Claudio_FF:
Di quelle dichiarate dal costruttore della scheda.

In ogni caso su qualsiasi Arduino meglio non entrare su Vin con più di 9V.
Quindi metti uno zener da 3.3V 1W in serie al pin Vin in modo da ridurre di 3.3V la tensione in ingresso alla scheda.

Oltre a questo non sappiamo da dove è presa la massa. Se si trova in un punto distante dalla batteria allora lungo quel percorso potrebbero formarsi ulteriori picchi di tensione che vanno a sommarsi a quella già presente. Potrebbe bastare un elettrolitico da un cento µF tra Vin e GND di Arduino.

Sicuramente la massa è a qualche metro di distanza. Comunque vedo che tutte le risposte al problema sono orientate all'alimentazione.
Appena arriva una nuova schedina apporterò le modifiche suggeritemi.
Intanto grazie a tutti per le dritte

Se il tuo nano compatibile monta un uA78M05 lo puoi alimentare fino a 30VDC, se monta un 1117 fino a 12VDC, in tal caso è auspicabile una preregolazione dell'alimentazione con filtro sull'alimentazione

Lzan74:
Quello che volevo chiedere è dove ho sbagliato nel realizzare l'hw,

Secondo me a partire da questo punto:

... ho realizzato con arduino nano (clone) ...

Nello schema manca il collegamento a GND della scheda Nano (quasi sicuramente avrai dimenticato di segnare questo collegamento nello schema).

Esistono anche schede "clone" o meglio ancora "copie legali" di qualità, ma se hai messo una di quelle schede da un paio di euro, soprattutto se la alimenti con quelle tensioni così alte, è normale che si vada a rovinare (talvolta si rovinano anche da sole, o meglio sono già fatte in partenza con pezzi di scarto recuperati).

  1. La massa di arduino non è disegnata ma c'è ed è in comune con tutte le altre;
  2. Monta un 1117, che però non sembra essersi bruciato, in uscita ha 5V.

Giusto per curiosità: l'arduino originale monta anch'esso un 1117 e il sito riporta nella sezione Power: "[...]6-20V unregulated external power supply (pin 30)[...]", come da datasheet (max 15V raccomandato).

Molto meglio se vai con 9 volt.

Probabilmente si sarà rovinato qualche altro componente, succede su queste schede. A meno che ti sia entrata qualche altra tensione da qualche parte, in tal caso si sarebbe bruciato anche un originale.

icio:
se monta un 1117 fino a 12VDC,

Pare che in alcuni cloni cinesi il 1117 è falso e oltre i 10V ha la tendenza a farli passare tutti. A me però fino adesso non è capitato.

Se ne dicono tante di leggende

Probabilmente il MC non è guasto ma solo brikkato, senza programmatore parallelo è quasi impossibile disattivare il RSTDISBL

Inoltre se presente il bootloader bisogna proteggerlo impostando
MODE3 in ISP/parallel programming.
MODE1 in Application section
MODE3 in Boot section
Flag BOOTRST enabled

Un'altra cosa che sarebbe sempre meglio fare è resettare il MC se la tensione dei 5V scende sotto i 4.2V anche per un picco, ci sono dei chip apposta per fare questo, costano poco, oppure in mancanza attivare sempre il BOD LEVEL a 4.3V