Hulp gevraagd voor een Accutester

Heren,

Ik ben met een projectje bezig om van 4 accu’s de spanning af te lezen.
Ik wil echter achter de spanning op het LCD scherm (20X4) ook het aantal % kunnen aflezen.
Deze moet echter aan de volgende criteria voldoen.

14,4 volt is 100 %
14 Volt is 92%
13 Volt is 74 %
12 Volt is 55.5 %
11 Volt is 37 %
10 Volt is 18,5 %
En 9 volt is 0%, na 9 volt wilt de BB motor (elec.) niet meer draaien.

Onderstaand de code die ik gebruik zonder de procenten.
Kunnen jullie voor mij dat stukje code aanleveren zodat ik ook de procenten kan aflezen?

In de bijlage een JPG bestand van het schema dat ik gebruik.
De weerstanden zijn 10K en 100K

Alvast bedankt

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

int analogInput1 = A0; // Accu 1
float vout1 = 0.0;
float vin1 = 0.0;
float R1 = 100000.0;
float R2 = 10000.0; 
int value1 = 0;

int analogInput2 = A1; // Accu 2
float vout2 = 0.0;
float vin2 = 0.0;
float R3 = 100000.0; 
float R4 = 10000.0; 
int value2 = 0;

int analogInput3 = A2; // Accu 3
float vout3 = 0.0;
float vin3 = 0.0;
float R5 = 100000.0; 
float R6 = 10000.0; 
int value3 = 0;

int analogInput4 = A3; // Accu 4
float vout4 = 0.0;
float vin4 = 0.0;
float R7 = 100000.0; 
float R8 = 10000.0; 
int value4 = 0;

void setup(){
  pinMode(analogInput1, INPUT); //Accu 1
  pinMode(analogInput2, INPUT); //Accu 2
  pinMode(analogInput3, INPUT); //Accu 3
  pinMode(analogInput4, INPUT); //Accu 4
  lcd.begin(20, 4);
}
void loop(){
 // read the value at analog inputs
 value1 = analogRead(analogInput1);
 value2 = analogRead(analogInput2);
 value3 = analogRead(analogInput3);
 value4 = analogRead(analogInput4);
 //===============================
 vout1 = (value1 * 5.0) / 1024.0;
 vout2 = (value2 * 5.0) / 1024.0;
 vout3 = (value3 * 5.0) / 1024.0;
 vout4 = (value4 * 5.0) / 1024.0;
 //===============================
 vin1 = vout1 / (R2/(R1+R2));
 vin2 = vout2 / (R4/(R3+R4)); 
 vin3 = vout3 / (R6/(R5+R6));
 vin4 = vout4 / (R8/(R7+R8)); 
 //===============================
 if (vin1<0.09) {
 if (vin2<0.09) {
 if (vin3<0.09) {
 if (vin4<0.09) {
 //===============================
 vin1=0.0;
 vin2=0.0;
 vin3=0.0;
 vin4=0.0;
//================================

} } } }

//Accu 1
lcd.setCursor(0, 0);
lcd.print("BAT 1 V= ");
lcd.print(vin1);

// Accu 2
lcd.setCursor(0, 1);
lcd.print("BAT 2 V= ");
lcd.print(vin2);

// Accu 3
lcd.setCursor(0, 2);
lcd.print("BAT 3 V= ");
lcd.print(vin3);

//Accu 4
lcd.setCursor(0, 3);
lcd.print("BAT 4 V= ");
lcd.print(vin4);

delay(5000);
}
/[CODE]

Allereerst een grote tip. De IDE doet best wel wat moeite om je te helpen met de opmaak van de code. Ga dit niet tegen. Druk maar eens Ctrl+T en zie hoeveel overzichtelijker de code wordt.

Daarnaast, heb je gehoord van array’s?
Daarnaast, heb je gehoord van array’s?
Daarnaast, heb je gehoord van array’s?
Daarnaast, heb je gehoord van array’s?
(Je snapt de grap als je array’s snapt :wink: ) Hou je denk ik nog maar 20 regels code over.

Ook is het leuk dat je de Arduino al het rekenwerk laat doen maar zeker in float berekeningen is de Arduino verschrikkelijk slecht! Dus al dat gedoe met de weerstandswaardes kan je beter achter wegen laten. En nog beter, gebruik geen float :wink:

En alles afronden naar 0 als het lager dan 0,09V is is ook niet heel logisch. Zeker niet omdat je het alleen doet als ALLE 4 de batterijen onder de 0,09V zijn. Heb je nog een voltage als je de meet draden aan GND hangt ipv de accu (dus een 0V accu) en je hebt dan nog een voltage dan heb je eerder last van een offset over de hele range.

En dan naar percentage. Omgeschreven naar een formule kom je neer op 18,5% per volt vanaf 14,4V. Percentage is dan:
if(v > 14.4) => 100%
if(v < 9) => 0%
else % = 100 - ((14.4 - v) x 18.5) =(simpeler geschreven) v x 18.5 - 166.4

Oké

In de array’s ga ik mij eens in verdiepen.
Scheelt dan een hele hoop regels.
Ik heb control T gedaan en inderdaad gaat de code er wat anders uitzien waardoor het overzichterlijker wordt.
Bedankt voor de tip.

Ik ben geen programmeur, het kost mij een heleboel hoofdbrekens om dit wat ik gedaan heb te realiseren en heb de code dan ook van het internet afgehaald en na wat aanpassingen geschikt gemaakt voor wat ik wil. Of het goed is en of correct geschreven daar weet ik niets van helaas.
heb een aantal boeken gekocht waar ik al diverse bruikbare dingen heb uitgehaald en na heel wat mislukkingen en soms wat geluk dan doet de Arduino wat ik wil :slight_smile:

Kan en wilt u de code voor de procenten in Accu 1 kunnen zetten?
Zodat ik kan zien wat er gebeurt als ik de sketch upload en het dan kan begrijpen,
na de sketch bestudeerd te hebben?

Bij voorbaat mijn dank!

Ik ben helemaal geen voorstander van float (in arduino code) maar ...
gezien je achtergrond,
gezien de delay (5000) in je loop

is mijn advies aan jou om je (voorlopig) over die float niet druk te maken

Verder is een project doen wel een leuke manier om iets te leren maar de voorbeelden (meegeleverd met de arduino IDE) doorlopen is in mijn ogen toch een "betere" manier.

Met vriendelijke groet
Jantje

In echte code voor vin (welke je pakt is aan jou) zou dat zijn:

if(vin > 14.4){
  percentage = 100;
}
else if(vin < 9){
  percentage = 0;
}
else{
  percentage = vin * 18.5 - 166.4;
}

Ik ben het wel met Jantje eens dat je de floats nu welk kunt laten maar dat het denk ik wel erg leerzaam is om in de loop te proberen er van af te komen. Naar mijn mening zouden Arduino tutorials niet zo snel naar float moeten grijpen en duidelijk moeten maken dat een float niet simpelweg een decimaalteken betekend. En helaas is de out of the box ondersteuning binnen Arduino van fixed point niet aanwezig.

Maar als je wat inzicht hebt in arrays dan kunnen we je altijd verder helpen om te leren :slight_smile:

Super! :smiley:

Ik heb je code erin gezet en hij laat netjes de procenten zien, hartelijk bedankt daarvoor.

Vraagje; hoe kom je aan het getal van 166.4 ??

Kijkende naar de getallen die je eerder noemde zag ik een mooie helling van 18,5%/Volt vanaf 14,4V wat 100% moet zijn. Dus in formule vorm geeft dat dus 100 - ((14,4 - vin) x 18,5)
14,4 - vin is het verschil in volt tussen max/100% en de waarde.
Daarna dat maal 18,5 omdat het aantal procent per volt is.
En van 100 afgetrokken omdat het het aantal procent minder dan 100 is.

Maar als je de haakjes weg schrijft (wiskunde) heb je
100 - ((14,4 - vin) x 18,5) = 100 - (vin x 18,5 - 266,4) = v x 18.5 - 166.4

Ik had het ook vanaf de 9V kunnen benaderen:
(vin - 9) x 18,5
Haakjes wegwerken geeft:
vin x 18,5 - 166,5

Klein verschil (166,5 tegen 166,4) doordat de lijn niet je schetste niet 100% lineair is en je een kleine afronding hebt.

lekker basis, maar het werkt prima.
meet de weerstanden en zet de echte waarden in je programma dat is een stuk preciezer.
dan voor je%
eigenlijk is dat geen rechte lijn, maar een kromme.
maak een array met de waarden van voltages en procenten.
dn heb je al een redelijk zicht, gewoon bepalen tussen welke 2 punten het voltage valt.
dan tussen de waarden eronder en erboven interpolatie gebruiken, dat is dus een rechte lijn bijv 12 en 13 volt.
dan krijg je dus een hele goede benadering van de percentages.
zorg wel voor dat de gnd op de goede plaats zit, je kunt bijvoorbeeld geen twee cellen naast elkaar meten.
als je ook de stroom meet dan heb je een nog beter beeld van het vermogen.

Weerstanden meten kan maar als je 1% weerstanden hebt gebruikt niet de moeite waard. Ik zou zelf juist absoluut de weerstand waardes UIT me programma willen hebben en daarnaast overstappen op fixed point berekeningen.

En ja, een kromme zou het percentage waarschijnlijk beter benaderen. Ik ben puur afgegaan op de gegevens gegeven door de TS. En dat is toch echt een rechte lijn (binnen de afronding). Maakt het wel een stuk makkelijker dan een krommen met een look up en interpolatie. :smiley: Absoluut niet onmogelijk hoor.