Livskvalitet mätaren (4 / 8 steg)
Steg 4: Firmware
Steg 1 ingår i det egna användardefinierade funktionen. Först läsa du i den analoga pin ansluten till potentiometern. Detta kommer att resultera i en läsning mellan 0-682 (kom ihåg vi är på 3.3V, inte 5). Nästa vi vill returnera ett värde 0-11, som representerar de 11 segment på vår termometer, till huvudprogrammet. Detta utför du ett heltal på indata med storlek på ett segment, 62 (682/11 = 62). Användning av heltalsdivision, som använder endast heltal, är inte ett misstag, det gör att funktionen returnerar ett heltal utan att ta det extra steget för avrundning resultatet med en annan rad med kod.
En gång du utgång det segment som potten indikerar behöver koden att korrelera det tal till binära sekvensen som tänds upp lämpliga lysdioderna. De decimala värden att konvertera till de korrekt binära strängarna att styra 595 lagras i en matris där deras position i matrisen bekvämt är samma som utdata från potten.
Det sista steget är att driva kommandon till 595's. Utförs är att deaktivera spärr stiftet, förebygga lysdioderna från att ändra medan de nya kommandona skrivs, använda SKIFT kommandot Skicka de binära strängarna genom data stift, som använder klockan stiftet för att skilja bitarna, och slutligen återaktivera spärr stiftet att mata nya data över alla stiften samtidigt.
LED TEST 2 w / 74HC595 //by Bwrussell 2013 / / / * * det här programmet är fri programvara; Du kan vidaredistribuera det och/eller ändra * det enligt villkoren i GNU General Public License som offentliggörs av * Free Software Foundation; antingen version 2 av licensen, eller * (på ditt alternativ) någon senare version. ** Detta program är distribuerat i hopp om att det kommer att vara bra, * men utan garantier; utan att ens underförstådd garanti om * SÄLJBARHET eller lämplighet för ett visst ändamål. Se den * GNU General Public License för mer detaljer. *-//74HC595-Arduino Pin gränssnittsdefinitioner //Pin ansluten till ST_CP av 74HC595 int latchPin = 8; PIN ansluten till SH_CP av 74HC595 int clockPin = 12; PIN ansluten till DS för 74HC595 int dataPin = 11; PIN ansluten till svep stift potten #define potPin A5 //arrays som håller LED staterna för varje pott position, en för varje 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}. Variabel Defs int knobPosition; void setup() {//Start följetong för debuging ändamål Serial.begin(9600); //set stift till utgång eftersom de behandlas i huvudloop pinMode (latchPin, produktionen), pinMode (clockPin, produktionen); pinMode (dataPin, produktionen);} void loop() {knobPosition = potRead(); digitalWrite (latchPin, 0); //send data till den andra 595 (8-11) shiftOut (dataPin, clockPin, ledStatesB[knobPosition]); //cosend data till de första 595 (0-7) shiftOut (dataPin, clockPin, ledStatesA[knobPosition]); //return spärr stiftet hög signal chip att det //no längre behöver lyssna för information digitalWrite (latchPin , 1); } makulera shiftOut (int myDataPin, int myClockPin, byte myDataOut) {/ / Detta skiftar 8 bitar ut MSB första, //on stigande kanten av klockan, //clock går på tomgång låg //internal funktion setup int jag = 0; int pinState; pinMode (myClockPin, produktionen), pinMode (myDataPin, produktionen); //clear allt ut bara i fall att //prepare SKIFT register för lite skiftande digitalWrite (myDataPin, 0), digitalWrite (myClockPin, 0); för (jag = 7; jag > = 0; i--) {digitalWrite (myClockPin , 0); om (myDataOut & (1 << jag)) {pinState = 1;} annat {pinState = 0;} //Sets stift till hög eller låg beroende på pinState digitalWrite (myDataPin, pinState); registret skiftar bitarna på upstroken av klocka pin digitalWrite (myClockPin, 1); noll data stift efter skift för att förhindra att blöda genom digitalWrite (myDataPin, 0); } //stop skiftande digitalWrite (myClockPin, 0); } / / Funktion för läsning och segmanting potten ingång int potRead () {int potRaw = 0; //read i rå pot-läge, utjämning över 5 prover för (int jag = 0; jag < 5; i ++) {potRaw = potRaw + analogRead(potPin);} potRaw = potRaw/5; //segment rådata till 12 lika segmants, returnerar ett värde 0-11 int potPosition = potRaw / 60, //Use 60 för 3.3V, 93 för 5V hela potten //send det aktuella segmentet till huvudloop återvända potPosition;}
Källkoden finns i zip-filen (.ino inte skulle ladda upp) och en fil med oformaterad text.
Bara en snabb plugg: I några av de första provning använde jag ganska ny ArduinoDroid app för Android. Det är ganska häftigt för vad det är. Det kan du skriva Arduino kod, med färgkodning och sammanställa, var som helst, gillar på lunchrasten på jobbet. Med en ordentlig USB-kabel kan du också makt och överför till en Arduino ombord. Det finns några andra funktioner som jag inte använt ännu som Bluetooth kontroll och sådant men för en maker på språng eller fältarbete denna app är fenomenal. Jag rekommenderar starkt det särskilt eftersom det är helt gratis (ad stöds) och obegränsad. Om du gillar det kan du betala en nominell arvode till flytta annonser och stödja utvecklingen. Jag vet inte vem utvecklaren är men de rock.