Stap 4: Firmware
Stap 1 is opgenomen in zijn eigen door de gebruiker gedefinieerde functie. U leest eerst de analoge PIN aangesloten op de potmeter. Dit zal resulteren in een lezing tussen 0-682 (onthoud we op 3,3 v, niet 5). Vervolgens willen we een retourwaarde 0-11, vertegenwoordiging van de 11 segmenten op onze thermometer, aan het hoofdprogramma. Om dit te doen u integer uitvoeren op de ingang met de grootte van een segment, 62 (682/11 = 62). Het gebruik van integer divisie, die alleen gehele getallen gebruikt, is geen vergissing, staat de functie voor het retourneren van een geheel getal zonder de extra stap van afronding van het resultaat met een andere lijn van code.
Eenmaal u uitvoeren het segment dat de pot is die aangeeft voor dat de code moet correleren van dat aantal in de binaire reeks die de juiste LEDs zullen oplichten. De decimale waarden die naar de juiste binaire snaren converteren te controleren van de 595 worden opgeslagen in een matrix waar hun positie in de matrix gunstig hetzelfde als de uitvoer van de pot is.
De laatste stap is om de opdrachten voor 595 van duwen. De volgorde van de bewerkingen is uit te schakelen de klink pin, voorkomen de LEDs wijzigen terwijl de nieuwe commando's zijn geschreven, gebruik de shift opdracht uit voor het verzenden van de binaire snaren via de data pin, die gebruik maakt van de pin klok te onderscheiden van bits, en ten slotte de klink pin om de uitvoer van de nieuwe gegevens over alle pins gelijktijdig opnieuw te activeren.
LED TEST 2 w / 74HC595 //by Bwrussell 2013 / / / * * dit programma is vrije software; u kunt het herdistribueren en/of wijzigen * het onder de voorwaarden van de GNU General Public License zoals gepubliceerd door * the Free Software Foundation; ofwel versie 2 van de licentie, of * (naar uw keuze) een latere versie. ** Dit programma is gedistribueerd in de hoop dat het bruikbaar, * maar zonder enige garantie; zelfs zonder de impliciete garantie van * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Zie de * GNU General Public License voor meer details. * / //74HC595-Arduino Pin interfacedefinities //Pin verbonden met de ST_CP van 74HC595 int latchPin = 8; Pin verbonden met SH_CP van 74HC595 int clockPin = 12; Pin verbonden met DS van 74HC595 int dataPin = 11; Pin verbonden met de sweep-pin van de pot #define potPin A5 //arrays waarin de Staten van de LED voor de positie van elke pot, één voor elke 595 int ledStatesA [] = {1,2,6,14,30,62,126,254,254,254,254,254}; int ledStatesB [] = {0,0,0,0,0,0,0,0,1,3,7,15}; Variabele Defs int knobPosition; void setup {//Start Serial voor debugging doeleinden Serial.begin(9600); //set pinnen naar uitvoer, omdat zij zijn gericht in de hoofdlus pinMode (latchPin, OUTPUT); pinMode (clockPin, OUTPUT); pinMode (dataPin, OUTPUT);} void loop {knobPosition = potRead(); digitalWrite (latchPin, 0); //send gegevens naar de tweede 595 shiftOut (8-11) (dataPin, clockPin, ledStatesB[knobPosition]); //cosend gegevens naar het eerste 595 (0-7) shiftOut (dataPin, clockPin, ledStatesA[knobPosition]); //return de klink pin hoog signaal dat het chip //no langer moet luisteren voor informatie digitalWrite (latchPin , 1); } ongeldig shiftOut (int myDataPin, int myClockPin, byte myDataOut) {/ / dit verschuivingen 8 bits uit MSB eerst, //on de stijgende rand van de klok, //clock Verbreek na inactieve periode van lage //internal functie setup int ik = 0; int pinState; pinMode (myClockPin, OUTPUT); pinMode (myDataPin, OUTPUT); //clear alles uit geval tot verschuiving van het //prepare registreren voor beetje verschuiven digitalWrite (myDataPin, 0); digitalWrite (myClockPin, 0); voor (ik = 7; ik > = 0; i--) {digitalWrite (myClockPin , 0); Als (myDataOut & (1 << ik)) {pinState = 1;} else {pinState = 0;} //Sets de pin te hoog of laag afhankelijk van pinState digitalWrite (myDataPin, pinState); registreren van verschuivingen stukjes op ophaal klok pin digitalWrite (myClockPin, 1); de data pin nul na verschuiving naar voorkomen bloeden door middel van digitalWrite (myDataPin, 0); } //stop verschuiven van digitalWrite (myClockPin, 0); } / / Functie voor lezing en segmanting de pot ingang int potRead () {int potRaw = 0; //read in de positie van de ruwe pot, gemiddeld meer dan 5 monsters voor (int ik = 0; ik < 5; i ++) {potRaw = potRaw + analogRead(potPin);} potRaw = potRaw/5; //segment de onbewerkte gegevens in 12 gelijke segmants, geeft als resultaat een waarde 0-11 int potPosition = potRaw / 60; 60 //Use voor 3,3 v, 93 voor 5V in de pot //send het huidige segment de hoofdlus return potPosition;}
De broncode is beschikbaar in het zip-bestand (de Ino zou niet uploaden) en een tekstbestand.
Gewoon een snelle plug: In enkele van de eerste testen gebruikte ik het vrij nieuwe ArduinoDroid app voor Android. Het is vrij ontzagwekkend voor wat het is. U kunt Arduino code, met kleurcodering schrijven en compileren, overal, zoals op lunchpauze op het werk. Met een goede USB-kabel kunt u ook macht en uploaden naar een Arduino board. Er zijn een aantal andere functies die ik heb niet nog als Bluetooth controle en dergelijke, maar voor een maker voor onderweg gebruikt of veldwerk dit app is fenomenaal. Ik zou sterk aanbevelen het vooral omdat het volledig gratis (ad ondersteund) en onbeperkt. Als je het dan u kunt betalen een nominale vergoeding te verwijderen van de advertenties en ontwikkeling te ondersteunen. Ik weet niet wie de ontwikkelaar is maar ze rock.