Problema ArduinoUNO e P82B715

Buongiorno a tutti,

ho un problema con Arduino e l'extender bus I2C.

Elenco componenti:
1 Arduino UNO Rev. 3
1 LCD 20x4 verde
4 Led
2 Extender BUS I2C con P82B715
1 Scheda Espansione I/O con integrato MCP23017
4 Sonde DS18B20
1 DHT11
15 Mt cavo cat. 5e

Funzionamento spiegato in modo semplice,
il display mostra le temperature delle sonde Dallas e del DHT11, la retroilluminazione è gestita da un selettore quindi decido io quando attivarla (quindi è sempre spenta).

I 2 Bus Extender portano la linea I2C ad una distanza di circa 15Mt da Arduino alla scheda di espansione I/O dove ho configurato 2 INPUT e 4 OUTPUT.
Il tipo di configurazione utilizzato è a 4 fili, (SDA - Vcc) (SCL - GND)

I 4 OUTPUT comandano una scheda Relè ma con alimentazione separata.

Questo è il funzionamento spiegato in modo semplice.

Il sistema funziona ma ogni tanto i caratteri sul Display diventano sbiaditi anche senza retroilluminazione e sono costretto a togliere alimentazione ad Arduino per riavviare l'esecuzione del programma.

Per gli extender I2C ho utilizzato lo schema allegato che ho estratto dal datasheet fornito con le schede.

Non riesco a capire perché il problema si presenta ogni tanto e non subito.

Qualcuno ha idea su cosa succede??

Grazie

Fabio

Fai una foto.
Che giro fa il BUS I2C? Che resistenze Pullup e dove li hai montati?
Ciao Uwe

Ho fatto 3 foto.

Il Bus passa in un corrugato nel muro dove all'interno c'è un altro cavo che porta il 5V ad Arduino per alimentarlo.

Le resistenze sul Bus SDA e SCL in uscita da Arduino sono da 4700 Ohm tra il Bus e Vcc.
Le resistenze dopo il modulo Extender sono da 470 Ohm sempre tra i poli del Bus SDA e SCL con Vcc.

In pratica sono,
da Arduino all'Extender SDA > Vcc e SCL > Vcc ( 2 Resistenze da 4700 Ohm)
dall'Extender su cavo Cat.5e all'altro Extender SDA > Vcc e SCL > Vcc sia nel primo che nel secondo ( 2 Resistenze da 470 Ohm)

Il primo Extender è installato dentro la scatola che si vede in foto, dove c'è anche Arduino.
Il secondo è in un'altra scatola dedicata in soffitta

La temperatura della stanza dove è la scatola in foto oscilla sui 24/26 Gradi.
La temperatura del secondo Extender in soffitta oscilla sui 8/13 Gradi attualmente

Tu hai Arduino I2C - Extender - Extender - i2C Modulo MCP23017.

Hai messo i Pullup anche nel collegamento tra il secondo Extender (livello I2C) e MCP23017?
Ciao Uwe

uwefed:
Tu hai Arduino I2C - Extender - Extender - i2C Modulo MCP23017.

Hai messo i Pullup anche nel collegamento tra il secondo Extender (livello I2C) e MCP23017?
Ciao Uwe

Si, tra il secondo extender e MCP23017 ci sono resistenze da 4700 Ohm.

L'unica cosa è che non ho inserito i Diodi che nello schema sono opzionali.

Come foto intendevo del cablaggio.
Allora hai un Arduino dove

  • tramite il I2C e 2 Expander é attacato un Extender con 4 Relé e 2 pulsanti;
  • tramite interfavvia 1 Wire i sensori
  • e tramite 6 segnali il LCD.

Secondo me é un problema dello Sketch.

Ciao Uwe

Buongiorno e buon anno,

ho, Arduino dove è presente una sensor shield per facilitare il cablaggio.

Sulla shield sono collegati:

  • 3 Selettori in modo Input
  • 1 Wire per la DS
  • 1 LCD I2C 20x4
  • 4 Output per 4 Led ( 3 Verdi e 1 Rosso)
  • 1 DHT 11
  • 1 Extender BUS I2C

Tramite il cavo di rete a 15 Mt circa mi trovo:

Solo i 4 Relè sono alimentati separatamente, il resto tramite i 5V di Arduino.

Allego lo schema in pdf che è identico al cablaggio, prima ho disegnato e poi l'ho costruito.
Cambia solo la parte dei Relè dove ne ho messi 4 ed ho alimentato esternamente perché in fase di test mi sono accorto che Arduino non ce la faceva ad accendere 2 Relè insieme.

Lo sketch è questo

#include <Adafruit_MCP23017.h>
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Adafruit_MCP23017 mcp1;

LiquidCrystal_I2C lcd(0x27, 20, 4);
const int Stagione = 5;       // Selettore ESTATE/INVERNO collegato ad Arduino
const int Forza = 6;          // Selettore SU per Forzare acqua calda (Collegato ad Arduino)
const int mcp_calore =  11;   // Relè 2 collegato a MCP23017 (Filo Bianco)
const int mcp_stag = 10;       // Relè 1 collegato a MCP23017 (Filo Verde)
const int mcp_forza = 12;     // Relè 3 Selettore SU Forzatura calore collegato a MCP23017 (Filo Rosso)
const int mcp_forzato = 13;   // Relé 4 Forzato collegato a MCP23017
const int ledforzato = 8;     // Se forzato accende LED Rosso collegato ad Arduino
const int mcp_bollitore = 15; // Elettro Valvola Linea Bollitore collegato a MCP23017 con cottatto pulito
const int mcp_termo = 9;      // Elettro Valvola Linea Riscaldamento collegato a MCP23017 con cottatto pulito
const int Clima = 3;          // Termostato Ambiente per Riscaldamento Abitazione collegato ad Arduino
const int ledtermo = 9;       // Led Verde Stato Elettrovalvola Riscaldamento Abitazione collegato ad Arduino
const int ledboll = 10;       // Led Verde Stato Elettrovalvola Bollitore collegato ad Arduino
const int ledblu = 4;         // Led Blu Stato Stagione, acceso su Inverno collegato ad Arduino

// Lettura Stato dei SELETTORI collegati ad Arduino

int statoForza = 0;
int statoStagione = 0;
int statoClima = 0;
int statomcp_bollitore = 0;
int statomcp_termo  = 0;

// Linea dati DS18B20 al pin 7 di Arduino
#define ONE_WIRE_BUS 7

// Dichiaro il Pin del DHT e il modello DHT11
#define DHTPIN 2
#define DHTTYPE DHT11

// Imposta la comunicazione oneWire per comunicare con un dispositivo
OneWire oneWire(ONE_WIRE_BUS);

// Passaggio oneWire reference alla Dallas Temperature
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  
  Wire.begin();
  digitalWrite(SDA, 0);
  digitalWrite(SCL, 0);
  mcp1.begin(0);
  sensors.begin();
  dht.begin();
  lcd.init();
  lcd.backlight();



  // Configuro i Pin USCITA
  mcp1.pinMode(mcp_calore, OUTPUT);    // Relè 2 su MCP23017
  mcp1.pinMode(mcp_stag, OUTPUT);       // Relè 1 su MCP23017
  mcp1.pinMode(mcp_forza, OUTPUT);     // Relè 3 su MCP23017
  mcp1.pinMode(mcp_forzato, OUTPUT);   // Relé 4 su MCP23017
  pinMode(ledforzato, OUTPUT);         // Led ROSSO Forzatura su Arduino
  pinMode(ledtermo, OUTPUT);           // Led VERDE Valvola Termosifoni su Arduino
  pinMode(ledboll, OUTPUT);            // Led VERDE Valvola Bollitore su Arduino
  pinMode(ledblu, OUTPUT);             // Led Verde Stagione Inverno

  // Configuro i Pin INGRESSO
  pinMode(Forza, INPUT_PULLUP);               // Selettore SU per Forzatura su Arduino
  pinMode(Stagione, INPUT_PULLUP);            // Selettore SU per Inverno, GIU per Estate su Arduino
  pinMode(Clima, INPUT_PULLUP);               // Ingresso per Riscaldamento Ambiente da Termostato su Arduino
  mcp1.pinMode(mcp_bollitore, INPUT);         // Stato Elettrovalvola Linea Bollitore su MCP23017
  mcp1.pinMode(mcp_termo, INPUT);             // Stato Elettrovalvola Linea Riscaldamento su MCP23017
  

}

void loop(void) {

  statoForza = digitalRead(Forza);
  statoStagione = digitalRead(Stagione);
  statoClima = digitalRead(Clima);
  statomcp_bollitore = digitalRead(mcp_bollitore);
  statomcp_termo = digitalRead(mcp_termo);

  // Lettura Dallas
  sensors.requestTemperatures();

  // Lettura DHT11
  float t = dht.readTemperature();


  /*
     Chiedo se lo stato del Selettore Stagione su Arduino è su INVERNO per abilitare la Modalità INVERNO
     Se il selettore è in INVERNO invio su MCP23017 la richiesta di CHIUDERE il Relé 1
     Altrimenti il Relé 1 rimane aperto se lo stato era ESTATE
  */

  if (digitalRead(Stagione) == LOW)
  {
    mcp1.digitalWrite(mcp_stag, LOW);
    digitalWrite(ledblu, LOW);
  }
  else
  {
    mcp1.digitalWrite(mcp_stag, HIGH);
    digitalWrite(ledblu, HIGH);
  }

  /* Controllo il riscaldamento dell'abitazione tramite un termostato esterno alimentato a pile.
     Il contatto del termostato è collegato direttamente ad Arduino sul Pin "Clima" con la PULL UP configurata per risparmio cablaggi.
     Funziona solamente se è INVERNO
  */

  if (digitalRead(Clima) == LOW && digitalRead(Stagione) == HIGH)
  {
    mcp1.digitalWrite(mcp_calore, HIGH);

  }
  else
  {
    mcp1.digitalWrite(mcp_calore, LOW);

  }

 

if (sensors.getTempCByIndex(2) <= 50 && sensors.getTempCByIndex(3) <= 50 && digitalRead(Clima) == LOW)
  {
    mcp1.digitalWrite(mcp_forzato, HIGH);
  }

  if (sensors.getTempCByIndex(2) >= 68 || digitalRead(Clima) == HIGH)
  {
    mcp1.digitalWrite(mcp_forzato, LOW);
  }

  mcp1.digitalWrite(mcp_forza, digitalRead(Forza));

  digitalWrite(ledforzato, digitalRead(Forza));
  digitalWrite(ledtermo, mcp1.digitalRead(mcp_termo));
  digitalWrite(ledboll, mcp1.digitalRead(mcp_bollitore));

  /*
    Nel Display 20x4 visualizzo le varie temperature,
    Caldaia sta per la temperatura dello stadio alto del Bollitore
    Solare sta per lo temperatura dello stadio basso del Bollitore
    Mandata sta per la temperatura dell'acuqa nel circuito del riscaldamento
    Ambiente sta per la temperatura dell'ambiente misurata dal DHT11 installato su Arduino
  */

  lcd.setCursor(0, 0);
  lcd.print("Caldaia  ");       // Temperatura del Primario Bollitore da 100 LT
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print((char)223);
  lcd.setCursor(0, 1);
  lcd.print("Solare   ");       // Temperatura del Solare Bollitore da 200 LT
  lcd.print(sensors.getTempCByIndex(1));
  lcd.print((char)223);
  lcd.setCursor(0, 2);
  lcd.print("Mandata  ");       // Temperatura della Mandata dal Pannello Solare al Bollitore da 200 LT
  lcd.print (sensors.getTempCByIndex(2));
  lcd.print((char)223);
  lcd.setCursor(0, 3);
  lcd.print("Ambiente  ");    // Temperatura dell'abitazione
  lcd.print(t);
  lcd.print((char)223);

}

Non ho inserito nessun tempo perché mi dava problemi con gli Extender, si bloccava la comunicazione anche mettendo un delay di 500

Ciao Fabio

Pannello Arduino_1-Model.pdf (111 KB)

Ah, anche il LCD é I2C. Quanto lungo é quel cavo?
Hai misurato la tensione sul MCP23017?
Ti si blocca il LCD anche se scolleghi il P82B715?
Ciao Uwe

uwefed:
Ah, anche il LCD é I2C. Quanto lungo é quel cavo?
Hai misurato la tensione sul MCP23017?
Ti si blocca il LCD anche se scolleghi il P82B715?
Ciao Uwe

La lunghezza del cavo per LCD sarà 10 cm circa.

La prova dello staccare il PB2B715 non l'ho fatta anche perché senza di esso non funziona niente, avrei solo il controllo dei LED e Ingressi su Arduino.

Le tensioni sulla scheda dell'MCP erano sui 4,8 - 4,9 V sui morsetti di alimentazione