[Risolto] Relais sollecitato all'avvio di Arduino?

Scusate la domanda, sicuramente banale. E' possibile che nel momento io cui io vado a dare alimentazione all'arduino, esso dia i 5v ad un relè collegato?

Marco

All'accensione tutti i pin di Arduino sono settati come ingressi con le pull'up disabilitate. Com'è fatto il circuito di comando del relè?

Come piloti i relé? con un mosfet o un optocoppler?

Secondo me la cosa piú semplice é usare un circuito adatto che senza pilotaggio non accende i relé.

Ciao Uwe

Premetto che a livello di elettronica sono a ZERO.

No, non li piloto con mosfet. Un optocoppler non so neanche cos'è.

Li ho presi già completi di tutto per essere sollecitati con un 5V, quindi li collego ad una uscita dell'arduino e poi rientro con l'altro cavetto nel GND (oppure nella 5-, ora non mi ricordo.. dopo vado a vedere).

Il problema è che finora è sempre andato tutto bene. Ora in una settimana "sembra" che il relè si sia sollecitato da solo, e presumo che sia dovuto al fatto che per motivi che non Vi sto a spiegare (Arduino dopo un tot va in freeze), io tolgo la tensione e la ridò. Lo so, come soluzione è ridicola... ma fino ad ora era andata bene.

marcofoc: Il problema è che finora è sempre andato tutto bene. Ora in una settimana "sembra" che il relè si sia sollecitato da solo, e presumo che sia dovuto al fatto che per motivi che non Vi sto a spiegare (Arduino dopo un tot va in freeze), io tolgo la tensione e la ridò. Lo so, come soluzione è ridicola... ma fino ad ora era andata bene.

Questo é diverso da quello che avevi scritto all' inizio.

Allora hai un errore nello sketch che Ti sovrascrive delle variabili oppure consumi troppa RAM. Facci vedere lo sketch.

Ciao Uwe

C’è anche della roba in più.
La funzione “stato grigliatore” non la utilizzo.
Uso solo la “muovi bottoni”.

#include <SPI.h> 
#include <Ethernet.h> 

#define out_A 7
#define out_B 8

#define buttonPin 13  // controllo lo stato del grigliaotre

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 20 }; 
byte gateway[] = { 192,168,1, 1 }; 
byte subnet[] = { 255, 255, 255, 0 };

EthernetServer server(23);
boolean gotAMessage = false; 
boolean buttA = false;
boolean buttB = false;
boolean grigliatore = false;
int buttonState = 0;         // current state of the button

void setup()
{
  pinMode(out_A,OUTPUT);
  pinMode(out_B,OUTPUT);
  pinMode(buttonPin, INPUT);

  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  
  Serial.begin(57600);
}

void loop()
{
  // telnet is sending us ASCII char bytes:
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {grigliatore = true;}
  else 
  if (buttonState == LOW) {grigliatore = false;}
  boolean validCommand = 0;
  char inputChar, speedString[2];
  
  EthernetClient client = server.available();

  if (client) {
    if (!gotAMessage) {

      Serial.println("connected to telnet client");      
      //client.println("Conn"); 
      gotAMessage = true;
    }
  
    if (server.available() > 0) {   // 5 characters in each command     
    
    inputChar = client.read();
    //Serial.println(inputChar);

      if (inputChar == 'A') {buttA = true;muovi_bottoni();client.println("-A---");}
      else if (inputChar == 'B') {buttB = true;muovi_bottoni();client.println("-B---");}
      else if (inputChar == 'C') {rispondi_stato_grigliatore();}
      }
      
      buttA = false;
      buttB = false;
      
}
}


void muovi_bottoni()
{
  Serial.println("Sono nella funzione");
  EthernetClient client = server.available();
  if (buttA == true) {digitalWrite(out_A,HIGH);delay(1000);digitalWrite(out_A,LOW);Serial.println("Muovo A");}
  else if (buttB == true) {digitalWrite(out_B,HIGH);delay(1000);digitalWrite(out_B,LOW);Serial.println("Muovo B");}
}
 
 
 
 
void rispondi_stato_grigliatore()
{
  Serial.println("Sono nella funzione STATO GRIGLIATORE");
  Serial.println(grigliatore);
  EthernetClient client = server.available();
  client.println(grigliatore);
}

L'inizializzazione Ethernet.begin(mac, ip, gateway, subnet); è errata. Quella corretta è:

Ethernet.begin(mac, ip, dns ,gateway);

oppure

Ethernet.begin(mac, ip, dns, gateway, subnet);

Se non hai il DNS usa

Ethernet.begin(mac, ip, gateway, gateway, subnet);

Per i serial print e i client print usa la funzione F(). Cosi:

client.println("-A---");

diventa

client.println(F("-A---"));

Solo per il testo, non per le variabili.

Bene, grazie. Modifiche apportate. Domani le carico sull'Arduino e vi faccio sapere.

Giusto per: quella funzione F, cos'è? Non indicherà mica di scrivere sulla Flash? Perchè io la flash non ce l'ho montata...

La Flash Rom è la memoria interna del microcontrollore. ;) Scrivibile durante la programmazione ma a sola lettura durante l'esecuzione dello sketch.

Son quattro giorni che l'Arduino lavora senza andare più in freeze! Molto bene! Grazie mille!

Però vorrei una risposta alla domanda iniziale: è possible che un releais venga sollecitato senza un preciso comando da software? Magari quando viene data tensione all'Arduino?

Durante l’accensione i pin si trovano in stato di alta impedenza e questo può causare la lettura di uno stato su esso non voluto. Per risolvere basta mettere una resistenza di pull-down al pin interessato (credo che 10 kOhm vadano bene).
Non so con esattezza per quale motivo succeda questo, ma ricordo che ne parlò il buon astrobeed in un vecchio post e suggeriva appunto questa (ottima) soluzione…

Quindi, riepilogando, questa resistenza va messa fra il pin e il relais, giusto?

tra il pin e massa , puoi usare anche 2,2kohm

Tipo come l’immagine in allegato?

O meglio così.

Il collegamento in entrambe gli schemi è identico, vanno bene entrambi

Che schifo fritzing, scaricati fidocad, è più serio