Automatisk ljusnivåreglering Arduino Program

//Uppdaterad 2014-06
#include
Servo myservo; // create servo object to control a servo
//-----------------------Ljusnivå reglering
int LevelSensorIN = A2; // Nivå sensor ingången A2
float LevelValueA = 400; // ingångsvärden vid olika tidpunkter
float LevelValueB = 400; // ingångsvärden vid olika tidpunkter
float LevelValue = 400; // Nivå givarvärdet medel
float LevelVal = 0; // värdet till servo
int LevVal = 0; // servo värdet
//int Lev0=1024; int Lev1=355; int Lev2=325; int Lev3=315; int Lev4=0; //350,310,280
//int Lev0=1024; int Lev1=767; int Lev2=512; int Lev3=256; int Lev4=0; //350,310,280
// 620 upphissad, 500-460=normal, 408= last i bagagelucka
int Level_0_UT = 1; //Reläutgång 0 (normal=LOW)inverterat jämfört med dom andra utgångarna (orsak: spara ström)
int Level_1_UT = 2; //Reläutgång 1
int Level_2_UT = 3; //Reläutgång 2
int Level_3_UT = 4; //Reläutgång 3
int LevelResetPin = 0; // Resetknapp för ljusnivån
int LevelReset = 1; //Resetvärdet HIGH-LOW
byte pressCount = 0;
int tid = 10; // tid mellan avläsning av nivågivaren
long levelsekA = tid;
long levelsekB = tid * 2 ; // dubbla tiden

long previousSekunder = 0;
long interval = 300; // uppdaterings tid för max värdet (5 min = 300000 millisek = 300 sek)
unsigned long currentSekund = millis();
//servomotorn
const int numReadings = 10;
int readings[numReadings]; // the readings from the analog input
int index = 0; // the index of the current reading
int total = 0; // the running total

void setup() {
previousSekunder = currentSekund - (interval-270) ; // 270 timern uppvärmningstid 30sek

//--------------Ljusnivå reglering
pinMode(Level_0_UT, OUTPUT); digitalWrite (Level_0_UT,LOW);
pinMode(Level_1_UT, OUTPUT); digitalWrite (Level_1_UT,LOW);
pinMode(Level_2_UT, OUTPUT); digitalWrite (Level_2_UT,LOW);
pinMode(Level_3_UT, OUTPUT); digitalWrite (Level_3_UT,LOW);
pinMode(LevelResetPin, INPUT_PULLUP);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
for (int thisReading = 0; thisReading < numReadings; thisReading++) // medelvärde readings[thisReading] = 0; } void loop() { unsigned long currentSekund = millis()/ 1000 ; //unsigned long //-----------------Ljusnivå reglering if (levelsekA == currentSekund) { LevelValueA = analogRead(LevelSensorIN); levelsekA = levelsekA + tid*2; } //delay (800); if (levelsekB == currentSekund) { LevelValueB = analogRead(LevelSensorIN); levelsekB = levelsekB + tid*2; } delay (600); if (LevelValueB < LevelValueA*1,1 && LevelValueB > LevelValueA*0,9) {
LevelValue = (LevelValueB + LevelValueA)/2 ; // medelvärd
LevelVal = ((LevelValue-200)/265) * 1023 ; // ingångsvärdet får vara mellan 380(-300=8390) och 250 som ger ett värde mellan 0-1023. ((LevelValue-150)/240) * 1023
if (LevelVal > 1023) LevelVal = 1023; //else LevVal=LevelVal; // om givaren ger ett för högt värde >370(390)
if (LevelVal < 0) LevelVal = 0; //else LevVal=LevelVal; // om givaren ger ett för lågt värde <250
}
//int Lev0=1024; int Lev1=767; int Lev2=512; int Lev3=256; int Lev4=0; //350,310,280
if (766 < LevelVal && LevelVal < 1024) {digitalWrite (Level_0_UT,LOW) ;} else digitalWrite (Level_0_UT,HIGH);
if (511 < LevelVal && LevelVal < 767) {digitalWrite (Level_1_UT,HIGH);} else digitalWrite (Level_1_UT,LOW);
if (255 < LevelVal && LevelVal < 512) {digitalWrite (Level_2_UT,HIGH);} else digitalWrite (Level_2_UT,LOW);
if (0 < LevelVal && LevelVal < 256) {digitalWrite (Level_3_UT,HIGH);} else digitalWrite (Level_3_UT,LOW);
LevelReset = digitalRead(LevelResetPin);
if(LevelReset == LOW) // kontroll om nivåknappen är intryckt
pressCount++;
switch(pressCount){ // Lev0=1024; int Lev1=350; int Lev2=310; int Lev3=280; int Lev4=0; // 620 upphissad, 500-460=normal, 408= last i bagagelucka
case 1:
digitalWrite (Level_0_UT,LOW); digitalWrite (Level_1_UT,LOW);
digitalWrite (Level_2_UT,LOW); digitalWrite (Level_3_UT,LOW); LevelVal = 1000; //305 ohm
break;
case 2:
digitalWrite (Level_0_UT,HIGH); digitalWrite (Level_1_UT,HIGH);
digitalWrite (Level_2_UT,LOW); digitalWrite (Level_3_UT,LOW); LevelVal = 650; //202 ohm
break;
case 3:
digitalWrite (Level_0_UT,HIGH); digitalWrite (Level_1_UT,LOW);
digitalWrite (Level_2_UT,HIGH); digitalWrite (Level_3_UT,LOW); LevelVal = 350 ; //95 ohm
break;
case 4:
digitalWrite (Level_0_UT,HIGH); digitalWrite (Level_1_UT,LOW);
digitalWrite (Level_2_UT,LOW); digitalWrite (Level_3_UT,HIGH); LevelVal = 2; //0 ohm
break;
case 5:
pressCount = 0;
break;
}
LevVal = map(LevelVal, 0, 1023, 2, 80); // 305 ohm=80 scale it to use it with the servo (value between 0 and 180)
myservo.write(LevVal); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
delay(200);
}

LED golvbelysning.

LED listerna som satt i Reflexrampen har blivit monterade i kupen som golvbelysning.
Blev en tjuvkoppling under reläboxen för att norpa innebelysningsström.
Så nu kan man se det skitiga golvet, jippi.

Varför jag tog bort LED belysningen i Reflexrampen var att för att det blev en lite modigare belysning....fast jag har en avstängningsknapp som fortfarande är i AV läget tillsvidare....















Borrade hål i bakpanelen och monterade små glödlampor som jag målade lite svart i toppen på
så att det inte skulle bli skarp direktbelysning. (orsaken till att inte välja LED var att det blev för skarpt ljus.) Vilket min bild motsäger men kameran ljuger.

AUC, AQS (Air Quality Sensor) eller Luftkvalitets Sensor kärtbarn har många namn....

Och en bild säjer mer en tusen ord....
En ljussensor sitter och kontrollerar statusen på AQS sensorn. Sensorn inkapslad för omgivningsljus
vid luftintaget utanför kupefiltret. Om den skulle indikera på dåligluft gul eller rött så kopplas
recirkulationen in sålänge som luften är dålig eller max 5 min.. Programmet läser också av om
recirk. är aktiv eller inte.

 

















Placerat en ledgrafindikering bredvid turbomätaren.
(Lite ljussvag på bilden.)












Liten uppdatering av Mjukvaran som aktiverar 5 min timer även för Manuellt aktiverad recirkl.
så att man inte glömmer bort den och kvävs...här skulle man kunna tänka sig en fuktsensor som får
hålla koll på när det är dags att inaktivera recirkulationen men det blir i version 3.
Den klena indikeringen bytes ut mot en lysdiod som kan skifta från grönt till rött som jag monterade
in i ACC enheten (här blev det nästan felborrat inte lätt när man ska tänka spegelvänt och borra.)
Den blinkar grönt vid uppvärmnings fasen och blinkar rött när AQS visar "gult" och ger fast rött sken vid "röd" nivå. Jag kan väl säga att vi har väldigt bra luft i Sverige har inte lyckats få den att indikera gult mer än vid testning......Får väl åka ner till Rhurområdet i Tyskland för att få dålig luft det är väl där BMW och Mercedes testar sina AQSer.
Uppdatering: Får ta tillbaks det där med Ruhrområdet. Efter att jag placerat AQS sensorn brevid inloppet vid filtret dröjde det inte länge föränn jag fick den att visa rött (typisk att det var bakom en 9-5a....). Satte dit ett litet plast tak så att den inte ska bli blöt vid regn.
Uppdaterat med symboler för dioderna på ACCn.
En diod som visar när 5 min timern är aktiverad.
Ni får väl ha en gissning på vilken diod som står för vad.....(se bild högre upp)
Uppdatering 2014-02:
Nu med snabbare avläsning av recirk. dioden i mjukvaran.

AUC eller AQS Air Quality Sensor programmet.

Senaste programvaran finns på Google Driven./2021-06-07

Automatisk "Follow me home" funktion.

eller en dålig raggnings replik ? Iochmed att helljus automatiken inte fungerade som jag ville så
tänkte jag nyttja relät till denna funktion. När det är mörkt ute och man stänger av bilen så
tänds helljuset i ca. 30 sek. så att man hittar hem ordentligt. Jag utnyttjar den tidsfördröjda
dator avstängningen till Arduino korten så att dom är aktiverade 30 sek efter att tändningen
slås av. Så nu är det bara att vänta på Höstmörkret......

Sedan en modifiering av mjukvara:

  // Follow Me Belysning
  powerOnIN = analogRead(5);         //läser av om 12 volt är på pin 5 analog ingång
    lightsensorValue = analogRead(frontlightPin);    //läser ljusensor värdet
    refValue = analogRead(reflightPin);            //läser ref.ljusensor värdet
  if (powerOnIN < 500 && refValue > night && lightsensorValue > night) // 12 volt saknas och ljussensorn & ref. sensorn ind. mörker +20 
   {
      delay (100);  // ljusförändring mellan tiden 40ms
      lightsensorValue = analogRead(frontlightPin);    //läser ljusensor värdet
      refValue = analogRead(reflightPin);            //läser ref.ljusensor värdet
      powerOnIN = analogRead(5);         //läser av om 12 volt är på pin 5 analog ingång
  if (powerOnIN < 500 && refValue > night && lightsensorValue > night) // 12 volt saknas och ljussensorn & ref. sensorn ind. mörkervärde 
              {
                digitalWrite(lightrelayPin,HIGH);  // aktiverar helljuset
                delay(30000);                      //helljus på i 30 sek
                digitalWrite(lightrelayPin,LOW);  // bländar av helljuset
              } 
              else  {
                digitalWrite(lightrelayPin,LOW);  // bländar av helljuset
              }
              }
 else  {
                digitalWrite(lightrelayPin,LOW);  // bländar av helljuset
       }

Världens minsta Turbotryckmätare ?

Eftersom jag har lite kapacitet kvar på Arduinokortet för Hel och Halvljuset så blev det en liten tryckmätare.
Med en programsnutt ifrån Arduino.cc hemsida. Det enda jag behövde ändra var utgångarna.
0-5 volt ingång stämmer också perfekt för värdena ifrån MAP sensorn. 
Det enda jag ska föröka göra är att den visar peakvärdet och uppdaterar den 1ggr/sek.

(Dioden högst upp visar när Halvljus-automatiken har tänt halvljuset.)

1 diod = -0,75 bar
4 dioder = 0 bar
6 dioder = 0,5 bar
8 dioder = 1 bar
9 dioder = 1,25 bar


2015-04: Ändrat i mjukvara så att tiden nollas så länge maxtrycket uppdateras
Det innebär att maxtrycket visas i 10sek. efter att det uppnåtts.
Vet inte varför jag inte gjort den här förändringen tidigare....

Koden med Max. visning i 10 sek.:

// these constants won't change:
const int analogPin = A0;   // the pin that the potentiometer is attached to
const int ledCount = 10;    // the number of LEDs in the bar graph 
int ledMax = 0;
long previousMillis = 0;
long interval = 10000;           // interval at which to blink (milliseconds)

    int ledPins[] = {
      4, 5, 6, 7,8,9,10,11,12,13 };   // TURBO an array of pin numbers to which LEDs are attached
void setup() {
  // TURBO loop over the pin array and set them all to output:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
     pinMode(ledPins[thisLed], OUTPUT);
  }       //diodtest snurra
      for (int thisLed = 0; thisLed < ledCount; thisLed++) {
      digitalWrite(ledPins[thisLed], HIGH);
      delay(100);   
      digitalWrite(ledPins[thisLed], LOW);
  }
}
void loop() {
 //  TURBO tryckmätaren
    unsigned long currentMillis = millis();   // flyttad 2015-04  
int sensorReading = analogRead(analogPin);  // 0-5 volt
   // mapsensor värden: 0,75bar=3,3volt ; 0,5=2,8; 0,25=2,4; 0=1,9; -0,5=0,95; -0,75=0,48
   int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
      if (ledLevel > ledMax) {
          ledMax = ledLevel;     // läser av maxvärdet  flyttad 20115-04
          ledMax = ledLevel;   } 
/*
      Alt. om den bara skall visa en diod för aktuellt tryck.
 for (int thisLed = 0; thisLed < ledCount; thisLed++) {    // loop over the LED array:
       digitalWrite(ledPins[thisLed], LOW);     // släcker alla dioder
       digitalWrite(ledPins[ledLevel], HIGH);  //tänder bara den dioden för aktuellt värde
       digitalWrite(ledPins[ledMax-1], HIGH);  // visar max nivån under en viss tid.
    */
  // loop over the LED array:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
     if (thisLed > sensorReading) {
       ledMax == ledLevel;
     }// if the array element's index is less than ledLevel,
     // turn the pin for this element on:
     if (thisLed < ledLevel) {
       digitalWrite(ledPins[thisLed], HIGH);
      digitalWrite(ledPins[ledMax], HIGH);
     }    
      // turn off all pins higher than the ledLevel:
    else {
      digitalWrite(ledPins[ledMax-1], HIGH);
      digitalWrite(ledPins[thisLed], LOW);
    }
      // flyttad unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) {
     // save the last time you blinked the LED
    // flyttad previousMillis = currentMillis;  
    ledMax = 0;
     }
  }
}

Backsensor ingår väl på en modern bil.

Nu när det är vår och barnen på gården börjar hoppa och skutta så är det säkrast att ha lite hjälp när man backar ut bilen, inte lätt att hålla koll på dem.
Tänkte att det är väl simpelt att slänga dit grejerna och koppla in det men tji fick jag.
Började med att kablarna till backlampan byter färg i luckan från brun & blå till
vit & svart. Men med lite ohmmätning och en knappnål så hittade jag rätt vita kabel i tröskeln vid bakdörren.

Sedan skulle det bara vara att borra hål i kofångaren med en medföljande 22mm borr och med en lång borr som jag har sedan tidigare. Tyvärr var den bara 6 mm och inte 8-10 mm som man skulle behövt för att få igenom kontakten. Fick borra snett nedåt för att kunna vidga hålen och med lite svordommar och hetsiga ord kunde jag mosa igen kontakterna. Enklast kanske hade vart att skruva ner kofångaren helt man läs sig hela tiden. Och via "dragkrokskablagegenomgången" drog jag kablarna vidare in i bagegeutrymmet.
Skitig bil som vanligt.
Centralenheten placerade jag där elantennen satt den skorrade mer än hissade upp och ner antennen trots renoverings kit och ny antennpinne så den åkte ut.
Högtalaren placerades på enheten också så man får sänka volymen lite om man ska höra den.
Tänkte att jag skulle koppla in mute kabeln på stereon samtidigt som dom främre lamporna
så tystnar stereon när man backar. Får se när det blir av.....
Det blev kvickare gjort än väntat jag passade på när jag ändå höll på med kabeldragning.
Tydligen triggar "mute" ingången på stereon på jordning så det blev ett litet relä för att lösa det.
Men det fungerar stereo tystnar och dom främre backlamporna tänds vid backning.