Bird cage LED daylight simulation system (3 / 10 steg)
Steg 3: LED dimmring
Ljusreglering/blekning av lysdioder är den viktigaste delen av dagsljus simulering systemet. Lysdioderna kan vara bleknat genom att leverera en PWM-signal i stället för en DC signal. Ett exempel på detta är känt för de flesta arduino ägare: exemplet "fade". Det enda du behöver för detta är en enkel LED och ett motstånd för att begränsa strömmen genom kretsen.
Samma kod kan användas för blekning en LED strip istället för en enstaka LED. När driver eller blekning en LED strip, spänningen eller den ström som kan levereras av en Arduino stift inte längre tillräckligt. Därför införs en n-kanal NPN transistor. En mycket vanlig transistor för detta är BD135. Den ström som kan levereras av denna LED är begränsad (TO220 typ jag använde för detta kan leverera Max 1A). Om det behövs mer makt, kan en Power MOSFET användas.
En exempel krets visas nedan:
Här är ett 9V batteri för att driva en led som kontrolleras av en Arduino. 9v batteri representerar här, med extern strömförsörjning. Observera att en 10 k externa puldown motstånd för att hålla signalen låg tills arduino levererar en signal på Pin 9. Även om du driver en LED strip, de strömbegränsande motstånd är redan integrerade i remsan själv och kan lämnas.
Exemplet ovan tar inte hänsyn till konto två saker:
- Relationen mellan puls och (upplevd) LED ljusstyrka är inte linjär, utan logaritmisk (eller åtminstone: logaritmisk är en tillräckligt bra approximation)
- Standardfrekvensen för PWM är ganska lågt, detta riskerar att störa fåglarna om de är i detta ljus hela dagen
Google är din vän, och det finns en hel del ämnen som omfattar snabb PWM och logaritmisk LUTs för arduino, så du slipper uppfinna hjulet på nytt. Min huvudsakliga källa till inspiration: http://forum.arduino.cc/index.php/topic, 130736.0.h...
Så är här några exempelkod som använder en logaritmisk LUT och snabb PWM på stift 9:
Observera att detta fungerar på min duemillanova klon, och kanske inte fungerar på Arduino mega, rakt, leonardo etc.
< p > / * BirdLight < /p >< p > exempel på en 12 bitars logaritmisk LUT & snabb PWM för försiktigt öka
/ avtagande ljusstyrka under dagen till natt och natt till dag övergångar. < /p >< p > kod mestadels Hämtad från: < en href = "http://forum.arduino.cc/index.php/topic, 130736.0.html" > http://forum.arduino.cc/index.php/topic, 130736.0...</a> < /p >< p > Copyright 2013 - Patrick Bronneberg
*/
/ *---(Konfiguration)---* /
CONST double Night_Level = 5.0;
CONST double Day_Level = 99,0;
CONST int LED_PWM_PIN = 9; PIN-koden som blekning lysdioder är kopplade till < /p >< p > / *---(deklarera konstanter)---* /
CONST int PWMMax = 4095; Ställ in maximal ljusstyrka för PWM
Definiera en logaritmisk LUT för PWM ljusreglering
CONST int PWMLut [] = {0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,9,9,9,10,11,
13,15,16,17,19,21,23,25,26,27,29,31,32,33,35,37,39,41,43,45,47,49,51,53,55,57,
60,63,66,69,71,74,77,80,84,88,91,94,98,102,106,110,114,118,123,128,133,138,143,
148,154,160,166,172,179,185,192,199,207,214,222,230,239,248,257,266,276,286,296,
306,317,329,341,353,366,379,392,406,421,436,451,466,483,500,518,536,555,574,595,
616,638,661,684,707,732,757,784,811,840,869,900,931,964,997,1032,1067,1105,1144,
1184,1224,1267,1311,1357,1404,1453,1503,1555,1609,1665,1722,1782,1843,1907,1973,
2042,2112,2185,2260,2339,2419,2503,2589,2679,2771,2867,2965,3069,3174,3284,3397,
3514,3629,3761,3905,4024,4079,4094}.
Definiera storleken på lut: Observera att heltal 16bits så 2 byte
CONST int lutSize = sizeof (PWMLut) / 2; < /p >< p > / *---(förklarar globala variabler)---* /
int ledBrightnessLevel = 0;
int dayLevel = 0;
int nightLevel = 0;
booleska isDay = true; < /p >< p > void setup()
{
Initiera LED PWM
pinMode(LED_PWM_PIN,OUTPUT);
TCCR1A = (1 << COM1A1) | (1 << WGM11); Aktivera snabb PWM på OC1A (Pin 9)
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); Läge 14 snabb PWM / (TOP = ICR1), före skala = 1
ICR1 = PWMMax; Som det bästa värdet för 12-bitars PWM
Beräkna nivåer från konfigurerade procentsatser
dayLevel = LutPercentageToLevel(Day_Level);
nightLevel = LutPercentageToLevel(Night_Level);
} < /p >< p > void loop()
{
om (isDay)
{
Minska led ljusstyrka tills vi når natt-nivå
om (ChangeLedBrightness (nightLevel, -1))
{
isDay = false;
}
}
annat
{
Öka intensiteten för led tills vi når dag nivå
om (ChangeLedBrightness (dayLevel, -1))
{
isDay = sant;
}
}
} < /p >< p > dubbel LutLevelToPercentage (int lutLevel)
{
återgå lutLevel * 100,0 / lutSize;
} < /p >< p > int LutPercentageToLevel (dubbel lutPercentage)
{
avkastning (int)((lutSize/100.0)*lutPercentage);
} < /p >< p > boolean ChangeLedBrightness (int finishedLevel, int ledFadeAmount)
{
den nuvarande ljusstyrkan
analogWrite (LED_PWM_PIN, PWMLut[ledBrightnessLevel]); < /p >< p > / / ändra ljusstyrkan för nästa gång genom öglan:
ledBrightnessLevel = ledBrightnessLevel + ledFadeAmount; < /p >< p > //Check om ljusreglering är slutförd
om ((ledFadeAmount > 0 & & ledBrightnessLevel > = finishedLevel)
|| (ledFadeAmount < 0 & & ledBrightnessLevel < = finishedLevel))
{
Klar!
return true;
}
Ännu inte klar
returnera false;
} < /p >