Arduino & Neopixel helt härledda falska TV (5 / 8 steg)
Steg 5: Kod källa notering
DIY falska TV
Hålla inbrottstjuvar borta medan du är borta
Skapad av Jonathan Bush
Senast uppdaterad 3/24/2015
Runnig på ATTiny 85
Uppdaterad 8/4/2015 av Mark Werley för prydnadssak Pro
Omskriven för att undvika användning av funktionen delay()
Initierade MAXBRIGHT till 255, högst
Lagt till användningen av multiMAP funktionen för att konvertera en enhetlig fördelning till något nonuniform
Lagt till en auto-avstängningsfunktionen så lamporna gå mörka efter en viss tid
Lagt till en mjuk omstart funktion efter 24 timmar så showen startar upp igen varje dag vid samma tidpunkt
Lagt till en blinkning på den inbyggda LED, så att användaren kan berätta program körs när neopixels är avstängda
#include < Adafruit_NeoPixel.h >
#define PIN 3 //PIN 3 "kör" i NeoPixels. Fungerar på Uno eller fasad Pro
#define ledPin 13 //PIN 13 har inbyggd LED för Uno eller prydnadssak Pro
#define buttonPin 4 //PIN 4 har en knapp kopplad via en 10 k pullup resister
int ledState = låg; Hålla reda på statligt av inbyggda LED
int buttonState = 0; Hålla tarmkanalen av knappen
int endShow = false; Sant när showen är över
int POTPIN = A1; 1. analoga potten pin, används för att justera ljusstyrkan
int POTPIN2 = A2; 2. analoga potten pin, används för att justera ljusshow skär hastighet
int POTPIN3 = A3; 3. analoga potten pin, används för att justera runtime av showen
Neopixel biblioteket som tillhandahålls av Adafruit, ändra 1 parameter antal lysdioder i din neopixels
Adafruit_NeoPixel strip = Adafruit_NeoPixel (16, PIN, NEO_GRB + NEO_KHZ800);
int ljusstyrka = 0;
int rött = 0;
int blå = 0;
int grön = 0;
int TIMEDEL = 0;
int mapTIMEDEL = 0;
int MAXBRIGHT = 255; Ange MAXBRIGHT 255, max, om ingen ljusstyrka pot
int speedDivider = 1; Ange speedDivider 1, om inget snitt hastighet pot
int potval = 0;
int potval2 = 0;
int potval3 = 0;
osignerade långa runTimeMillis = 0; Hur lång tid falska TV-ljusshow kommer att köras i millisekunder
int runTime = 120; Hur länge Fake TV ljusshow tar i minuter, 2 timmar om inga runTime pot
osignerade långa startMillis = 0; Som ingick i urvalet starttiden för programmet, ususally bara 0 eller 1 millisekunder
osignerade långa previousMillis = 0; Kom ihåg antalet millisekunder från den tidigare skär trigger
osignerade långa rebootTimeMillis = 0; Hur länge programmet kommer att köras innan en soft reset/omstart händer (24 timmar = 86,400,000 ms)
osignerade långa currentMillis = 0; Hur länge programmet har körts hittills
int i [] = {200, 520, 840, 1160, 1480, 1800, 2120, 2440, 2760, 3080, 3400, 3720, 4040}; Detta är bara linjära
int ut [] = {200,392,968,2120,3272,3848,4040,3848,3272,2120,968,392,200}. normalfördelning
int ut [] = {200,392,2120,3848,4040,3848,3560,3272,2696,2120,968,392,200}. LnNormal-ish
int ut [] = {200,250,300,400,600,1200,4040,1200,600,400,300,250,200}. består
int ut [] = {200, 250, 300, 350, 400, 500, 600, 700, 800, 1200, 2000, 3000, 4040}; består #2
void setup() //Initialize allt
{
Initiera NeoPix
Strip.BEGIN();
Strip.show(); Initiera alla pixlar till "off"
pinMode (PIN, OUTPUT); Ange neopixel kontroll stift till utgång
pinMode (ledPin, produktionen); Ange det inbyggda LED stiftet till utgång
pinMode (buttonPin, ingång); ställa in knappen PIN-koden till insatsen
Initiera den seriella com, för felsökning på Uno eller prydnadssak Pro (w FTDI kabel), kommenterar ut för produktion
Serial.BEGIN(9600);
Serial.println ("---Start seriell övervaka SEND_RCVE---");
Serial.println ("följetong är aktiv");
Serial.println();
rebootTimeMillis = 24ul * 60ul * 60ul * 1000ul; hardcode reboot i 24 timmar
startMillis = millis(); prov starttiden för programmet
}
void loop() //Start huvudsakliga slingan
{
currentMillis = millis(); provet millisekunder sedan startades
om (currentMillis > rebootTimeMillis) softReset(); När rebootTimeMillis nås, pånyttfödd
Låt oss läsa våra sensorer/kontroller
potval = analogRead(POTPIN); Läser analoga värde från ljusstyrka Potentiometer/spänningsavdelare, kommentera ut om du inte använder
MAXBRIGHT = karta (potval, 0, 1023, 11, 255); Kartor spänningsavdelare läsning för att ställa in max ljusstyrka btwn 11 och 255, kommentar ut om du inte använder
potval2 = analogRead(POTPIN2); Läser analoga värde från snitt hastighet Potentiometer, kommenterar ut om du inte använder
speedDivider = karta (potval2, 0, 1020, 1, 8); Kartor andra potten läsning att mellan 1 och 8, kommentera ut om du inte använder
potval3 = analogRead(POTPIN3); Läser analoga valuse från Visa lenth Potentiometer, kommentera ut om du inte använder
runTime = karta (potval3, 0, 1020, 15, 480); Kartor tredje potten till mellan 15 och 480 minuter (1/4 till 6 timmar), kommentera ut om du inte använder
runTimeMillis = long(runTime) * 60ul * 1000ul;
Serial.Print("potval3=");
Serial.Print(potval3);
Serial.Print ("runTime =");
Serial.Print(Runtime);
Serial.Print ("runTimeMillis =");
Serial.println(runTimeMillis);
buttonState = digitalRead(buttonPin); Smaka på statligt av knappen
om (buttonState == hög) endShow = sant; Knappen trycktes, dags för att avsluta kvällens show
om ((currentMillis-previousMillis) > long(mapTIMEDEL)) //Test att se om vi är för ett snitt (belysning förändring)
{
LJUSSTYRKA = random (10, MAXBRIGHT). Ändra bildskärmens ljusstyrka från 20% till 100% slumpmässigt varje cykel
RÖD = random (150, 256); Värdet för den röda komponent från 150 till 255
BLÅ = random (150, 256); Ange den blå komponentvärde från 150 till 255
GRÖN = random (150, 256); Ange den gröna komponentvärde från 150 till 255
TIMEDEL = random (200, 4040); Ändra intervall slumpmässigt mellan 0,2 av en sekund till 4,04 sekunder
mapTIMEDEL = multiMap (TIMEDEL, in, ut, 13); Använd funktionen multiMap att mappa om förseningen till något ojämn
mapTIMEDEL = mapTIMEDEL / speedDivider; Dela upp av speedDivider att ställa snabba nedskärningar
om ((currentMillis-startMillis) > runTimeMillis) endShow = sant; runTimeMillis har gått ut, dags för att avsluta kvällens show
om (endShow) //Show's över för natten, aww...
strip.setBrightness(0);
annat //The visar är på!
strip.setBrightness(BRIGHTNESS);
colorWipe (remsa. Färg (röd, grön, blå), 0); Omedelbart ändra hela remsan till nya slumpmässigt genererade färg
om (ledState == hög) //toggle variabeln ledState
ledState = låg;
annat
ledState = hög;
digitalWrite (ledPin, ledState); Flip statligt av (blinka) den inbyggda LED
previousMillis = currentMillis; uppdatera previousMillis och loop tillbaka runt
}
}
Fylla prickar en efter den andra med en färg
void colorWipe (uint32_t c, uint8_t vänta)
{
för (uint16_t jag = 0; jag < strip.numPixels(); i ++)
{
strip.setPixelColor (i, c);
Strip.show();
}
}
Tvinga ett hopp till adress 0 för att starta om skiss. Återställer inte hårdvara eller register
void softReset()
{
ASM flyktiga ("jmp 0");
}
multiMap används för att mappa en distribution till en annan med hjälp av interpolering
Obs: _in matrisen ska ha allt större värden
Kod av rob.tillaart
int multiMap (int val, int * _in, int * _out, uint8_t storlek)
{
ta hand värdet ligger inom intervallet
Val = begränsa (val, _in [0], _in[size-1]);
om (val < = _in[0]) avkastning _out [0];
om (val > = _in [storlek - 1]) returnerar _out [storlek - 1];
Sök rätt intervall
uint8_t pos = 1; _In [0] allready testade
medan (val > _in[pos]) pos ++;
Detta kommer att hantera alla exakta "punkter" i matrisen _in
om (val == _in[pos]) avkastning _out [pos];
interpolera i segmentet rätt för resten
avkastning (val - _in [pos - 1]) * (_out [pos] - _out [pos - 1]) / (_in [pos] - _in [pos - 1]) + _out [pos - 1];
}