Arduino/App kontrollerade skrivbord ljus (4 / 6 steg)
Steg 4: Arduino kod
Som med App koden ska jag täcka detta kort...
Först setup jag min variabler, tilldela sensorer och leds till rätt stift. Utdata från hall effekt sensorer kommer att läsas med funktionen analogRead, vilket ger ett värde mellan 0 och 1023. Som tidigare beskrivits utgångar det hälften när inga magneter presenterar, så omkring 500. Jag använder låg och hög trigger variabler att tillåta mig att enkelt justera när det vet pucken är över sensorn.
Neopixels kräver ett bibliotek så att är definieras här...
Ogiltiga inställningar börjar följetong, för mikro Rx/Tx stift (bluetooth) använda Serial1... Stiften är sedan skapa ingångar eller utgångar och LED'S set off.
Nu är det den viktigaste loopen...
Detta första avsnitt är att kontrollera om data är tas emot från App. Serial1.available() läser seriella och att få antalet byte i strängen. Om det > 0 jag vet datas inkommande.
Om du kommer ihåg, alla strängar som jag skickar från App avslutas med ett frågetecken... dvs (Bright100)?
Jag använder funktionen .readStringUntil att läsa seriella data upp till frågetecknet (Bright100) och sätta variabeln BTstring till detta. Jag kollar om BTstring slutar med en ') "att se till kompletta kommandon tas emot. Om de är, då den BluetoothProgram slingan är benämnas... Detta beskrivs längre ner...
Denna nästa bit styr sunrise larmet. I princip om larmet är aktiverat och tiden är korrekt börjar då det bleknande upp lysdioder. På grund av det mänskliga ögat är uppfatta ljus logaritmiskt bättre att göra någon form av LED fade ups/ner med en exponentiell kurva snarare än linjärt. Därav driver en ekvation PWM värden...
För att undvika pucken störa App kontroll blir det inaktiveras när du använder App. För att åter aktivera pucken måste du flytta det utanför produkten i 5 sekunder... Denna bit kod kontrollerar först om alla sensorer utskrift av en stationära tillståndets värde (ingen magnet) och sedan startar en timer. När 5 sekunder är klar sätts variabeln BTinControl tillbaka till false.
Koden för pucken nu... Sensorerna måste först läsas.
Om ljuset är för närvarande avstängd, kommer att det kontrollera om någon av sensorerna är ovanför eller nedanför triggerpunkter dvs pucken har placerats på bågen. Om det är då det kommer att tona upp vita LED's till din senaste inställning oavsett var du placerar den.
För att hålla lysdioder set till din senaste inställning istället för uppdatering till som associeras med oavsett sensorer dess utlösande, är MovedSinceStandby variabeln satt till false. Denna nästa bit kod kontrollerar i princip oavsett om du har flyttat pucken från sitt ursprungliga läge av en viss...
Om du flyttar pucken kallas "MainProgram" för att uppdatera ljusstyrka/färg temp. Detta beskrivs längre ner.
Den sista biten i denna huvudloop kontroller om pucken har lagts tillbaka på standby docka - är sensor 12 läsning ett värde över/under en trigger-punkt. Så bleknar det LED tillbaka ner...
Bluetooth-loop:
Som beskrivs ovan när data tas emot via bluetooth, läses strängen. Vi måste nu kolla vad strängen säger...
Alla strängar förutom ljusstyrka, färg temp och RGB är ganska lätt att hantera. Du kontrollera om BTstring är lika med den text som skickas från App.
Om ni minns, när du ändrar skärmar i App skickas ett bluetooth-kommando. Här vi fråga för det och vissa variabler att sant eller falskt så vi vet vilken skärm du är på.
Märka i slutet av varje avsnitt jag anger du variabeln BTinControl till true och rensa BTstring värdet.
När du trycker på strömbrytaren i App kommer det försvinna lysdioderna upp eller ner. De variabler som ovan för vilken skärm du på används för att avgöra om det är RGB eller vita LED till kontroll...
För ljusstyrka, färg temp och RGB måste jag läsa strängarna på ett något annorlunda sätt. Eftersom den främsta delen av strängen kommer att ändra jag ifrågasätter huruvida strängen börjar med en av identifierarna inte full strängen, så det är bara (Bright här...
Jag måste nu att skilja ut de faktiska intensitetsvärde från strängen. Formatet på strängen skickas från App är (Brightvärde) så därför vet jag intensitetsvärde mellan 't 'och den') ". Positionen för 't' förblir konstant, det kommer alltid vara den 7: e tecknet i strängen. Men eftersom ljusstyrka kan vara mellan 10 och 100 ställning den ') "kommer att förändras. Jag använder kommandot .indexOf för att räkna ut var den ")" är, vilken karaktär det är och kan sedan använda kommandot .substring för att läsa strängen mellan 7: e tecknet och ")" karaktär position. Detta lämnar mig med bara ljusstyrka värde som jag kan använda för att justera RGB eller vita LED beroende på skärmen.
Temp färgjusteringen är en liknande process ovan men värdet kommer att vara mellan "p" och ")" denna gång...
För RGB justering har vi tre värden till extraktet från strängen, men det är en liknande process igen. Från app vi få strängar i form (RGBvärde. värde. värde)
Så jag vet blir röda värdet mellan "B" och det första fullt stoppet. Det gröna värdet är mellan de 1: a/2: a full stannar och blå värdet är mellan det 2: a fullt stoppet och ")".
När vi har ställs värdet neopixles till ny färg...
Här kontrollerar vi om larmet är att aktiveras eller inaktiveras. Om alarmtiden ändras kommer vi få skickas en sträng med antalet millisekunder från nu till larmet. Detta värde är igen utdraget från strängen och för att kontrollera om det är dags att börja soluppgången måste vi in en variabel till den aktuella tiden (millis)...
Pucken kontroller:
Som beskrivs innan om pucken (magnet) är ett sätt upp det att köra hall sensor utdata nedan låg utlösaren och om den andra långt upp över höga utlösaren.
Detta möjliggör kontroll av både ljusstyrka och färgtemperatur på samma båge...
Sensorer värdena avläses. Om någon av dem är mindre än värdet för låg trigger vi justera färgtemperatur. Det finns 11 sensorer i arc-området, som utgångar kommer i sin tur gå nedan trigger-punkt som pucken är flytta över dem. Varje sensor har en PWM-värde för de svala och varma lysdioderna mot det, börjar med sensor 1 på 100% varm, 0% cool och arbetar för att 11 på 0% varm, 100% cool.
Ljusstyrkan kontrollen sker på samma sätt... Kontrollera om sensorer utgångarna är ovanför den höga utlösaren denna gång och ge varje sensor en ljusstyrka viktning värde.
Denna ljusstyrka viktning multipliceras sedan med det färg temp värdet att ge totalt produktionen värde. Så att du kan ställa in någon färg temp till någon ljusstyrka...