Heb vanmiddag de ardiuno nano (namaak) besteld ,
Samen met een mini Oled display en een step down converter van 5 tot 40V naar 5V 3A stabiel.
heb een goede collega die me wel wou helpen met programeren. want
daar snap ik niets van.
bedankt voor de hulp , en het eind product zal zeker een foto van gemaakt worden.
dat programmeren valt super reuze mee hoor.
een paar van de basic programmatjes inladen en naar eigen wens wat aanpassen om te begrijpen.
loop je vast, kom je hier vragen stellen, hulp is hier ook genoeg aanwezig.
dan even een oefening erin waarmee je een led feller of minder fel laat branden aan de hand van een pot meter, daar lees je al een input inlezen en omzetten naar een output.
dan maak je eens wat default scherm programmas (de examples van je display library) en pas die eens naar wens aan.
en voor je het weet ben je een fuel meter aan het schrijven. ik denk dat dit bij mij ook één van de eerste programmas was
heel basic begon ik met het inlezen van de accuspanning waarmee ik de arduino zelf voede
denk dat dit resultaat al was na een voormiddag spelen. het gaat dus heel snel hoor.
daarna een noàkio scherm erbij als display
PS: DIT zou ik zeker ook doen bij u. bij een oldtimer is het altijd handig om de laadspanning van de dynamo te zien zodat je falen ervan op tijd opmerkt
de arduino hangt al aan het boordnet, 2 weerstanden en 3regels code en je hebt de voltmeter ook geintegreerd.
motortemperatuur had ik ook, maar dit is meer ter info. temperatuursensoren zijn hyperbolen, en dus enorm moeilijk om in te lezen en programmeren (toch als je precieze waardes wil)
[Bericht gewijzigd door fcapri op (11%)]
"temperatuursensoren zijn hyperbolen, en dus enorm moeilijk om in te lezen en programmeren (toch als je precieze waardes wil)"
Daar is toch die "map"functie voor?
Douwe
dat lukt zomaar niet.
map linkt tussen 2 punten.
bv 10 ohm is 10L
100ohm is 55L
dan berekent die lineair dat 40ohm dan zal overeenkomen met 25liter.
hyperbool werkt zo niet.
temp sensor golf bv
20° = 2500ohm
90° = 200ohm
dan zou de map fuctie zeggen, 70° verschil is 2300ohm verschil. elke graad is dan 32ohm verschil.
dus 80° is 10° lager oftewel 320ohm meer.
200ohm + 320 ohm = 520ohm en das fout, 80° is maar 300ohm
520ohm komt overeen met 60°
dus ofwel moet je 6 verschillende stukken map maken, maar daar zit telkens weer een afwijking in
zou ik 2 punten nemen, bv 0° en 50°, dan kom je negatieve weerstand uit op 90° (paarse lijn)
prima toch.
en met een usb kabeltje kan je altijd een update doen om nieuwe mogelijkheden te maken (chiptuning in een jaren 50 dodge
)
Die displays gebruikte ik op het einde om in te werken in een knop
neem zeker voldoende fotos van je project, altijd leuk om naar terug te kijken later
[Bericht gewijzigd door fcapri op (49%)]
Aan een Mustang '65 gewerkt gehad, uiteindelijk de volt van die stabilisator gevonden en dat was 5 volt. Denkelijk reed men vroeger met 6 volt accu's. Anders klopt niks van temp of benzinepeil.
De Opels erna hadden een hogere voltage op die meters.
hangt een beetje van merk tot merk af. maar zolang je een stabiele spanning hebt maakt het weinig uit.
bij mijn VW was het 10V, bij ford is het 9V als ik me goed herinner.
die 9V staat over de benzinemeter en vlotter in serie. benzinemeter is een bimetaal.
stel 9V:
stand 1: 4V over de sender, 5V over de voltmeter, de meter wijkt ver uit (volle tank)
stand 2: 8V over de sender, 1V over de voltmeter, meter wijkt weinig uit, tank bijna leeg.
doe je dat op 5V, is gewoon de weerstandswaarde van de sender anders.
stand 1: 4V over de sender, 1V over de voltmeter, meter wijkt niet uit, tank is leeg
stand 2: 1V over de sender, 4V over de voltmeter, meter wijkt veel uit, tank vol.
je hebt senders die van 90 ohm naar 0 ohm gaan, maar ook die van 0ohm naar 90 ohm gaan.
je hebt er tussen 25 en 150 ohm (ford usa)
je hebt er tussen 240 ohm en 30 ohm
al die dingen bepalen welke meter en welke spanning je gebruikt.
zonder stabilisator zou het erg zijn. neem weer voorbeeld 1 van 4V naar 8V over de benzinemeter.
bv 12,5V boordspanning, sender op 6,5V (halve tank), meter krijgt 6V en die toont halvvol
boordspanning stijgt naar 14,5V, sender 7V, meter krijgt 7,5V, die toont ineens 3,4de vol.
als benzinemeter en temperatuurmeter schommelen, is de regelaar meestal kapot
fcapri, dit is wel wat off-topic maar op:
https://interface.khm.de/index.php/lab/interfaces-advanced/nonlinear-m…
wordt de (multi)map functie uitgelegd. Dit gebruikte ik om tankvlotters aan te passen aan een willekeurige tankmeter. 1 ingang, 1 uitgang, dus past in een Attiny85.
Gr.Douwe
zoals ik al vermelde, heb je dan stukjes lineair gebied.
zoals in mijn foto hierboven al vermeld, kijk je bv eens naar 10°C.
dan zit je al dicht tegen die bovenste lijn en niet meer tussenin de beide
het probleem is dat je dit voor elk type auto en sensor appart weer allemaal moet gaan uitmeten en programmeren.
die grafiek was namelijk de VW blauwe sensor van een GTI.
mijn 1.3 had de beige sensor, dus een andere grafiek, kan je opnieuw gaan beginnen.
bij een tankvlotter is het veel makkelijker te doen met 2 meetpunten, en die heb ik geautomatiseerd:
ik heb een menu en 1 drukknop gemaakt. je rijdt de auto leeg, zet contact af, drukt de knop in en zet contact aan.
de arduino boot, zit een ingedrukt knop en gaat in zijn menu.
daar heb je 3 instel opties.
nr 1) de tijd onveranderd, +1h en -1h (winter en zomertijd aanpassing)
nr 2) lege tank calibratie, die druk je in dan.
de arduino meet de binaire waarde en steekt deze in zijn 1e variabele voor de map. (bv 241).
je zet contact af en gaat tanken. bv 50liter getankt
je drukt de knop in, en zet contact aan. de eerste 2 opties verander je niet, de 3de druk je nu wel in:
nr 3) volle tank calibratie.
arduino meet hier nu de volle tank, bv 830 en steekt deze in de 2de waarde van de map.
dan vraagt de arduino hoeveel liter je tankte. hier is het dus 50.
in het programma komt nu
liters = map(meting, 830, 241, 50, 0);
830 = volle waarde
241 = lege waarde
50 = 50liter getankt
0 = lege tank.
die 3 waardes worden ook in eeprom geschreven zodat de arduino dit bij elke boot weer inleest.
dergelijk systeem is haast niet te doen voor de hyperbool van een temperatuur sensor.
Edit :
heb probleem gevonden,
maar ik krijg het percentage nog niet in het display,
de code is :
#include <Wire.h> // voor I2C-communicatie
#include <Adafruit_GFX.h> // Adafruit Graphics Library
#include <Adafruit_SSD1306.h> // Adafruit OLED-displaydriver
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define MaxTankOhm 310
#define MinTankOhm 5
#define KnownResistor 500
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
uint8_t analogPin = 0;
uint16_t rawVal = 0;
uint16_t VinmV = 5000;
uint16_t R1 = KnownResistor;
uint16_t R2 = 0;
uint32_t buffer = 0;
uint16_t Vout = 0;
uint8_t percentage = 0;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialiseer OLED-display met het juiste I2C-adres
display.clearDisplay(); // wis het display
display.setTextSize(2); // kies tekstgrootte
display.setTextColor(WHITE); // kies tekstkleur
}
void loop() {
char percentagemsg[3] = {0};
rawVal = analogRead(analogPin);
buffer = rawVal * VinmV;
Vout = (buffer)/1024.0;
buffer = (VinmV/Vout)-1;
R2 = R1 * buffer;
if(R2 >= MaxTankOhm)
{
R2 = MaxTankOhm;
}
if(R2 <= MinTankOhm)
{
R2 = MinTankOhm;
}
percentage = map(R2, MinTankOhm, MaxTankOhm, 0, 100);
sprintf(percentagemsg,"%d",percentage);
display.setCursor(0,0); // zet cursor aan het begin
display.println("Fuel Level %"); // voeg tekst toe aan display
display.setCursor(1,60); // zet cursor aan het begin
display.println(percentagemsg);
display.display(); // toon de tekst op het display
delay(2000);
}
die ' printin'fuel level%' moet nog iets toevoegen maar ik zou niet weten hoe.
waarom zet je zoveel om naar weerstanden enzo?
rawVal = analogRead(analogPin);hier krijg je dus een waarde tussen 0 en 1024.
steek die in de map.
trek je tank leeg, meet met de arduino de waarde, bv 210
tank de boel vol, meet met de arduino de waarde, bv 620
percentage = map(rawVal, 210, 620, 0, 100);meet de arduinu nu 300 als binaire waarde.
dan zal dat 22% zijn
gebruik serial print om je tussenwaardes allemaal eens op je pc te tonen. dan weet je tenminste dat het program goed rekent voor je begint te rommelen op displays. veel kans dat je display ook met integers moet werken en niet met floats
heb even wat uitleg tussen *** *** gezet bij alle stappen zodat je het kan begrijpen (NIET in je programmer zetten, dit gaat allemaal fouten geven nu).
heel dat middendeel van omzetten heb je niet nodig, daar berekenen ze de weerstand, wat nutteloos is. jij moet gewoon van meting naar percetage. omrekenen naar spanning, dan omrekenen naar weerstand, dan percentage maken tussen die weerstanden... nutteloze berekeningen die enkel afrondingsfouten bijmaakt.
***hieronder zijn libraries gedefinieert wat je allemaal gebruikt***
#include <Wire.h> // voor I2C-communicatie
#include <Adafruit_GFX.h> // Adafruit Graphics Library
#include <Adafruit_SSD1306.h> // Adafruit OLED-displaydriver
**** scherm instellingen***
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
**** vaste variabelen dat je definieert***
#define MaxTankOhm 310
#define MinTankOhm 5
#define KnownResistor 500
***aanmaken display in je programma***
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
*** nog variabelen***
uint8_t analogPin = 0;
uint16_t rawVal = 0;
uint16_t VinmV = 5000;
uint16_t R1 = KnownResistor;
uint16_t R2 = 0;
uint32_t buffer = 0;
uint16_t Vout = 0;
uint8_t percentage = 0;
*** instellingen in je programma, display starten, geheugen leegmaken, en lettertype instellen***
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialiseer OLED-display met het juiste I2C-adres
display.clearDisplay(); // wis het display
display.setTextSize(2); // kies tekstgrootte
display.setTextColor(WHITE); // kies tekstkleur
}
*** het eigenlijke berekenen, dit gaat altijd door die 'loop'****
void loop() {
char percentagemsg[3] = {0};
rawVal = analogRead(analogPin); ***inlezen waarde op datapin***
buffer = rawVal * VinmV; ***omzetten***
Vout = (buffer)/1024.0; ***omzetten***
buffer = (VinmV/Vout)-1; ***omzetten***
R2 = R1 * buffer; ***omzetten
if(R2 >= MaxTankOhm) *** vast zetten: als je meer meet dan het max, zet je die op max***
{
R2 = MaxTankOhm;
}
if(R2 <= MinTankOhm)
{
R2 = MinTankOhm;
}
***omzetting van de bovenste berekeneingen naar een percentage***
percentage = map(R2, MinTankOhm, MaxTankOhm, 0, 100);
sprintf(percentagemsg,"%d",percentage);
***weergeven op display***
display.setCursor(0,0); // zet cursor aan het begin
display.println("Fuel Level %"); // voeg tekst toe aan display
display.setCursor(1,60); // zet cursor aan het begin
display.println(percentagemsg);
display.display(); // toon de tekst op het display
***2sec wacht om alles opnieuw te doen
delay(2000);
}
Dat maakt het al iets duidelijker ,
maar hoe zou ik de % op het display krijgen ,
ik kan ook via een online-ardiuno kloon kunnen prutsen, zonder dat er wat stuk gaat. maar ik moet op een of andere manier het % 'antwoord' krijgen bij 'fuel level ****'
wat zie je of wat zie je niet?
veranderd dit
display.println(percentagemsg);
eens door
display.println(50);
of
display.println("50");
en zie of je dat wel op het display krijgt
als dit wel werkt, loopt er wat fout in de berekening en is percentagemsg gewoon leeg of een verkeerd formaat
[Bericht gewijzigd door fcapri op (23%)]
3d doosje geprint waar de nano in past , deksel is nog blank maar denk dat ik nog een deksel print waar het displayd mooi inpast.
code is iets aangepast maar werkt goed.
300ohm = 0%
5 ohm= 100%
nu in de auto bouwen morgen en proberen hoe het gaat kwa bochten nemen ,
wellicht nog een kleine condensator over de sender plaatsen dat hij niet heen en weer schommelt .