Automatisk ljusnivåreglering.

Tänkte att det skulle vara smidigt med lite automatik istället för den manuella justeringen som man alltid glömmer att justera till frustration för mötande. Givaren för nivå avläsningen är en kopia på dom jag sett på Bildelsdatabasen. En potentiometer med lite länkarmar. Jag tog en gammal pot. ifrån en radiostyrenhet som slaktats tidigare och länkarmar ifrån en beg. vindrutetorkare. Man tager vad man haver. Monterade pot. på tankbandet och länkarmar fäst vid bakaxeln. Pot.(10kohm inte så noga) matas med +5 volt och Jord i ändlägena. Signalen ut matas in på Analog ingång 2 på Arduinokortet.
 Sedan blev det att ersätta motstånden i den befintliga justeringen med egna. Det blev ett färdigt reläkort till Arduino. För den som undrar varför jag kopplade det första relät inv.så att den är aktiv jämt. Är det för att den ska ställa in sig i "normal" nivå oavsett strömförsörjning mm

Programmet läser av nivån 3 sek. efter start och justerar då in rätt nivå. Vet inte hur riktiga nivåregleringar fungerar men tanken är att man lastat in det som ska med och sedan startar och åker iväg. Om man vill ändra nivån så trycker man in knappen x antal ggr tills den ställer in sig på den nivån man vill ha. Sista steget (5 knapptryckningen) så gör den en ny avläsning av nivån om man vill. Det gäller väl att man står hyfsat still när man gör det och inte stutsar runt på någon skogsväg.
PS. Den större gröna dioden kopplade jag till halvljusautomatiken så att det blev en tydligare indikering när halvljuset är aktivt.                                                                                                









Uppdatering 2014-01:
Det blev en liten julklapp, jippi. Servomotor till Arduinokortet.
Så då har det blivit en konvertering av nivåregleringen till en analogjustering. Servomotorn styr en potentiometer på 1k. och den regleras mellon 0-300 ohm.
 Programvara har fått sig en uppdatering också.


Den läser av nivån med ca. 15 sek intervaller och
är det samma stabila nivå så justerar den servoläget.

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