| calasci
| Inviato il: 11/05/2019 13:24:21
|
CITAZIONE (Bolle, 16/01/2017 18:21:01 ) 
Vediamo come si interfaccia un convertitore a 16 bit sul nostro arduino.
Questo dispositivo, cioè l' ADS1115, ha anche una preamplificazione settabile a livello SW:
CITAZIONE
Gain 2/3 : VMAX +/-6.144V
Gain 1 : VMAX +/-4.096V
Gain 2 : VMAX +/-2.048V
Gain 4 : VMAX +/-1.024V
Gain 8 : VMAX +/-0.512V
Gain 16 : VMAX +/-0.256V
Questi sono i collegamenti :

cioè occorre collegare la schedina
Schedina = Arduino
Vdd = +5V
GND = GND
SDA = A4
SCL = A5
Questo convertitore ha la possibbilità di interrogare 4 ingressi mediante un multiplexer sempre gestito a livello SW.
Il protocollo con cui comunica con l'arduino è I2C ed è per quello che occorre collegare SDA e SCL.
Il codice di test è questo...ho dovuto mettere i doppi apici sull'include wire.h altrimenti non compilava.
#include "Wire.h"
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads;
void setup(void)
{
Serial.begin(9600);
ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/-6.144V
// ads.setGain(GAIN_ONE); // 1x gain +/-4.096V
// ads.setGain(GAIN_TWO); // 2x gain +/-2.048V
// ads.setGain(GAIN_FOUR); // 4x gain +/-1.024V
// ads.setGain(GAIN_EIGHT); // 8x gain +/-0.512V
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/-0.256V
ads.begin();
}
void loop(void)
{
int16_t adc0, adc1, adc2, adc3;
adc0 = ads.readADC_SingleEnded(0);
Serial.print("CHANNEL 0: ");
Serial.println(adc0);
delay(300);
}
ma lads1115 misura tramite resistenze ?
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calcola
| Inviato il: 12/05/2019 08:57:44
|
Vuoi dire aggiuntive? No, colleghi il modulo alla porta I2C, lo alimenti ed è pronto a leggere gli ingressi analogici
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | calasci
| Inviato il: 12/05/2019 09:09:57
|
CITAZIONE (calcola, 12/05/2019 08:57:44 ) 
Vuoi dire aggiuntive? No, colleghi il modulo alla porta I2C, lo alimenti ed è pronto a leggere gli ingressi analogici
vorrei leggere la tensione dei miei pannelli massimo 38v
devo mettere partitore di tensione , quanto e massimo il valore che leggono ?
e leggere i segnali provenienti da gli acs da 30A A 100 A
grazie
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calcola
| Inviato il: 12/05/2019 21:37:25
|
Quale scheda intendi usare, Arduino, esp8266...
Modificato da calcola - 12/05/2019, 21:42:40
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | calasci
| Inviato il: 12/05/2019 21:46:31
|
CITAZIONE (calcola, 12/05/2019 21:37:25 ) 
Quale scheda intendi usare, Arduino, esp8266...
Sto già usando Arduino mega , con 4 sensori ACS
3 tensioni pannelli
2 bs da 12v ,
Al momento li vedo online con blynk , e su 2 display a 4 righe
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calasci
| Inviato il: 12/05/2019 21:53:25
|
questo e il mio schetch , ci sono riuscito a forza di copia incolla dal web ed e molto incasinato
#include
#include
Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
// COMANDO https://youtu.be/bWvOlyGAD-g
// parte del codice e opera di BOB
// comando uscite blynk https://youtu.be/WcFDtBe8pY4
// https://www.youtube.com/watch?v=bWvOlyGAD-g&feature=youtu.be
// https://youtu.be/bWvOlyGAD-g
// https://youtu.be/YRomluFylXQ
#define BLYNK_PRINT Serial
#include
#include
#include
#include
// camper mega 2 char auth[] = "0df85fb625db655";
char auth[] = "17132af5a9c7";
#define W5100_CS 10
#define SDCARD_CS 4
//blynk DISPLAY
#define bsamp V15 // amper BS
#define bsvolt V14 // volt BS
#define solamp V13 //
#define solvolt V12 //
#define solamp2 V11 //
#define solvolt2 V10 //
#define solamp3 V9 //
#define solvolt3 V8 //
#define bmvolt V7 //
// blynk
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x23, 20, 4);
//const int TENSIONE_BS = A14;
const int AMP_BS = A15;
const int AMP_SOL = A14;
const int AMP_SOL2 = A13;
const int AMP_SOL3 = A12;
//const int TENSIONE_BS = adc0;
const int TENSIONE_BS = A0;
const int TENSIONE_SOL = A1;
const int TENSIONE_SOL2 = A2;
const int TENSIONE_SOL3 = A3;
const int TENSIONE_BM = A4;
double tensioneBS = 0; // valore dove leggerò tensione BS
double tensioneSOL = 0; // valore dove leggerò tensione BS
double tensioneSOL2 = 0; // valore dove leggerò tensione BS
double tensioneSOL3 = 0; // valore dove leggerò tensione BS
double tensioneBM = 0; // valore dove leggerò tensione BM
//CORRENTE
double correnteBS = 0; // valore dove leggerò corrente BS
double correnteSOL = 0; // valore dove leggerò corrente BS
double correnteSOL2 = 0; // valore dove leggerò corrente BS
double correnteSOL3 = 0; // valore dove leggerò corrente BS
// CORRENTE
const double R1 = 10000.0;
const double R2 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensione = (R1 + R2) / R2;
const double R3 = 10000.0;
const double R4 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionesol = (R3 + R4) / R4;
const double R5 = 10000.0;
const double R6 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionesol2 = (R5 + R6) / R6;
const double R7 = 10000.0;
const double R8 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionesol3 = (R7 + R8) / R8;
const double R9 = 10000.0;
const double R10 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionebm = (R9 + R10) / R10;
BlynkTimer timer;
void setup() {
//comando blynk
pinMode(A5,INPUT);
pinMode(A6,INPUT);
pinMode(A7,INPUT);
pinMode(A8,INPUT);
timer.setInterval(300L, leggibt);
// put your setup code here, to run once:
Serial.begin(9600); //per la comunicazione seriale
Serial.println("Hello!");
Serial.println("Getting single-ended readings from AIN0..3");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
// The ADC input range (or gain) can be changed via the following
// functions, but be careful never to exceed VDD +0.3V max, or to
// exceed the upper and lower limits if you adjust the input range!
// Setting these values incorrectly may destroy your ADC!
// ADS1015 ADS1115
// ------- -------
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
ads.begin();
pinMode(SDCARD_CS, OUTPUT);
digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
Blynk.begin(auth);
//timer.setInterval(500L, leggidati);
lcd.begin(); //inizializzazione lcd 16x2
lcd2.begin(); //inizializzazione lcd 16x2
//TENSIONE
pinMode (TENSIONE_BS, INPUT);
pinMode (TENSIONE_SOL, INPUT);
pinMode (TENSIONE_SOL2, INPUT);
pinMode (TENSIONE_SOL3, INPUT);
pinMode (TENSIONE_BM, INPUT);
//TEBNSIONE
pinMode (AMP_BS, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL2, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL3, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
//pinMode (adc0,INPUT);
}
void loop() {
int16_t adc0, adc1, adc2, adc3;
adc0 = ads.readADC_SingleEnded(0);
adc1 = ads.readADC_SingleEnded(1);
adc2 = ads.readADC_SingleEnded(2);
adc3 = ads.readADC_SingleEnded(3);
Serial.print("AIN0: "); Serial.println(adc0);
Serial.print("AIN1: "); Serial.println(adc1);
Serial.print("AIN2: "); Serial.println(adc2);
Serial.print("AIN3: "); Serial.println(adc3);
Serial.println(" ");
Blynk.run();
timer.run();
// AMPEROMETRO
double letturaTensioneInVolt;
letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);
double letturaTensioneInVoltsol;
letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);
double letturaTensioneInVoltsol2;
letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);
double letturaTensioneInVoltsol3;
letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);
//Serial.print(analogRead(AMP_BS) );
//Serial.print( " " );
//Serial.println(letturaTensioneInVolt, 2);
//(tra parentesi, lascia perdere i float, usa i double -- se vuoi ti spiego perché, altrimenti fidati e basta :-)
// a questo punto, applichiamo la conversione: per ACS 100 sono 20mV/A
// quindi
//correnteLetta = (2.5 - letturaTensioneInVolt ) * 1000 / 20;
// moltiplico per 1000 per ottenere la lettura in millivolt, e divido per 20.
// Dato che è 1000/20 è costante semplifico:
double correnteLetta = (2.2999 - letturaTensioneInVolt ) * 50.0; // bs amp
double correnteLettasol = (2.5000 - letturaTensioneInVoltsol ) * 50.0;
double correnteLettasol2 = (2.5000 - letturaTensioneInVoltsol2 ) * 50.0;
double correnteLettasol3 = (2.5000 - letturaTensioneInVoltsol3 ) * 50.0;
//nota: scrivo 50.0 per abitudine, perché in alcune circostanze il compilatore potrebbbe fare divisione fra interi
// adesso il problema è che quel 2.5 è lo zero dell'amperometro.
// con adeguata precisione, potresti usare un piccolo correttivo
// (ad esempio, da un mio schema reale leggo 2.4754)
// nel tuo caso, ti direi di pensarci in futuro, quando avrai ADS1115 per leggere tensioni
// altro punto: la media delle 5 letture significa che devi leggere 5 volte la corrente, soomarla e fare la media.
//quindi:
double sommaTemporanea = correnteLetta;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLetta = (2.5 - letturaTensioneInVolt ) * -50.0;
letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);
sommaTemporanea = sommaTemporanea + correnteLetta;
}
correnteBS = sommaTemporanea / 5.0;
double sommaTemporaneasol = correnteLettasol;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol = (2.5 - letturaTensioneInVoltsol ) * -50.0;
letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);
sommaTemporaneasol = sommaTemporaneasol + correnteLettasol;
}
correnteSOL = sommaTemporaneasol / 5.0;
double sommaTemporaneasol2 = correnteLettasol2;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol2 = (2.5 - letturaTensioneInVoltsol2 ) * -50.0;
letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);
sommaTemporaneasol2 = sommaTemporaneasol2 + correnteLettasol2;
}
correnteSOL2 = sommaTemporaneasol2 / 5.0;
double sommaTemporaneasol3 = correnteLettasol3;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol3 = (2.5 - letturaTensioneInVoltsol3 ) * -50.0;
letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);
sommaTemporaneasol3 = sommaTemporaneasol3 + correnteLettasol3;
}
correnteSOL3 = sommaTemporaneasol3 / 5.0;
// SECONDA PARTE
// la lettura BS diventa
// double tensioneCorretta = tensioneAlPartitore * partitoreTensione ;
// quindi
tensioneBS = (5.0 / 1024 * analogRead(TENSIONE_BS)) * partitoreTensione ;
tensioneSOL = (5.0 / 1024 * analogRead(TENSIONE_SOL)) * partitoreTensionesol ;
tensioneSOL2 = (5.0 / 1024 * analogRead(TENSIONE_SOL2)) * partitoreTensionesol2 ;
tensioneSOL3 = (5.0 / 1024 * analogRead(TENSIONE_SOL3)) * partitoreTensionesol3 ;
tensioneBM = (5.0 / 1024 * analogRead(TENSIONE_BM)) * partitoreTensionebm ;
// STAMPA LCD
lcd.clear(); //pulisci lcd
lcd.setCursor(0, 0); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneBS, 1);
lcd.print(" BS A ");
lcd.print(correnteBS, 1);
lcd.setCursor(0, 1); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL, 1);
lcd.print(" SOL A ");
lcd.print(correnteSOL, 1);
lcd.setCursor(0, 2); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL2, 1);
lcd.print(" SOL2 A ");
lcd.print(correnteSOL2, 1);
lcd.setCursor(0, 3); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL3, 1);
lcd.print(" SOL3 A ");
lcd.print(correnteSOL3, 1);
//lcd.print(adc0, 1);
// 2 LCD
lcd2.clear(); //pulisci lcd
lcd2.setCursor(0, 0); //posiziona il cursore sulla prima linea del display
lcd2.print("V ");
lcd2.print (tensioneBS, 1);
lcd2.print(" A BS ");
lcd2.print(correnteBS, 1);
//pulisci lcd
lcd2.setCursor(0, 1); //posiziona il cursore sulla prima linea del display
lcd2.print("V BM ");
lcd2.print (tensioneBM, 1);
// ********************* DA BOB -- FINE INTERVENTO
delay(250);
//delay(250);
Blynk.run();
timer.run();
}
//void leggidati()
BLYNK_READ(bsamp) //1 amp
{
Blynk.virtualWrite(bsamp, correnteBS);
}
BLYNK_READ(bsvolt) //1 amp
{
Blynk.virtualWrite(bsvolt, tensioneBS);
}
BLYNK_READ(solamp) //1 amp
{
Blynk.virtualWrite(solamp, correnteSOL);
}
BLYNK_READ(solvolt) //1 amp
{
Blynk.virtualWrite(solvolt, tensioneSOL);
}
//2
BLYNK_READ(solamp2) //1 amp
{
Blynk.virtualWrite(solamp2, correnteSOL2);
}
BLYNK_READ(solvolt2) //1 amp
{
Blynk.virtualWrite(solvolt2, tensioneSOL2);
}
BLYNK_READ(solamp3) //1 amp
{
Blynk.virtualWrite(solamp3, correnteSOL3);
}
BLYNK_READ(solvolt3) //1 amp
{
Blynk.virtualWrite(solvolt3, tensioneSOL3);
}
BLYNK_READ(bmvolt) //1 amp
{
Blynk.virtualWrite(bmvolt, tensioneBM);
}
void leggibt()
{
if (digitalRead(A5)){
Blynk.virtualWrite(V5, 255);
} else {
Blynk.virtualWrite(V5, 0);
}
if (digitalRead(A6)){
Blynk.virtualWrite(V6, 255);
} else {
Blynk.virtualWrite(V6, 0);
}
if (digitalRead(A7)){
Blynk.virtualWrite(V4, 255);
} else {
Blynk.virtualWrite(V4, 0);
}
if (digitalRead(A8)){
Blynk.virtualWrite(V3, 255);
} else {
Blynk.virtualWrite(V3, 0);
}
}
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calasci
| Inviato il: 12/05/2019 21:57:43
|
questo e quello che vedo sul cellulare tramite internet
Immagine Allegata: Screenshot_20190512-215047.jpg
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calasci
| Inviato il: 12/05/2019 21:58:06
|
2
Immagine Allegata: Screenshot_20190512-215058.jpg
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calasci
| Inviato il: 12/05/2019 21:58:30
|
3
Immagine Allegata: Screenshot_20190512-215106.jpg
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calcola
| Inviato il: 12/05/2019 22:13:09
|
Se usi un arduino mega o anche un arduino uno, l'acs1115 non ti serve, la scheda ha già tutte le porte analogiche che ti servono. L'espansione è necessaria quando non vi sono le porte analogiche o per applicazioni particolari.
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | calasci
| Inviato il: 12/05/2019 22:34:46
|
CITAZIONE (calcola, 12/05/2019 22:13:09 ) 
Se usi un arduino mega o anche un arduino uno, l'acs1115 non ti serve, la scheda ha già tutte le porte analogiche che ti servono. L'espansione è necessaria quando non vi sono le porte analogiche o per applicazioni particolari.
un amico me lo consigliava per avere una lettura piu precisa .....
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calcola
| Inviato il: 13/05/2019 04:25:45
|
Appunto, è utile per scopi particolari dove la lettura al millesimo fa la differenza, non è il tuo caso. Per leggere la tensione dei pannelli il primo decimale è già sufficiente e lo stesso per la corrente, dove la precisione dipende dall'acs e non è che sia molto preciso.
Il codice per l'arduino devi postarlo con un copia incolla dentro il tag code, quindi prima selezioni il pulsante "code" sul menu' di sinistra e dentro il tag incolli il codice.
Modificato da calcola - 13/05/2019, 04:31:43
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | calasci
| Inviato il: 13/05/2019 07:15:50
|
#include <Adafruit_ADS1015.h>
#include <Blynk.h>
Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
// COMANDO https://youtu.be/bWvOlyGAD-g
// parte del codice e opera di BOB
// comando uscite blynk https://youtu.be/WcFDtBe8pY4
// https://www.youtube.com/watch?v=bWvOlyGAD-g&feature=youtu.be
// https://youtu.be/bWvOlyGAD-g
// https://youtu.be/YRomluFylXQ
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
#include <LiquidCrystal_I2C.h>
// camper mega 2 char auth[] = "7e625db655";
char auth[] = "ed32af5a9c7";
#define W5100_CS 10
#define SDCARD_CS 4
//blynk DISPLAY
#define bsamp V15 // amper BS
#define bsvolt V14 // volt BS
#define solamp V13 //
#define solvolt V12 //
#define solamp2 V11 //
#define solvolt2 V10 //
#define solamp3 V9 //
#define solvolt3 V8 //
#define bmvolt V7 //
// blynk
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x23, 20, 4);
//const int TENSIONE_BS = A14;
const int AMP_BS = A15;
const int AMP_SOL = A14;
const int AMP_SOL2 = A13;
const int AMP_SOL3 = A12;
//const int TENSIONE_BS = adc0;
const int TENSIONE_BS = A0;
const int TENSIONE_SOL = A1;
const int TENSIONE_SOL2 = A2;
const int TENSIONE_SOL3 = A3;
const int TENSIONE_BM = A4;
double tensioneBS = 0; // valore dove leggerò tensione BS
double tensioneSOL = 0; // valore dove leggerò tensione BS
double tensioneSOL2 = 0; // valore dove leggerò tensione BS
double tensioneSOL3 = 0; // valore dove leggerò tensione BS
double tensioneBM = 0; // valore dove leggerò tensione BM
//CORRENTE
double correnteBS = 0; // valore dove leggerò corrente BS
double correnteSOL = 0; // valore dove leggerò corrente BS
double correnteSOL2 = 0; // valore dove leggerò corrente BS
double correnteSOL3 = 0; // valore dove leggerò corrente BS
// CORRENTE
const double R1 = 10000.0;
const double R2 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensione = (R1 + R2) / R2;
const double R3 = 10000.0;
const double R4 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionesol = (R3 + R4) / R4;
const double R5 = 10000.0;
const double R6 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionesol2 = (R5 + R6) / R6;
const double R7 = 10000.0;
const double R8 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionesol3 = (R7 + R8) / R8;
const double R9 = 10000.0;
const double R10 = 1265.0; // EFFETTUARE TARATURA
// se hai multimetro di precisione, puoi cambiare il secondo valore, io lo spostai di 7 (SETTE) ohm
const double partitoreTensionebm = (R9 + R10) / R10;
BlynkTimer timer;
void setup() {
//comando blynk
pinMode(A5,INPUT);
pinMode(A6,INPUT);
pinMode(A7,INPUT);
pinMode(A8,INPUT);
timer.setInterval(300L, leggibt);
// put your setup code here, to run once:
Serial.begin(9600); //per la comunicazione seriale
Serial.println("Hello!");
Serial.println("Getting single-ended readings from AIN0..3");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
// The ADC input range (or gain) can be changed via the following
// functions, but be careful never to exceed VDD +0.3V max, or to
// exceed the upper and lower limits if you adjust the input range!
// Setting these values incorrectly may destroy your ADC!
// ADS1015 ADS1115
// ------- -------
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
ads.begin();
pinMode(SDCARD_CS, OUTPUT);
digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
Blynk.begin(auth);
//timer.setInterval(500L, leggidati);
lcd.begin(); //inizializzazione lcd 16x2
lcd2.begin(); //inizializzazione lcd 16x2
//TENSIONE
pinMode (TENSIONE_BS, INPUT);
pinMode (TENSIONE_SOL, INPUT);
pinMode (TENSIONE_SOL2, INPUT);
pinMode (TENSIONE_SOL3, INPUT);
pinMode (TENSIONE_BM, INPUT);
//TEBNSIONE
pinMode (AMP_BS, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL2, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
pinMode (AMP_SOL3, INPUT); //necessario per essere sicuro che siano pronti a leggere valori
//pinMode (adc0,INPUT);
}
void loop() {
int16_t adc0, adc1, adc2, adc3;
adc0 = ads.readADC_SingleEnded(0);
adc1 = ads.readADC_SingleEnded(1);
adc2 = ads.readADC_SingleEnded(2);
adc3 = ads.readADC_SingleEnded(3);
Serial.print("AIN0: "); Serial.println(adc0);
Serial.print("AIN1: "); Serial.println(adc1);
Serial.print("AIN2: "); Serial.println(adc2);
Serial.print("AIN3: "); Serial.println(adc3);
Serial.println(" ");
Blynk.run();
timer.run();
// AMPEROMETRO
double letturaTensioneInVolt;
letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);
double letturaTensioneInVoltsol;
letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);
double letturaTensioneInVoltsol2;
letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);
double letturaTensioneInVoltsol3;
letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);
//Serial.print(analogRead(AMP_BS) );
//Serial.print( " " );
//Serial.println(letturaTensioneInVolt, 2);
//(tra parentesi, lascia perdere i float, usa i double -- se vuoi ti spiego perché, altrimenti fidati e basta :-)
// a questo punto, applichiamo la conversione: per ACS 100 sono 20mV/A
// quindi
//correnteLetta = (2.5 - letturaTensioneInVolt ) * 1000 / 20;
// moltiplico per 1000 per ottenere la lettura in millivolt, e divido per 20.
// Dato che è 1000/20 è costante semplifico:
double correnteLetta = (2.2999 - letturaTensioneInVolt ) * 50.0; // bs amp
double correnteLettasol = (2.5000 - letturaTensioneInVoltsol ) * 50.0;
double correnteLettasol2 = (2.5000 - letturaTensioneInVoltsol2 ) * 50.0;
double correnteLettasol3 = (2.5000 - letturaTensioneInVoltsol3 ) * 50.0;
//nota: scrivo 50.0 per abitudine, perché in alcune circostanze il compilatore potrebbbe fare divisione fra interi
// adesso il problema è che quel 2.5 è lo zero dell'amperometro.
// con adeguata precisione, potresti usare un piccolo correttivo
// (ad esempio, da un mio schema reale leggo 2.4754)
// nel tuo caso, ti direi di pensarci in futuro, quando avrai ADS1115 per leggere tensioni
// altro punto: la media delle 5 letture significa che devi leggere 5 volte la corrente, soomarla e fare la media.
//quindi:
double sommaTemporanea = correnteLetta;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLetta = (2.5 - letturaTensioneInVolt ) * -50.0;
letturaTensioneInVolt = 5.0 / 1024 * analogRead(AMP_BS);
sommaTemporanea = sommaTemporanea + correnteLetta;
}
correnteBS = sommaTemporanea / 5.0;
double sommaTemporaneasol = correnteLettasol;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol = (2.5 - letturaTensioneInVoltsol ) * -50.0;
letturaTensioneInVoltsol = 5.0 / 1024 * analogRead(AMP_SOL);
sommaTemporaneasol = sommaTemporaneasol + correnteLettasol;
}
correnteSOL = sommaTemporaneasol / 5.0;
double sommaTemporaneasol2 = correnteLettasol2;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol2 = (2.5 - letturaTensioneInVoltsol2 ) * -50.0;
letturaTensioneInVoltsol2 = 5.0 / 1024 * analogRead(AMP_SOL2);
sommaTemporaneasol2 = sommaTemporaneasol2 + correnteLettasol2;
}
correnteSOL2 = sommaTemporaneasol2 / 5.0;
double sommaTemporaneasol3 = correnteLettasol3;
for (int i = 0; i < 4; i++) { //ancora 4 letture, la prima l'ha fatta sopra
correnteLettasol3 = (2.5 - letturaTensioneInVoltsol3 ) * -50.0;
letturaTensioneInVoltsol3 = 5.0 / 1024 * analogRead(AMP_SOL3);
sommaTemporaneasol3 = sommaTemporaneasol3 + correnteLettasol3;
}
correnteSOL3 = sommaTemporaneasol3 / 5.0;
// SECONDA PARTE
// la lettura BS diventa
// double tensioneCorretta = tensioneAlPartitore * partitoreTensione ;
// quindi
tensioneBS = (5.0 / 1024 * analogRead(TENSIONE_BS)) * partitoreTensione ;
tensioneSOL = (5.0 / 1024 * analogRead(TENSIONE_SOL)) * partitoreTensionesol ;
tensioneSOL2 = (5.0 / 1024 * analogRead(TENSIONE_SOL2)) * partitoreTensionesol2 ;
tensioneSOL3 = (5.0 / 1024 * analogRead(TENSIONE_SOL3)) * partitoreTensionesol3 ;
tensioneBM = (5.0 / 1024 * analogRead(TENSIONE_BM)) * partitoreTensionebm ;
// STAMPA LCD
lcd.clear(); //pulisci lcd
lcd.setCursor(0, 0); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneBS, 1);
lcd.print(" BS A ");
lcd.print(correnteBS, 1);
lcd.setCursor(0, 1); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL, 1);
lcd.print(" SOL A ");
lcd.print(correnteSOL, 1);
lcd.setCursor(0, 2); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL2, 1);
lcd.print(" SOL2 A ");
lcd.print(correnteSOL2, 1);
lcd.setCursor(0, 3); //posiziona il cursore sulla prima linea del display
lcd.print("V ");
lcd.print (tensioneSOL3, 1);
lcd.print(" SOL3 A ");
lcd.print(correnteSOL3, 1);
//lcd.print(adc0, 1);
// 2 LCD
lcd2.clear(); //pulisci lcd
lcd2.setCursor(0, 0); //posiziona il cursore sulla prima linea del display
lcd2.print("V ");
lcd2.print (tensioneBS, 1);
lcd2.print(" A BS ");
lcd2.print(correnteBS, 1);
//pulisci lcd
lcd2.setCursor(0, 1); //posiziona il cursore sulla prima linea del display
lcd2.print("V BM ");
lcd2.print (tensioneBM, 1);
// ********************* DA BOB -- FINE INTERVENTO
delay(250);
//delay(250);
Blynk.run();
timer.run();
}
//void leggidati()
BLYNK_READ(bsamp) //1 amp
{
Blynk.virtualWrite(bsamp, correnteBS);
}
BLYNK_READ(bsvolt) //1 amp
{
Blynk.virtualWrite(bsvolt, tensioneBS);
}
BLYNK_READ(solamp) //1 amp
{
Blynk.virtualWrite(solamp, correnteSOL);
}
BLYNK_READ(solvolt) //1 amp
{
Blynk.virtualWrite(solvolt, tensioneSOL);
}
//2
BLYNK_READ(solamp2) //1 amp
{
Blynk.virtualWrite(solamp2, correnteSOL2);
}
BLYNK_READ(solvolt2) //1 amp
{
Blynk.virtualWrite(solvolt2, tensioneSOL2);
}
BLYNK_READ(solamp3) //1 amp
{
Blynk.virtualWrite(solamp3, correnteSOL3);
}
BLYNK_READ(solvolt3) //1 amp
{
Blynk.virtualWrite(solvolt3, tensioneSOL3);
}
BLYNK_READ(bmvolt) //1 amp
{
Blynk.virtualWrite(bmvolt, tensioneBM);
}
void leggibt()
{
if (digitalRead(A5)){
Blynk.virtualWrite(V5, 255);
} else {
Blynk.virtualWrite(V5, 0);
}
if (digitalRead(A6)){
Blynk.virtualWrite(V6, 255);
} else {
Blynk.virtualWrite(V6, 0);
}
if (digitalRead(A7)){
Blynk.virtualWrite(V4, 255);
} else {
Blynk.virtualWrite(V4, 0);
}
if (digitalRead(A8)){
Blynk.virtualWrite(V3, 255);
} else {
Blynk.virtualWrite(V3, 0);
}
}
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| | | | calasci
| Inviato il: 13/05/2019 07:17:53
|
CITAZIONE (calcola, 13/05/2019 04:25:45 ) 
Appunto, è utile per scopi particolari dove la lettura al millesimo fa la differenza, non è il tuo caso. Per leggere la tensione dei pannelli il primo decimale è già sufficiente e lo stesso per la corrente, dove la precisione dipende dall'acs e non è che sia molto preciso.
Il codice per l'arduino devi postarlo con un copia incolla dentro il tag code, quindi prima selezioni il pulsante "code" sul menu' di sinistra e dentro il tag incolli il codice.
dovrei aumentare i sensori per aggiungere sonde temperature ,il mio problema e che non riesco a fare la media del ads1115,
--------------- Impianto camper 24v 4 x 500w solare 280A LIFEPO 4 EASUN REGOLATORE SOLARE 8048
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|