Consiglio cablaggio sensori di livello

Buonasera,
sto valutando la migliore soluzione per cablare alcuni sensori di livello che utilizzo per verificare la quantità di acqua present all'interno di alcuni acquari.
Sto utilizzando il sensore con un BJT, come proposto qua: Semplicissimo Sensore di Livello / Pioggia / Allagamenti / Touch / Altro a singolo transistor – CORRETTO 03/10/2012 | Elettronica & Arduino

Il sistema funziona e sto passando alla realizzazione pratica.
Ho la necessita di avere due sensori di livello per ogni vasca, per circa 10-15 vasche, per un totale, dunque, di circa 30 segnali. Le vasche sono disposte in una stanza, la più distante a 8-10 m dalla scatola con Arduino.

Ho pensato a cablare il tutto con vari cavi Ethernet, ch porterò in giro con tubi e scatole elettriche.

Dato che si tratta di un semplice segnale digitale in continua, posso optare per un cavo UTP?
Potrebbe creare problemi l'assenza di schermatura?

Grazie

Nessun problema per l'uso di un cavo UTP.

Anzi, in questo modo puoi alimentare tutti i tuoi sensori usando la coppia di fili inutilizzata ed una sola batteria da 9V od un alimentatore da 9V con un condensatore elettrolitico da 470μF in parallelo.

Un batteria alcalina da 9V carica eroga circa 200mA per 1 ora e, considerando un assorbimento di 10mA per ogni LED, tutti i circuiti assorbiranno al massimo 30 x 10 = 300mA, nell'improbabile caso in cui tutti i LED siano accesi contemporaneamente: meglio dunque usare l'alimentatore.

Gentile cyberhs,
grazie per la risposta, opterò, allora, per ethernet UTP.
Ho, comunque, un altro problema:
Ogni vasca, attualmente, dovrebbe avere due livelli: uno "target" ed uno "troppo pieno".
Ogni vasca possiede un circuito con il Darlington per il livello di target, mentre tutte le vasche hanno in comune un solo circuito per il "troppo pieno", ossia, non mi interessa sapere quale vasca è troppo piena, se anche solo una delle vasche è troppo piena, parte il comando all'elettrovalvola (9V) che blocca l'afflusso d'acqua (il circuito di rabbocco è comune a tutte le vasche).
(In un prossimo futuro aggiungerò un terzo sensore ad ogni vasca per fare due soglie target, diciamo targetLow e targetHigh, per evitare spiacevoli effetti quando l'acqua evapora e raggiungere il livello di target).

Il sistema funziona perfettamente quando Arduino è alimentato tramite USB dal pc, mentre si comporta in modo strano quando uso alimentatori da 5V o 9V (Arduino si resetta continuamente oppure vengono rilevati valori "casuali" dai sensori di livello).

E' possibile che sia un problema di alimentazione? Con i condensatori che hai citato, potrei risolvere il problema?

P.S.: il sistema emette una serie di beep al raggiungimento del target, per avvisare del riempimento della vasca.

Ti ringrazio.

Probabilmente è un problema di alimentazione, ma per esserne sicuro e risolvere il problema, dovresti mostrarmi lo schema che stai usando.

Allora, questa è una bozza dell'installazione:

https://drive.google.com/open?id=0B7nY_lPfJGciOGN4d0hCd1k3R0E

Il motore è in realtà l'elettrovalvola.
Lo switch è utilizzato per inserire la modalità "muto" o meno.
I sensori a BJT sono collegati secondo lo schema del sito postato all'inizio del topic.

Il progetto ha anche una shield ethernet per visualizzare lo stato delle vasche da remoto.
Tutto funzionava perfettamente con un alimentatore a 12V (con 4 diodi in serie per avere 9V) ad alimentare l'elettrovalvola e Arduino alimentato da USB.
Ora, provando senza l'elettrovalvola, il sistema è del tutto instabile.

Nel caso possa servire, posto anche il codice (senza Ethernet).

/*

  • CONFIGURATION
    */

const int NSENSORS = 15;
//PINS
const int buzzerPin = 12;
const int stopLevelPin = 45;
const int openValvePin = 22;
const int closeValvePin = 23;
const int redPin = 2;
const int greenPin = 3;
const int bluePin = 4;
const int muteSwitchPin = 5;
//
int firstTargetPin = 30; //targetPin = 30, 31, 32, ...
int targetBeepCount = 3;
int stopBeepCount = 5;
int loopDelay = 1000;
bool resetNeeded = 0;
bool mute = 0;
bool prevStopState;
bool prevTargetState[NSENSORS];
int targetLevelPin[NSENSORS];
int targetLevel[NSENSORS];

void setup() {
mute = digitalRead(muteSwitchPin);

pinMode(buzzerPin, OUTPUT);
pinMode(stopLevelPin, INPUT);
pinMode(openValvePin, OUTPUT);
pinMode(closeValvePin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(muteSwitchPin, INPUT);

for (int i = 0; i < 3; i++) {
if (!mute) {
setColor(0, 255, 0);
beep(buzzerPin, 1768, 50);
setColor(0, 0, 0);
} else {
setColor(0, 0, 255);
delay(50);
setColor(0, 0, 0);
}
delay(100);

}

for (int i = 0; i < NSENSORS; i++) {
pinMode(targetLevelPin*, INPUT);*
(digitalRead(targetLevelPin) == LOW) ? (prevTargetState = 0) : (prevTargetState = 1);
* }*
* (digitalRead(stopLevelPin) == LOW) ? (prevStopState = 0) : (prevStopState = 1);*
* if (digitalRead(stopLevelPin) == HIGH) { //Below max level*
* digitalWrite(openValvePin, HIGH);*
* delay(50);*
* digitalWrite(openValvePin, LOW);*
* } else { //Max level reached*
* resetNeeded = 1;*
* setColor(255, 0, 0);*
* digitalWrite(closeValvePin, HIGH);*
* delay(50);*
* digitalWrite(closeValvePin, LOW);*
* if (!mute)*
* beepnTimes(stopBeepCount, 100);*
* }*
* for (int i = 0; i < NSENSORS; i++) {*
_ targetLevelPin = firstTargetPin + i;
* }
delay(1000);
}
void loop() {
mute = digitalRead(muteSwitchPin);
if (!resetNeeded) {
if (!mute) {
setColor(0, 255, 0);
} else {
setColor(0, 0, 255);
}
}
if (digitalRead(stopLevelPin) == LOW && prevStopState == 1) { //Max Level reached -STOPPO TUTTO-
resetNeeded = 1;
digitalWrite(closeValvePin, HIGH);
delay(50);
digitalWrite(closeValvePin, LOW);
//setColor(160, 190, 0);
setColor(255, 0, 0);
if (!mute)
beepnTimes(stopBeepCount, 100);
//beep(buzzerPin, 5000, 50); // buzz the buzzer on pin 4 at 2500Hz for 500 milliseconds*

* prevStopState = 0;
}
////////////////////
for (int i = 0; i < NSENSORS; i++) {_

targetLevel _= digitalRead(targetLevelPin);
if (targetLevel == LOW && prevTargetState == 1 && !resetNeeded) { //target level reached
setColor(0, 0, 0);
setColor(120, 255, 255);
prevTargetState = 0;
if (!mute) {
beepnTimes(targetBeepCount, 1000);
} else {
delay(targetBeepCount * 1000);
}
}
if (targetLevel == HIGH) { //below target
prevTargetState = 1;
}
}
delay(100);
if (!resetNeeded)
setColor(0, 0, 0);
delay(loopDelay);
}
[/quote]*_

Non riesco a vedere lo schema: è richiesta una password.

1 - const int sostituiscili con const byte
2 - bool sostituiscili con boolean

Ora dovrebbe andare: https://drive.google.com/file/d/0B7nY_lPfJGciOGN4d0hCd1k3R0E/view?usp=sharing

Sì. ora riesco a vedere il layout di Fritzing, ma a quanto vedo ci sono alcuni errori.

Meglio se mi fai vedere lo schema di Fritzing oppure fatto a penna.

1 - alimenti il ponte a 9V, ma il GND di Arduino non è collegato al negativo dei 9V.

2 - i due bus di alimentazione superiore ed inferiore non sono collegati tra loro, anche se credo che siano collegati tra loro e forse ai +5V ed al GND di arduino

3 - Arduino lavora a 5V e tu colleghi il LED ai 9V usando le uscite 2, 3 e 4 rischiando di bruciare le relative porte.

Allora:

  1. I GND dell'alimentatore e di Arduino sono comuni (anche se non rappresentato nello schema).
  2. Sì, ovviamente i bus della breadboard sono alimentati.
  3. Il LED è alimentato dalle porte digitali a 5V, non capisco perché dici che sono a 9V!

A parte questo, ho provato il sistema nella stanza degli acquari senza l'elettrovalvola e ponte H (quindi il problema non è di certo quello).

Il prototipo era completamente funzionante (anche con elettrovalvola), ma solo perché alimentato tramite USB da PC. Se alimentato tramite alimentatore a ) 9V/12V oppure tramite USB, ma dalla presa della corrente, non funziona.

Grazie.

Ok per il punto 3: mi sono sbagliato.

Ricapitolando, nella versione funzionante usi due alimentazioni, una a 5V per la MEGA attraverso il collegamento con il PC ed una a 9V per il ponte H attraverso una pila/alimentatore a 9V.

Se è così, il fatto di usare il jack con un altro alimentatore da 9V 1 o 2A al posto della USB del PC, non dovrebbe comportare alcun problema.

Verifica le connessioni sulla breadboard, poiché è facile che non forniscano un contatto sicuro.

Hai usato un ponte H perché l'elettrovalvola è motorizzata?

Grazie ancora per le risposte ed auguri per questo nuovo anno.
Sì, ho usato Arduino alimentato da PC via USB ed un alimentatore a 12V con 4 diodi in serie, solo per fornire 9V, non avendo a disposizione un alimentatore a 9V.

Nella versione "definitiva" (ossia nella stanza degli acquari), ho provato la versione senza elettrovalvola, perfettamente funzionante se alimentata da USB, appena alimentata via alimentatore oppure via USB ma non tramite PC, smette di funzionare. Se ricollegata tramite PC via USB, tac! Ritorna a funzionare.
Mi pare strano...

Ho usato il ponte H per pilotare la valvola bistabile, non so se si possa fare, ma mi pare che funzioni per il mio scopo, ossia fornire +/- 9V.

Che alimentatore hai collegato al jack?

Se, invece, hai collegato un alimentatore USB a 5V, è possibile che sia molto "rumoroso", ovvero con un ripple elevato.

In entrambi i casi, prova a mettere un condensatore elettrolitico da 470μF ed un condensatore ceramico da 100nF in parallelo all'alimentazione, cioè tra +5V e GND, rispettando ovviamente le polarità.