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;}