Arduino gebruiken in auto.

Hallo ik ben totaal nieuw met arduino en het lijkt me zeer leerzaam om te gaan gebruiken. ik heb namelijk iets in mijn hoofdt maar weet niet of dit haalbaar is.

Tegenwoordig hebben alle auto's obd2 mijne niet dus kan ik ook niet gebruiken. omdat ik graag wil weten wat mijn auto allemaal doet wou ik arduino gebruiken.

Wat zou ik willen doen.
Ik wil graag de volgende dingen van mijn auto weten.
Tijd
Olie druk.
Olie Temp.
Water Temp.
Buiten Temp.

En omdat ik geen ruimte in de auto heb voor 6 ronde meters a 52mm zoek ik een andere oplossing en via via van arduino gehoord en ik denk het moet mogelijk moet zijn. Nu heb ik dus totaal geen kennis hiermee wil het wel graag gaan leren.

Nu zat ik voor de Olie/Water tempratuur aan zulke sensoren te denken
Sensor Bij Conrad

Is het dus mogelijk om op een arduino board een lcd of tft of touch screen te plaatsen Desnoods via kabel dat ik display netjes in een plaatje in het dashboard maak. Dat het arduino board 12v sensoren kan lezen. en dat het dan de waardes op en display toont en de waarde's ook constant veranderen naar wat het -+ is

auto elektronica kom ik wel uit ben vrachtwagenmonteur :slight_smile: en de sensoren plaatsen gaat me wel lukken alleen werkend krijgen op een display heb ik mijn twijfels bij.

Heeft iemand hier ervaring mee? om arduino in een auto te maken? Heb zelf nog weinig van arduino in huis klein bassis setje met led lampjes.

Ik hoop dat iemand mij een beetje opweg kan helpen eventueel met info wat ik zou moeten kopen en of het haalbaar is.

Alvast bedankt groeten,
Sintclair.

Zeker haalbaar , maar omdat je nog geen ervaring hebt zou ik het aanpakken als losse projectjes en later een keer kijken hoe samen te voegen.
De eerste stap is de minst leuke mischien, is om een paar avonden door de tutorial sectie van de website te gaan en zoveel mogelijk sketches te bestuderen en uit te proberen om een gevoel te krijgen van de mogelijkheden van de Arduino programmeertaal.

Hallo,

Ik steun volledig de idee van klein starten.

Nadien kan je denken aan het inbouwen van de sensoren in je wagen.
Het inbouwen in de wagen van sensoren: water en hitte bestendige leidingen.
Maar dit de pret niet derven.
Het is dus mogelijk.

Ik ben, op een heel ander vlak bezig met een weerstation. (En ja er bestaan er duizend.)

Alle onderdelen apart en aansluiten als een soort van testopstelling.
Waarna alles wordt ingebouwd.

Ik wens je veel succes, en blijven posten...

Ik ga me zeker goed inlezen voor dat ik van alles ga kopen zal proberen zoveel mogelijk progressie laten weten.

arduino kan wel werken met 12v Sensoren? En of weerstand sensoren. Denk dat ik maar begin met buitentemperatuur op display te krijgen als ik spul ga kopen eerst veel info zoeken en lezen.

Hoi.

Arduino werkt met 5 volt, en 5 volt signalen.
Er zijn ook varianten die met 3.3 volt werken, en dan zijn de signalen ook 3.3 volt.
Als je een 12 volt signaal zonder aanpassing aansluit op een Arduino ingang, maak je die kapot, en das dus niet de manier om te bereiken wat je wil.
Maar je kunt dus wel heel eenvoudig het signaal aanpassen.
Er zijn ook heel veel sensoren te koop die digitaal hun resultaten kunnen melden.
Bijvoorbeeld I2C, dat heeft wel wat weg van een heel veel simpeler uitvoering van de CAN bus, om in jouw straatje te blijven.
I2C kun je direct verbinden met je Arduino, die heeft er een speciale aansluiting voor.

Zoals Rob en ivanflo je al adviseerden, raad ik je ook aan om eerst eens algemene dingen te doen om de smaak te pakken te krijgen.
Je kunt nu al beginnen daarmee, door de IDE (1.0.5, de 1.5.5 is nog experimenteel en bedoeld voor de zwaardere geschutten in Arduinoland) te downloaden en te installeren.
Als je dat gedaan hebt, kun je de Examples of voorbeelden (de Nederlandse taal is beschikbaar) eens bestuderen.
Dat is wel veel leuker als je een Arduino (advies: Uno is perfect om mee te beginnen) hebt, waar je wat dingen op kunt aansluiten, zoals LEDjes.
Daar kun je dan al heel leuke dingen mee doen het eerste weekend dat je er mee begint.
Vooral als je de voorbeelden een beetje aanpast om te zien wat er dan gebeurt, ik heb zo erg veel plezier gehad iets meer als een jaartje geleden.

Je kunt ook een starterkit nemen.
Die zijn er ook in heel veel uitvoeringen.
Hier zou ik adviseren om er eentje te zoeken waar ook een 1602 display in zit, waarmee de allergoedkoopste kitjes zullen afvallen.
Hoewel die displaytjes ook al voor minder dan 3 euro te koop zijn in China.
Een displaytje kan erg handig zijn, ook als je in je uiteindelijke product geen, of een heel ander display wil gebruiken.
Zo'n display is niet echt iets om mee te beginnen, meer voor de tweede maand ofzo (als je in weekends knutselen rekent).

Wij lezen graag over je progressie, want heel vaak zet dat ons ook weer aan het denken.

Veel plezier alvast bij je Arduino Avonturen.

Ben al aan het proberen me broertje heeft of beter gezegd had :stuck_out_tongue: een arduino board met wat toebehoren.

Heb een wat ouder board volgens mij. Namelijk de Arduino Duemilanove.

Heb de volgende dingen gemaakt
Ledjes laten branden & knipperen.
Ledjes op willekeurige volgorde laten knipperen.
Via een knop het aantal push tellen en via pc uitlezen.

Ben nu bezig om uit te zoeken hoe ik een 7digits kan laten tellen met push button alleen dat programmeren valt me even zwaar:)

Alle begin is moeilijk.
Als je stap voor stap werkt, is het overzicht eenvoudiger te behouden.
Dan moet je dus niet (teveel) overslaan.
En als je tegen een muur loopt, kun je hier altijd vragen.

Ik raad je aan om nog even verder te gaan met je LEDjes (of dat te doen na datgene wat je nu doet).
En een potentiometer (neem er maar eentje van 10 K).
Kun je ook erg leuke dingen van leren, ik vind dat leuker dan een schakelaar.

Enneh.
Je kunt je 7 segment (ik denk dat je dat bedoelde) ook een waarde laten aanwijzen die overeen komt met je potentiometer.
En meer dan 10 waardes laten zien met dat ding (zeker 16 waardes passen al in een standaard oplossing).
En dan heb je ook nog de punt, die kun je bijvoorbeeld voor halve waardes gebruiken, waardoor het totaal verdubbelt.

Bovendien kun je met zo'n 7 segments display ook nog creatieve dingen doen zonder dat je een cijfer gaat afbeelden, het is tenslotte niet meer dan een verzameling van 8 LEDjes.

Omdat ik nog niet zoveel spullen voor arduino heb moet ik eerst even doen met wat lampjes en een 7 segment en wat andere dingen.
heb nog geen pot meter deze zijn onderweg met veel andere spulletjes om te oefenen

7 segment aan de praat gekregen met een code op het internet maar daar werdt ik zelf nog niet veel wijzer uit:( dus ben terug naar de ledjes gegaan. zodat deze op drukknop optellde.

Nu mijn opstelling/probleem.

Heb een stoplicht op een doorgaande weg gemaakt met oversteekplaats voor voetgangers. om een beeld te krijgen wat ik bedoel :grin:

Het werkt allemaal wel alleen nog niet zoals ik het graag wil en kan het ook nog niet vinden
.
Mijn stoplicht werkt als volgt.
Groene lamp staat aan voor 10 sec.
Groene lamp gaat uit gele lamp gaat aan voor 3 sec.
Gele lamp gaat uit Rood gaat aan voor 5 sec.
gewoon doorlopend momenteel

Mijn voetgangers oversteekplaats daar heb ik een knopje tussen gemaakt om hem te activeren.

als ik mijn oversteekknop bedien gebeurt er niks (hij onthoudt niet dat ik op de knop heb gedrukt) als ik mijn drukknop vast houd op het moment dat de code -+ op het gedeelte komt waar ik zeg dat de oversteekplaats groen moet krijgen gaat deze wel in werking dus stoplichten op het rode licht en dat de voetgangers kunnen dan oversteken.

Heb het met de button code geprobeert en met de debounce ga nu ff kijken wat inputpullupserial doet.

deze code heb ik zelf gemaakt. Mischien niet de snelste maar nu wel overzichtelijk.

  int rood = 13; // Aansturing rode led op pin 13 arduino board.
  int geel = 12; // Aansturing gele led op pin 12 arduino board.
  int groen = 11; // Aansturing groene led op pin 11 arduino board.
  int groenoversteek = 10; //Aansturing groen led oversteekplaats op pin 10 arduino board.
  int roodoversteek = 9; //Aansturing rode led oversteekplaats op pin 10 arduino board.
  int drukknop = 2; //Drukknop aangesloten op pin 2 arduino board.
//variable 
  int ledState = HIGH;
  int buttonState;
  int lastButtonState =LOW; 
//
  long lastDebounceTime = 0;
  long debounceDelay = 50;


void setup(){
  pinMode(rood,OUTPUT);
  pinMode(geel,OUTPUT);
  pinMode(groen,OUTPUT);
  pinMode(groenoversteek,OUTPUT);
  pinMode(roodoversteek,OUTPUT);
  pinMode(drukknop,INPUT);
  
}
void loop(){  
  int reading = digitalRead(drukknop);
  if (reading != lastButtonState){
  lastDebounceTime = millis();
}
  if((millis() - lastDebounceTime) > debounceDelay) {
  if(reading != buttonState){
    buttonState = reading;
    
  if(buttonState == HIGH){
    
  digitalWrite(rood,HIGH);
  digitalWrite(geel,LOW); // Rode Led aan.
  digitalWrite(groen,LOW);
  delay(2000);
  digitalWrite(roodoversteek,LOW); // Oversteek Groen
  digitalWrite(groenoversteek,HIGH);
  delay(2500);
  digitalWrite(groenoversteek,LOW);
  delay(500);
  digitalWrite(groenoversteek,HIGH);
  delay(500);
  digitalWrite(groenoversteek,LOW);
  delay(500);
  digitalWrite(groenoversteek,HIGH);
  delay(500);
  digitalWrite(groenoversteek,LOW);
  delay(500);
  digitalWrite(groenoversteek,HIGH);
  delay(500);
  digitalWrite(groenoversteek,LOW);
  delay(500);
  digitalWrite(groenoversteek,HIGH);
  delay(500);
  digitalWrite(groenoversteek,LOW);
  delay(500);
  digitalWrite(groenoversteek,HIGH);
  delay(500);
  digitalWrite(groenoversteek,LOW);
  delay(500);
  digitalWrite(groenoversteek,HIGH);
  delay(1500);  
  digitalWrite(rood,HIGH);
  digitalWrite(geel,LOW); // Rode Led aan.
  digitalWrite(groen,LOW);
  digitalWrite(roodoversteek,HIGH); //Oversteek ROOD
  digitalWrite(groenoversteek,LOW);
  delay(4000);
      }
    }
  } 

  lastButtonState = reading;
  
  digitalWrite(rood,LOW);
  digitalWrite(geel,LOW); // Groene Led aan.
  digitalWrite(groen,HIGH);
  digitalWrite(roodoversteek,HIGH); //Oversteek ROOD
  digitalWrite(groenoversteek,LOW);
  delay(10000);
  
  digitalWrite(rood,LOW);
  digitalWrite(geel,HIGH); // Gele Led aan.
  digitalWrite(groen,LOW);
  digitalWrite(roodoversteek,HIGH); // Oversteeek ROOD
  digitalWrite(groenoversteek,LOW);
  delay(3000);
  
  digitalWrite(rood,HIGH);
  digitalWrite(geel,LOW); // Rode Led aan.
  digitalWrite(groen,LOW);
  delay(4000);
  }

Okee dat is inderdaad een duidelijke code.
Maar deze kan niet werken zoals jij had gehoopt.
Je hebt namelijk heel veel delays in die code zitten.
Als ik ze optel, dan zie ik 14 en een halve seconde vertraging in het eerste stukje van je code.
Die 14.5 seconden vertraging word altijd uitgevoerd, of jij op het knoppie drukt of niet.

Een delay X betekent doe niets, en kijk of er als X milliseconden voorbij zijn gegaan.
Dus doet je Arduino 16000 keer niets, dan is er al 1 milliseconde voorbij.
En dat doet ie dan X keer.
En niets doen is dus niets doen, ook niet kijken of er op een knoppie word gedrukt.

Daarom het meest gehoorde advies hier op het board:
Bekijk de "blink without delay" sketch, en probeer te begrijpen hoe en waarom die werkt.
En bedenk hoe snel de zaken in je Arduino eigenlijk verlopen, want das best lastig te bevatten als je het vergelijkt met hoe snel je eigen gedachten (lijken te) gaan.

Verder heb je het over het vergeten van het indrukken van je knop.
Dat klopt, dat heb je zo geprogrammeerd dat ie vergeten word.
Als je dit doet:  int reading = digitalRead(drukknop);
Dan maak je een nieuwe (en dus heel kort ook lege) waarde aan, die je vervolgens vult met je drukknop waarde.
Dat doe je elke keer als de loop nog es een rondje maakt.
Je slaat dat een stuk verderop wel op in lastButtonState, maar dan moet iemand inderdaad de hele tijd die knop ingedrukt houden.
Wat je mist is de registratie dat die knop is ingedrukt, en hoe lang dat geleden is.
En dat is dus onafhankelijk van de huidige staat van die knop.
Op een gegeven moment, als je van alles met je lichten gedaan hebt, wil je dan die registratie weer wissen.

Als je dit alles veranderd hebt zoals ik hierboven bedoel, moet je je werkwijze ook iets aanpassen.
Want nu doorloopt je loop dus telkens 1 cyclus van je verkeerslichten, straks duurt 1 cyclus duizenden loops.
En daar moet je dan wel rekening mee houden.

Tips op een rijtje:

  • Gebruik blink without delay
  • Houd heel goed bij wat je doet, maar ook wat je al gedaan hebt en wanneer.
  • Om dat allemaal bij te kunnen houden, heb je meer variabelen nodig.

Ik heb de code voor blink without delay al is gezien ga even kijken hoe die werkt als ik van het weekend tijd heb. Dat delay de hele arduino stil zette wist ik niet.

Sintclair:
.... Dat delay de hele arduino stil zette wist ik niet.

De hele Arduino?, nee in een klein hoekje van de Arduino wordt driftig in een loop gedraaid - vrij naar Asterix :wink:

En op de achtergrond gaan timers en interrupts in principe ook door ...

Even off topic, ik gebruik ook veel "delay(100000).
en vind dit niet correct.
Hoe kan je dit programma even op "wacht" zetten, en toch geen invloed te laten hebben?

Een for-next lus?

Nee.
Want die for...next loop (maar dan zonder next, want die is er niet in deze omgeving), is al net zo blokkerend als de delay (je sluit jezelf weer ff op, maar nu in een ander hoekje als die vermaledijde Galliers*).
Daarom let ik tegenwoordig ook op for.. loops als iemand vertraging ervaart.
Als je echt delay (100000) doet, dan doe je dus dik anderhalve minuut niets.
Das wel een eeuwigheid.
Je kunt gewoon hetzelfde doen als in blink without delay.
Maar daarvoor moet je wel in loop() zitten.
Dan kun je dus met regelmaat controleren of de gewenste tijd al verstreken is.

Ik heb echter ergens al eens gezien dat iemand de Arduino laat slapen om m vervolgens na een bepaalde tijd wakker te laten worden.
Daarmee bespaar je een berg energie, heel mooi als je een batterij gevoede toepassing hebt.
Hoe je dat doet weet ik niet precies, maar ik weet wel dat je daarvoor met interrupts werkt.

*) Ref: robtillaart + Goscinny/Underzo

Over slapende Arduino's - Gammon Forum : Electronics : Microprocessors : Power saving techniques for microprocessors -

Of google direct voor de narcoleptic library (bestaat echt)

Ik heb dit gemaakt (alleen geen buitentemp) bij mij wordt alles weergegeven op een origine benzinemeter (omgebouwd naar temperatuurmeter)

Compleet verslag en how to is te lezen op:

http://www.volvokv.nl/forum/viewtopic.php?f=137&t=21538&sid=793d6ebf8dacc4c85cd99518e19bd13c

Als er experts nog critische noten en verbeterpunten hebben, dan graag!

Kun je de code en schema posten, die zie ik niet op de volvo site?

natuurlijk:

eind resultaat

boodschappenlijstje:

De volgende items heb je nodig om hem hardware technisch in orde te maken.

een Arduino (Uno)

2 temperatuur sensoren (die geen massa maken met het frame)
1 oliedruksensor (ook geen massa met het frame)
12V - 5V USB-oplader

3 maal 1kohm weerstand
2 maal 470 ohm weerstand
1 maal een willekeurige weerstand
een tip 120 transistor

Een 2 kleurige LED (ik heb rood/groen gekozen)

Een oude benzinemeter (misschien zelfs 2)
een oude temperatuurmeter met een mooie plaat

een lichtverklikker (met melodie)

een momentary schakelaar (indrukken = aan, loslaten = uit)

een doos waar je alles in kan bouwen (ik heb een lasdoos gebruikt)

Sandwichplate voor tussen het oliefilter en het blok.
Een verloopstuk om de temperatuursensor in het orginele gat te plaatsen

Noot: Links van het boodschappenlijstje staan op de thread op de volvo site.

Hierbij de eerste stappen

Als eerste is het handig om de benzinmeter om te bouwen naar de temeratuurmeter. Dit omdat je onvermijdelijk de stand van de wijzer veranderd en hier dient later rekening mee gehouden te worden.

Hoe bouw je de benzinemeter om:
Je draait de 2 schroevenlos waarmee de plaat vast zit. Vervolgens probeer je de plaat zo recht mogelijk omhoog te trekken zodat de wijzer losschiet.

Nu draai je op de plek waar eerst de benzinemeterplaat zat de temperatuurmeter plaat terug. (evt boor je eerst een 8mm gat voor de indicatieLED, op pagina 1 staat een foto waarvan de locatie van het gat afgeleid kan worden)

Vervolgens druk je het wijzertje terug. dit is een stap waar je voorzichtig mee moet zijn, omdat je snel het wijzertje of het pinnetje breekt. Daarom had ik dus 2 benzimeters nodig. Als het goed is heb je het nu resultaat zoals is weergegeven op pagina 1.

Vervolgens bouw je onderstaande testopstelling op:


Zowel de massa van het 5V circuit als die van het 12V circuit zijn met elkaar verbonden.

de temp sensoren hebben maar 2 draden. 1 willekeurige mag rechtstreeks op de 5V. De andere zul je moeten splitsen, een gedeelte via een 1k ohm naar de massa en de andere VOOR de weerstand naar een analoge ingang (A1 voor water, A2 voor olie)

Ook moet er voor nu een schuifweerstand aangesloten worden. Deze heeft een voeding en massa nodig en de uitgang mag direct op A0 aangesloten worden (wat de ingang/uitgang is moet je zelf even uitvogelen omdat dit voor elke schuifweerstand verschillend is)

vanuit poort ~9 gaat ern een kabel via een 1Kohm weerstand naar het 1e pootje (B). Het 2e pootje(C) gaat naar de G op de benzinemeter en het derde pootje(E) gaat naar de massa


Nadat je alles hebt aangesloten moet je de volgende code in de arduino laden

int Schuifweerstand=A0;   //toewijzing van poorten
int Olietemp=A1;
int Watertemp=A2;

int OT;
int WT;
int SW;

int Transistor=9;

void setup(){
  pinMode(Transistor, OUTPUT); //toewijzing van uitgaande poort
  Serial.begin(9600); //dit zorgt ervoor dat je hem kan uitlezen op de pc
  
}

void loop(){
OT=analogRead(Olietemp);
WT=analogRead(Watertemp);
SW=analogRead(Schuifweerstand)/4; //deelt de lezing door 4 omdat een transistor een bereik heeft van 0-255

analogWrite(Transistor,SW);

  Serial.print("Schuifweerstand: ");
  Serial.println(SW);  
  Serial.print("OlieTemp: ");
  Serial.println(OT);
  Serial.print("WaterTemp: ");
  Serial.println(WT);
// delay(500);   //evt aan of uit te zetten door de "//" weg te halen
}

door na de code geupload te hebben op de arduino kan je middels de toetsencombinatie Ctrl + Shift + M, de seriële monitor starten. Dit is een scherm waarin je de lezingen van de arduino live kan volgen. Door de delay(500) aan te zetten, krijg je 2 metingen per seconde ipv 1000. Aanzetten doe je door de // voor delay weg te halen.

Nu ga je middels de schuifweerstand de waardes opzoeken waarin de wijzer welke positie aanneemt. Voor dit project zijn de waardes van de eerste groene streep, begin rood (of tweede groene streep), halverwege rood, exact midden, uiterst links en uiterst rechts. Zoek al deze waarden op en noteer deze.

Ook ga je bij verschillende temperaturen kijken wel getal de sensoren aan gaan geven. Deze zullen altijd tussen de 0 en 1023 liggen. Neem zowiezo ook kokend water mee. Ijswater heeft volgens de specificaties geen zin omdat hij onder de 40 graden onzuiver wordt.

Noteer ook deze waarden bij de verschillende temperaturen.

Ik had het geluk dat beide sensoren nagenoeg dezelfde waarden gaven dus ik heb dezelfde omreken formule gebruikt.
De temepratuur ga je nu berekenen met temp=ax+b. waarbij x is de gemeten waarde, a de helling en b de startwaarde.

Voorbeeld ik mat 525 bij 38Gr en 895 bij 100Gr. De helling (100-38)/(895-525)=0.1676
temp=0.1676x+b
38=0.1676*525+b= 88+b b=88-38=50

temperatuur formule wordt: temp=0.1676*Temp-50

De druksensor heeft een specificatie blad die de verschillende waardes geeft bij een bepaalde druk. Dus die geeft de volgende formule. Druk= 0.0122x-1.23 (10 bar geeft 921 en 1 bar geeft 184)

Nu borduren we voor op de 1e opstelling en bouwen we onderstaande (definitieve) opstelling.

Beide temperatuursensoren blijven behouden.
de schuifweerstand is niet meer nodig.
de transistor en de benzinemeter blijven behouden.

de oliedrukmeter heeft 3 draden: rood 5v voeding, groen uitleesdraad en de zwarte massa.
de lichtverklikker gaat rechtstreeks op poort 2 en op de massa.

De leds worden aangestuurd vanuit poort 3(groene lamp) via een 470 ohms weerstand op de middellangste poot, poort 12 (rode lamp) via een 470 ohms weerstand naar de kortste poot. In dit geval is de langste poot de massa. De weerstanden zijn nodig omdat anders de led direct wordt opgeblazen.

De momentary knop heeft een 5V voeding en de massa wordt via een willekeurige weerstand op de massa aangesloten. Voor de weerstand gaat er een aftakking naar poort 13. Deze weerstand is echt nodig zodat hij een eventuele "restspanning"kwijt kan en dus geen valse waardes geeft.

Nu krijgt de arduino spanning via de pc. Hiervoor hebben we straks de usboplader nodig. in de auto soldeer je hem rechtstreeks vast op een vaste voedingsdraad en de oplader zet de 12v om naar een constante 5V voor de arduino.

Voor bovenstaande opstelling geld in mijn geval onderstaande code

float Oliedruk=A0;  //aansluiting oliedruksensor
float Olietemp=A2;  //aansluiting watertempsensor
float Watertemp=A1; //aansluiting olietempsensor

int Alarm= 2;       //aansturing pieper
int Knop=13;        //aansluiting schakelknop
int Transistor=9;   

int ledRood=12;
int ledGroen=3;

int teller=LOW;
int lastteller=HIGH;
int menucounter=1;
int reading;
int kteller;

float Odruk;
float Otemp;
float Wtemp;

int WTG;
int OTG;
int ODB;

float middenO = 80; //bedrijfstemp olie
float HroodO = 110; //begin oververhitting olie
  
float middenW = 80; // bedrijfstemp water
float HroodW = 100; // begin oververhitting water

float Brood = 2.5; // minimale oliedruk binnen de tolerantie
float Bgroen= 6.0; // maximale oliedruk binnen de tolerantie
  
float xO;
float xW;
float xD;
  
float xxO;
float xxW;
float xxD;

float OD;
float WT;
float OT;

unsigned long MillisNu;
unsigned long KnipperMillis;
unsigned long MillisKnop;
unsigned long debounce=0;
int storing=50;

unsigned long MillisMeet;
unsigned long MeetMillis;
unsigned long monitortijd;
unsigned long Millismonitor;


int Gstate=LOW;
int Rstate=LOW;

void setup(){
  pinMode(Alarm, OUTPUT);
  pinMode(Knop, INPUT);
  pinMode(Transistor, OUTPUT);
  pinMode(ledRood, OUTPUT);
  pinMode(ledGroen, OUTPUT);
  
  Serial.begin(9600);
}
  
void loop (){
  
  berekening();
  probleem();
  menu();
  digitalWrite(ledRood,Rstate);
  digitalWrite(ledGroen,Gstate);
  monitor();
}


void monitor(){
  Millismonitor=millis();
  
if(Millismonitor-monitortijd>1000){

  Serial.print("Druk: ");
  Serial.println(Odruk,2);  
  Serial.print("OlieTemp: ");
  Serial.println(Otemp, 2);
  Serial.print("WaterTemp: ");
  Serial.println(Wtemp,2);
  Serial.print("Menu: ");
  Serial.println(menucounter); 

   
monitortijd=Millismonitor;
  }} 
  
void probleem(){
    MillisNu=millis();
    
    if (ODB <106){ 
    ODB=106;}
    if (OTG <106){
    OTG=106;}
    if (WTG <106){
    WTG=106;}                             // 106 is maximale waarde van het rood
    
    
    
if (MillisNu>60000){                      //na 1 minuut na starten ka het alarm in werking treden
   if (Odruk<=0.85){                       // alarm treed in werking als druk onder de 0.85 bar komt
   menucounter=3;
   digitalWrite(Alarm,HIGH);
  if(MillisNu-KnipperMillis>250){          //knipperledjes om de kwart seconde
   KnipperMillis=MillisNu;
  
  if (Rstate ==LOW){
   Rstate=HIGH;
  Gstate=LOW;}
else{
  Rstate=LOW;
Gstate=HIGH;} 
   
   
  }}
   
   else if (OTG<=126){
     menucounter=2;
   digitalWrite(Alarm,HIGH); 
       if(MillisNu-KnipperMillis>250){
   KnipperMillis=MillisNu;
  
  if (Gstate ==LOW){
   Rstate=HIGH;
  Gstate=HIGH;}
else{
  Rstate=HIGH;
Gstate=LOW;} 
   
   
  }
  }
   else if (WTG<=126){
   menucounter=1;
   digitalWrite(Alarm,HIGH); 
   if(MillisNu-KnipperMillis>250){
   KnipperMillis=MillisNu;
  
  if (Rstate ==LOW){
   Rstate=HIGH;
  Gstate=LOW;}
else{
  Rstate=LOW;
Gstate=LOW;} 
     
  }
   }else{
    digitalWrite(Alarm,LOW);
   
   }}else{
    digitalWrite(Alarm,LOW);
  }}




void menu(){
  MillisKnop=millis();
  kteller=digitalRead(Knop);
  
  if(kteller==HIGH){
    debounce=MillisKnop;
    teller=HIGH;
  }
  
  if(kteller==LOW){
    if(MillisKnop-debounce<storing){
      teller=HIGH;}
      else{
      teller=LOW;
  }}
  
  if (teller !=lastteller){
    if (teller==HIGH){
      menucounter++;
    }
  }
  lastteller=teller;
  

    
  if (menucounter == 4){
    menucounter = 1;}
    
  else if(menucounter ==1){
     if (WTG > 255){                         //255 minimale groen waarde, grootste waarde die de transistor kan verwerken
       WTG=255;}
       
       if (WTG > 126){                      // wanneer er geen gevaar is, branden de volgende indicatielampjes.
       Rstate=LOW;
       Gstate=LOW;}
              
     analogWrite(Transistor,WTG);
     
           
   }
   
  else if(menucounter ==2){
    analogWrite(Transistor,OTG);
    
     if (OTG > 255){
       OTG=255;}
       
     if (OTG > 126){
       Rstate=HIGH;
       Gstate=HIGH;}
            }
   
  else if(menucounter ==3){
   analogWrite(Transistor,ODB);
   
    if (ODB > 255){
       ODB=255;}
       
     if ((ODB) > 126  || (MillisNu<60000) ){
       Rstate=LOW;
       Gstate=HIGH;}
              
        }
  }

  void berekening(){
    
     MillisMeet=millis();

OD=analogRead(Oliedruk);
OT=analogRead(Olietemp);
WT=analogRead(Watertemp);
  
Otemp=(0.1676*OT)-50;          //0.1676 is de helling, -50 is de optelwaarde (y=ax+b)
Wtemp=(0.1676*WT)-50;          //0.1676 is de helling, -50 is de optelwaarde (y=ax+b)
Odruk=(0.0122*OD)-1.23;        //0.0122 is de helling, -1.23 is de optelwaarde (y=ax+b)
  
                                //xXis de helling van de transistor 
  xO= 35/(HroodO-middenO);      //35 is het verschil tussen de midden stand en half rood
  xW= 35/(HroodW-middenW);      //35 is het verschil tussen de midden stand en half rood 
  xD= 48/(Bgroen-Brood);        //48 is het verschil tussen de 2 witte strepen.
  
                                //xxX is startwaarde van de transistor
  xxO=155+(middenO*xO);         //155 is de waarde van het midden, middenO is de vastgestelde bedrijfstemp maal de helling
  xxW=155+(middenW*xW);         //155 is de waarde van het midden, middenW is de vastgestelde bedrijfstemp maal de helling
  xxD=(180-(Bgroen*xD);         //180 is de waarde van de eerste streep, Bgroen is de max normale druk maal de helling
  
if(MillisMeet-MeetMillis>75){
  WTG=(-1*xW)*Wtemp+xxW;          //Transistor vertaling
  OTG=(-1*xO)*Otemp+xxO;
  ODB=(Odruk*xD)+xxD;
  
   MeetMillis=MillisMeet;
}

}

In mijn geval is:
Standaard menu 1, brand geen led, watertemperatuur
menu 2, gele led, olietemperatuur
menu 3, groene led, oliedruk

via de drukknop schakel je tussen de menu's (1,2,3 - 1,2,3 -1 enz...)

De code hierboven behoeft enige uitleg omdat er zelf in gesleuteld dient te worden.

We beginnen gewoon van boven af aan:

Mocht je alles heb gemonteerd en erachter komen dat niet elke draad op de juiste plek zit, ga dan niet alles openmaken en verplaatsen. Verander gewoon de adressen in de software.

float Oliedruk=A0;  //aansluiting oliedruksensor
float Olietemp=A2;  //aansluiting watertempsensor
float Watertemp=A1; //aansluiting olietempsensor

int Alarm= 2;       //aansturing pieper
int Knop=13;        //aansluiting schakelknop
int Transistor=9;   

int ledRood=12;
int ledGroen=3;

Verder kan je de voorkeur aanpassen bij welke waarde je wijzer waar staat. Zo wil ik dat bij een olietemp van 80 graden mijn wijzer in het midden staat en dat hij bij 110 graden half in het rood staat. Noot de oliedruk werkt andersom. bij 0 bar staat hij in het rood en hoe hoger de druk wordt hoe meer de wijzer naar links zal bewegen.

float middenO = 80; //bedrijfstemp olie
float HroodO = 110; //begin oververhitting olie
  
float middenW = 80; // bedrijfstemp water
float HroodW = 100; // begin oververhitting water

float Brood = 2.5; // minimale oliedruk binnen de tolerantie
float Bgroen= 6.0; // maximale oliedruk binnen de tolerantie

Mocht het nodig zijn, wil ik in de auto mijn gegevens via de laptop uit kunnen lezen. De 1000 in onderstaand gedeelte geeft het aantal milliseconde aan wanneer er opnieuw een waarde wordt geprint op de seriele monitor. Ik zeg geprint want hij blijft zijn metingen (in mijn geval) om de 1 ms maken. De 1000 kan je zelf vergroten of verkleinen naar wens.

void monitor(){
  Millismonitor=millis();
  
if(Millismonitor-monitortijd>1000){

  Serial.print("Druk: ");
  Serial.println(Odruk,2);  
  Serial.print("OlieTemp: ");
  Serial.println(Otemp, 2);
  Serial.print("WaterTemp: ");
  Serial.println(Wtemp,2);
  Serial.print("Menu: ");
  Serial.println(menucounter); 

   
monitortijd=Millismonitor;
  }}

Onderstaand komen we bij de alarm voorwaarden. Allereerst zeg ik dat de waarde niet onder de 106 mag komen (immers 106 is bij mij de uiterst rode waarde en ik wil de benzinemeter niet overdadig belasten)

Verder wil ik rustig kunnen starten zonder dat ik een alarm krijg van een te lage oliedruk. (ik heb de voedende draad aangesloten op een geschakelde contactdraad, zodat de computer alleen aanstaat als de auto aanstaat) Dus ik heb mijzelf een minuut gegeven om te starten (60.000milliseconden)

Bij een warme motor valt mijn druk weg tot 0.85bar (sationair) dit vind ik veilig dus tot deze waarde wil ik geen alarm.
Bij zowel olie als water temperatuur heb ik als trigger de stand van de wijzer gebruikt. in dit geval 126 en dan staat bij mij de wijzer halverwege in het rood. De 126 kan je veranderen naar de eerder eigen gemeten waarde.

Als er een probleem gedecteerd wordt dan zal er een led gaan knipperen, de lichtverklikker piepen en zal de wijzer automatisch datgene weergeven waar het probleem aanwezig is.

void probleem(){
    MillisNu=millis();
    
    if (ODB <106){ 
    ODB=106;}
    if (OTG <106){
    OTG=106;}
    if (WTG <106){
    WTG=106;}                             // 106 is maximale waarde van het rood
    
    
    
if (MillisNu>60000){                      //na 1 minuut na starten ka het alarm in werking treden
   if (Odruk<=0.85){                       // alarm treed in werking als druk onder de 0.85 bar komt
   menucounter=3;
   digitalWrite(Alarm,HIGH);
  if(MillisNu-KnipperMillis>250){          //knipperledjes om de kwart seconde
   KnipperMillis=MillisNu;
  
  if (Rstate ==LOW){
   Rstate=HIGH;
  Gstate=LOW;}
else{
  Rstate=LOW;
Gstate=HIGH;} 
   
   
  }}
   
   else if (OTG<=126){
     menucounter=2;
   digitalWrite(Alarm,HIGH); 
       if(MillisNu-KnipperMillis>250){
   KnipperMillis=MillisNu;
  
  if (Gstate ==LOW){
   Rstate=HIGH;
  Gstate=HIGH;}
else{
  Rstate=HIGH;
Gstate=LOW;} 
   
   
  }
  }
   else if (WTG<=126){
   menucounter=1;
   digitalWrite(Alarm,HIGH); 
   if(MillisNu-KnipperMillis>250){
   KnipperMillis=MillisNu;
  
  if (Rstate ==LOW){
   Rstate=HIGH;
  Gstate=LOW;}
else{
  Rstate=LOW;
Gstate=LOW;} 
     
  }
   }else{
    digitalWrite(Alarm,LOW);
   
   }}else{
    digitalWrite(Alarm,LOW);
  }}

Vervolgens moet je nog de maximale waarde aanpassen. Mocht er via een berekening een hogere waarde uitkomen dan transistor=255. bv. transistor is 256 dan bouwt hij dit zelf om naar 1 en gaat de wijzer dus naar het rood, terwijl het eigenlijk betekend dat de motor ijskoud is. Daarom staat er de regel in dat alles hoger dan 255 omgevormd wordt naar 255. Dit is de uiterst linkse waarde. Deze dient ook vervangen te worden door de eigen gemeten waarde.

Vervolgens staat er een voorwaarde in wat er moet gebeuren als de waarde lager is dan halverwege rood. Heb je de "126" bij bovenstaande stap veranderd dan moet je dat hier ook doen. Verder staat er bij ODB: if ((ODB) > 126 || (MillisNu<60000) ){
hier staat: "doe onderstaande als hij de waarde onder half rood komt OF als de startminuut nog niet voorbij is. Ook hier kan je de startminuut aanpassen.

  else if(menucounter ==1){
     if (WTG > 255){                         //255 minimale groen waarde, grootste waarde die de transistor kan verwerken
       WTG=255;}
       
       if (WTG > 126){                      // wanneer er geen gevaar is, branden de volgende indicatielampjes.
       Rstate=LOW;
       Gstate=LOW;}
              
     analogWrite(Transistor,WTG);
     
           
   }
   
  else if(menucounter ==2){
    analogWrite(Transistor,OTG);
    
     if (OTG > 255){
       OTG=255;}
       
     if (OTG > 126){
       Rstate=HIGH;
       Gstate=HIGH;}
            }
   
  else if(menucounter ==3){
   analogWrite(Transistor,ODB);
   
    if (ODB > 255){
       ODB=255;}
       
     if ((ODB) > 126  || (MillisNu<60000) ){
       Rstate=LOW;
       Gstate=HIGH;}