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

Inga kommentarer:

Skicka en kommentar