arduino o plc

Buonasera a tutto il gruppo, oggi vi pongo una domanda che da molto mi stuzzica.
Ho realizzato un macchinario che crea una camera calda con temperatura e umidità controllate secondo dei parametri già implementati nel software, il tutto funziona alla perfezione. dopo alcuni giorni il programma inizia a fermarsi (prima si blocca lo schermo, poi i relè in open,e infine l'intero programma), la colpa credo sia dovuta ai disturbi che ovviamente ci sono, nonostante le mie accortezze (cavo schermato, i 4 relè sono in un'altra parte della macchina, separazione line bassa/alta tensione).

Adesso vi chiedo nella totale ignoranza(non ne ho mai usato uno), se utilizzo un mini-plc con le stesse sonde di arduino il sistema può funzionare ??(uso:Arduino uno, 2xdallas 18b20,2xdht22, 2xsht30, 4 relè),oppure se sostituisco arduino con qualcosa di simile?? ho inserito anche un arduino Nano che con un relè e un orologio riavvia arduino uno ogni 30min, ma non credo sia una soluzione definitiva.
esistono in commercio delle centraline che fanno al caso mio (sui 40$) ma che sono standart e che quindi in caso di modifica della macchina sono da eliminare, non importa lo spendere 20$ in più ma basta che funzioni. Ovviamente non proponete cose troppo costose
Aspetto delle vostre dritte.

Qualcosa che per qualche giorno funziona bene e poi inizia a degradare mi suona di variabili che vanno in overflow, memoria dinamica frammentata, o condizioni non gestite (quindi un problema totalmente software). Se fossero solo disturbi il problema si presenterebbe random indipendentemente da quanto è acceso.

Claudio_FF:
Qualcosa che per qualche giorno funziona bene e poi inizia a degradare mi suona di variabili che vanno in overflow, memoria dinamica frammentata, o condizioni non gestite (quindi un problema totalmente software). Se fossero solo disturbi il problema si presenterebbe random indipendentemente da quanto è acceso.

questo è il codice che uso

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_1 10
#define ONE_WIRE_BUS_2 5
OneWire sonda1(ONE_WIRE_BUS_1);
OneWire sonda2(ONE_WIRE_BUS_2);
DallasTemperature sensore1(&sonda1);
DallasTemperature sensore2(&sonda2);


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
Adafruit_SHT31 sht3x = Adafruit_SHT31();

const int relayPin = 4;
const int relayPin1 = 8;
const int relayPin2 = 9;

int pulsantePin = 7;
int val = 0;

volatile bool max1 = true;
volatile bool min1 = true;



void setup(void) {

  Serial.begin(9600);

  lcd.begin(20, 4);

  sht31.begin(0x44);
  sht3x.begin(0x45);

  pinMode(relayPin, OUTPUT);
  pinMode(relayPin1, OUTPUT);
  pinMode(relayPin2, OUTPUT);

  sensore1.begin();
  sensore2.begin();

  pinMode(pulsantePin, INPUT);




}

void loop(void) {

  val = digitalRead(pulsantePin);

  if (max1 && (val == HIGH) ) {

    lcd.clear();
    max1 = false;
    min1 = true;

    sht31.begin(0x44);
    sht3x.begin(0x45);

    sensore1.begin();
    sensore2.begin();
  }

  if (val == HIGH) {



    float t1 = sensore1.getTempCByIndex(0);
    float t2 = sensore2.getTempCByIndex(0);


    float h = sht3x.readHumidity(); //umidità sopra
    float h1 = sht31.readHumidity(); //umidità giù
    float t4 = sht3x.readTemperature(); //t. sopra
    float t3 = sht31.readTemperature(); //t. giù


    sensore1.requestTemperatures();
    sensore2.requestTemperatures();
    
    lcd.setCursor(0, 0);
    lcd.print("Arduino: ON");
    lcd.setCursor(11, 0);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print("Schiusa: T=");
    lcd.print(t1);
    lcd.setCursor(9, 2);
    lcd.print("U=");
    lcd.print(h1);
    lcd.print("%");
    lcd.setCursor(0, 3);
    lcd.print("Conf:");
    lcd.setCursor(5, 3);
    lcd.print("T=");
    lcd.print(t2);
    lcd.setCursor(11, 3);
    lcd.print("U=");
    lcd.print(h);
    lcd.print("%");

    if ( t1 < 37.8 && h1 < 57)  {

      digitalWrite(relayPin1, HIGH); // BIANCHE //
      digitalWrite(relayPin, LOW); //VAPORE ON//
      digitalWrite(relayPin2, LOW); // NERE //
      delay(10000);
    

}

    if ( t1 > 37.8 && t1 < 38.3 && h1 < 57)  {

      digitalWrite(relayPin1, LOW);
      digitalWrite(relayPin, LOW);
      digitalWrite(relayPin2, HIGH);
      delay(10000);


    }

    if (t1 > 38.3 && h1 < 57)  {

      digitalWrite(relayPin1, LOW);
      digitalWrite(relayPin, LOW);
      digitalWrite(relayPin2, LOW);
      delay(10000);
    }

    if (t1 < 37.8 && h1 > 57 && h1 < 65 )  {

      digitalWrite(relayPin1, HIGH);
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayPin2, LOW);
      delay(10000);
    }
    if (t1 > 37.8 && t1 < 38.3 && h1 > 57 && h1 < 65 )  {

      digitalWrite(relayPin1, LOW);
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayPin2, HIGH);
      delay(10000);
      

    }
    if (t1 > 38.3 && h1 > 57 && h1 < 65 )  {

      digitalWrite(relayPin1, LOW);
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayPin2, LOW);
      delay(10000);

    }
    if (t1 < 37.8 && h1 > 65 )  {

      digitalWrite(relayPin1, HIGH);
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayPin2, LOW);
      delay(5000);
    }
    if (t1 > 37.8 && t1 < 38.3 && h1 > 65 )  {

      digitalWrite(relayPin1, LOW);
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayPin2, LOW);
      delay(10000);

    }

    if (t1 > 38.3 && h1 > 65 )  {

      digitalWrite(relayPin1, LOW);
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayPin2, LOW);
      delay(10000);

    }


  }


  else {
    
    sht31.begin(0x44);
    sht3x.begin(0x45);

    
    sensore1.begin();
    sensore2.begin();

    float h = sht3x.readHumidity(); //umidità sopra
    float h1 = sht31.readHumidity(); //umidità giù
    float t4 = sht3x.readTemperature(); //t. sopra
    float t3 = sht31.readTemperature(); //t. giù
    
    float t1 = sensore1.getTempCByIndex(0);
    float t2 = sensore2.getTempCByIndex(0);

    sensore1.requestTemperatures();
    sensore2.requestTemperatures();

    Serial.print("Temp schiusa: DALLAS");
    Serial.print(t1); //Serial.print ("*C SHT3X"); Serial.print(t3); Serial.print ("*C");
    Serial.print("Umid schiusa");
    Serial.print(h1); Serial.print("% Umid conf:"); Serial.print(h); 
    delay(5000);

    lcd.setCursor(0, 0);
    lcd.print("Arduino: OFF Info:");
    lcd.setCursor(0, 1);
    lcd.print("   Version: 1.0.0");
    lcd.setCursor(0, 2);
    lcd.print("                    ");
    lcd.setCursor(0, 3);
    lcd.print("Creator: A. Milella ");

    digitalWrite(relayPin, LOW); // VAPORE //
    digitalWrite(relayPin1, HIGH); // BIANCHE //
    digitalWrite(relayPin2, LOW); // NERE //

    max1 = true;
    min1 = false;

  }

}

L'unica cosa anomala che vedo a un rapido sguardo sono le condizioni con molti < e > ma nessun <= o >=.

Che si fa se la temperatura è uguale a 37.8?

Per quanto riguarda la domanda iniziale, non credo che un PLC commerciale si possa interfacciare con quei sensori (non pensati per un PLC che di solito oltre a ingressi digitali a 12..24V se non sbaglio ha solo ingressi analogici current loop o 0..10V, non sono pratico di PLC).

Eventualmente ci sono dei arduino/plc; forse ne abbiamo parlato nel forum.
Uno mi pare si chiami controllino, ma non saprei quale affidabilità ha, ne se poi è vero che è un "plc" con la facilità di programmazione/collegamento di arduino. E comunque ha un bel costo.

Ma non è che i rele comunque non mandino disturbi verso l'arduino ?

Per il codice:

  1. perché le variabili bool le hai messe volatile ?? che senso ha ?
  2. Non c'entra molto ma i pin dichiarali const byte invece che int e fallo per tutti anche per pulsantePin
    const byte relayPin = 4;
    Poi anche val basta un byte, int è sprecato.
  3. ma perché quei begin dei sensori un pò ovunque ? se ci sono nel setup() poi sono inutili
  4. perché due volte la include di wire.h ? copia-incolla di più programmi ?
  5. ma perché la requestTemperatures() le fai DOPO le getTempCByIndex ?? LINK
  6. Ultima cosa, leva tutte quelle righe vuota che non servono a nulla, se non a rendere difficile la lettura

Ti allego il tuo sketch riordinato, e ripulito, secondo le mie idee.

sketch_mar07a.ino (4.3 KB)

Di Arduino per uso industriale ce ne sono almeno un paio, di ditte molto serie ... QUESTO è uno ed è fatto da Siemens, gli altri si trovano in QUESTO sito.

Guglielmo

Quello di Siemens (per ora, dice in offerta) ha un ottimo prezzo !!

nid69ita:
Eventualmente ci sono dei arduino/plc; forse ne abbiamo parlato nel forum.
Uno mi pare si chiami controllino, ma non saprei quale affidabilità ha, ne se poi è vero che è un "plc" con la facilità di programmazione/collegamento di arduino. E comunque ha un bel costo.

Ma non è che i rele comunque non mandino disturbi verso l'arduino ?

Per il codice:

  1. perché le variabili bool le hai messe volatile ?? che senso ha ?
  2. Non c'entra molto ma i pin dichiarali const byte invece che int e fallo per tutti anche per pulsantePin
    const byte relayPin = 4;
    Poi anche val basta un byte, int è sprecato.
  3. ma perché quei begin dei sensori un pò ovunque ? se ci sono nel setup() poi sono inutili
  4. perché due volte la include di wire.h ? copia-incolla di più programmi ?
  5. ma perché la requestTemperatures() le fai DOPO le getTempCByIndex ?? LINK
  6. Ultima cosa, leva tutte quelle righe vuota che non servono a nulla, se non a rendere difficile la lettura

Ti allego il tuo sketch riordinato, e ripulito, secondo le mie idee.

Allora grazie mille dei consigli, e del codice riordinato, è una bomba.Hai ragione ho fatto diversi errori dovuti alla poca esperienza, al "copia e incolla" e al metodo "per tentoni". I relè potrebbero essere ma escluderei perché sono in un'altra zona della macchina, carico il tuo codice, vedo come si comporta e comunico.

gpb01:
Di Arduino per uso industriale ce ne sono almeno un paio, di ditte molto serie ... QUESTO è uno ed è fatto da Siemens, gli altri si trovano in QUESTO sito.

Guglielmo

Grazie delle info Guglielmo, quando parli di Arduino industriale cosa intendi? come collego a quella scatoletta della siemens sonde, relè e quant'altro?

Grazie mille a tutti per i vari consigli...