Tussenliggende Arduino: Ingangen en uitgangen (1 / 9 stap)

Stap 1: Knipperen zonder Delay()


Tot nu toe dat we zijn met behulp van de functie delay() om te pauzeren de Arduino schets even zo dat een beetje tijd kunt doorgeven tussen twee Arduino opdrachten. In de LED knipperen schets gebruikten we delay() om in te stellen hoe lang die de Arduino werd aangestoken en de hoeveelheid tijd uitgeschakeld:

digitalWrite (ledPin, hoge); //turn LED op
delay(1000); / / wait gedurende 1000 milliseconden (1 seconde)
digitalWrite (ledPin, laag); //turn LED uit
vertraging (1000); //wait één seconde

Soms gebruik van delay() is niet een geweldige optie, omdat de Arduino elke secundaire taken niet worden uitgevoerd terwijl de vertraging is gebeurd. Stel dat we wilden een LED knipperen en een druk op de knop op hetzelfde moment met behulp van delay() detecteren:

loop {}

digitalWrite (ledPin, hoge);
delay(1000);
digitalWrite (ledPin, laag);
delay(1000);
Boole buttonState = digitalRead(7);

}

In de code hierboven, zijn we alleen meten de knop eenmaal om de twee seconden, dus het tot twee seconden duren kan voordat een druk op de knop wordt ontdekt, en kort persen niet ooit krijgen herkend helemaal.

Millis() geeft ons controle wanneer gebeurtenissen plaatsvinden zonder pauzes in de schets. Telkens we millis() in een schets van de Arduino noemen, het geeft als resultaat het aantal milliseconden sinds de Arduino was ingeschakeld.

Voer de volgende code om te zien hoe millis() werkt:

 //recording time with Arduino millis() void setup() { Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); Serial.println(currentMillis); } 

Hier is hoe te het gebruiken van millis() te knipperen van een LED zonder gebruik te maken van delay().

 //blink led without delay() int ledPin = 7; int ledState = LOW;//current state of the LED unsigned long timeOfLastLedEvent = 0;//the last time the LED was updated int intervalON = 1000;//how long we want the LED to stay on int intervalOFF = 500;//how long we want the LED to stay off void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); } void loop() { unsigned long currentMillis = millis(); if (ledState == LOW){//if the LED is already off if (currentMillis - timeOfLastLedEvent > intervalOFF){//and enough time has passed digitalWrite(ledPin, HIGH);//turn it on ledState = HIGH;//store its current state timeOfLastLedEvent = currentMillis;//update the time of this new event } } else {//if the LED is already on if (currentMillis - timeOfLastLedEvent > intervalON){ digitalWrite(ledPin, LOW); ledState = LOW; timeOfLastLedEvent = currentMillis; } } } 

De bovenstaande sketch introduceert enkele nieuwe dingen:

niet-ondertekende lang is een ander gegevenstype (zo ver we hebben gezien int en boolean). Unsigned long is zoals int, maar groter, leg ik uit... Elk gegevenstype vereist een bepaalde hoeveelheid ruimte in het geheugen van de Arduino en de hoeveelheid ruimte die de Arduino omhoog voor een gegeven variabele bevrijdt dicteert de min en max waarden kan worden opgeslagen in de variabele. Bijvoorbeeld, kan int de variëren van-32,768 tot 32.767, als u geprobeerd te doen iets als dit:

int myVariable = 100.000 belonen;

Je zou eindigen met een zeer vreemde bug in je code. Dit lijkt misschien een willekeurig bereik, maar het komt uit het feit dat de int 16 bits van de ruimte in het geheugen van de Arduino vereist en u met 16 bits van binaire getallen van 0 tot kunt (2 ^ 16 - 1) = 65535. Maar mensen besloten dat int moet zitten kundig voor negatieve getallen ook opslaan zodat één van de bits in de 16-bits getal dat wordt gebruikt voor het opslaan van het teken (positief of negatief) en de overige 15 bits waarde opslaan: 2 ^ 15 = 32768. Met inbegrip van 0, we eindigen met het bereik-32,768 tot 32.767. Een ander gegevenstype genoemd een insigned int slaat geen teken, dus het wordt het bereik van 0 tot 65535 dat ik berekend vóór, maar u kunt ook een negatief getal opslaan in een insigned int.

Wanneer we getallen groter dan 65535 of minder dan-32768 gebruiken moeten, gebruiken wij een gegevenstype langegenoemd. Lang 32 bits van ruimte in het geheugen van de Arduino is toegewezen. 2 ^ 32 = 4,294,967,296, centreren dit rond nul om allerlei:-2,147,483,648 naar 2,147,483,647. Niet-ondertekende lang heeft, zoals de unsigned int zijn altijd positief, dus ze variëren van 0 tot 4.294.967.295.

Er is geen grotere gegevenstype voor het opslaan van getallen dan lang, dus als u opslaan een getal groter dan 4.294.967.295 wilt, u zult moeten komen met een verschillende manier te slaan (misschien de eerste 9 bits in één getal en de laatste negen andere?). Deze beperking heeft sommige interessante gevolgen voor de millis()-functie. Aangezien millis niet-ondertekende longs retourneert, en wordt het in milliseconden voortdurend tot nu toe, zal millis() eigenlijk opnieuw terug naar nul keer het bereikt:

4.294.967.295 ms

= 4,294, 967seconds

= 49.71 dagen

Als u millis() gebruikt en u van plan bent op houden die u project uitgevoerd voor langere tijd zonder ooit het uitschakelen of opnieuw instellen, moet u zich bewust van dit.

Nog een opmerking over gegevenstypen: We kunnen gebruiken de lange of niet-ondertekende long deze hele tijd wanneer wij verklaren pin-codes of andere variabelen in de voorbeeld schetsen tot nu toe, maar over het algemeen is het een goed idee om de kleinste gegevens te gebruiken Typ mogelijk voor een variabele, op die manier heb je veel extra ruimte in het geheugen van de Arduino voor andere dingen. In de Arduino, longs worden zelden gebruikt, maar millis() is een goed voorbeeld van wanneer ze van pas komen.

Om terug naar de schets, is het algemene idee om te slaan de laatste keer dat u de LED van een knevel gevoorzid in- of uitschakelen en vergelijk dat met de huidige tijd geretourneerd door millis(). Zodra het verschil tussen die twee keer groter dan sommige interval is, weet u is het tijd om de LED opnieuw in-/ uitschakelen. Ik heb enkele nieuwe opslag variabelen ingesteld om dit te doen:

int ledState = laag; //current staat van de LED
unsigned long timeOfLastLedEvent = 0; //the laatste keer dat de LED werd bijgewerkt
int intervalON = 1000; //how lang we willen de LED te blijven
int intervalOFF = 500; //how lang we willen de LED te blijven uit

In de loop is er een bos van logica die controleert om te zien of u genoeg tijd heeft doorgegeven, en als dat zo is, schakelt de LED, werkt u de variabele "timeOfLastLedEvent", en schakelt u de opgeslagen toestand van de LED. De logica wordt tweemaal herhaald zodra voor het geval dat de LED is hoog, en eenmaal voor het geval dat de LED laag is, zal ik herhaal het lage geval hieronder:

Als (currentMillis - timeOfLastLedEvent > intervalOFF) {//and voldoende tijd verstreken

digitalWrite (ledPin, hoge); //turn op
ledState = hoog; //store zijn huidige toestand
timeOfLastLedEvent = currentMillis; //update de tijd van dit nieuwe evenement

}

currentMillis is een niet-ondertekende lange vertegenwoordigt de huidige tijd dat wordt bijgewerkt telkens wanneer die de Arduino loop functie wordt gestart. (currentMillis - timeOfLastLedEvent) geeft de sinus van de tijd de LED's staat voor het laatst werd gewijzigd, we vergelijken dit tegen de intervalOFF om te zien of is het tijd om het uitschakelen van de LED, als het niet de Arduino zal houden currentMillis bijwerken en opnieuw controleren tot het tijd is.

Gerelateerde Artikelen

Tussenliggende Arduino: In- en uitgangen

Tussenliggende Arduino: In- en uitgangen

Stap 2: Arduino knop DebouncingVoortzetting van de knop debouncing dat ik in mijn laatste Instructable geïntroduceerd, kunnen we millis() gebruiken om debounce knoppen zonder gebruik te maken van delay(): //Button Press Detection - debounce with mill
Arduino Powered Home

Arduino Powered Home

Ik heb een paar updates in dit instructable sinds Aug 2014 ***Heb ik besloten om deze informatie te delen, zodat het anderen die hebben moeite helpen misschien om soortgelijke dingen met hun Arduino doen. Ik heb pas onlangs gekregen die betrokken zij
Hoe de code Arduinos

Hoe de code Arduinos

Dus ik was op zoek via de help-sectie van de Gemeenschap, toen ik zag sommige mensen waar problemen met de codering Arduinos, dus ik ben waardoor dit om te helpen.Voor dit Instructable moet u:ComputerArduino IDESommige delen van dit kunnen afwijken v
DIY Arduino Remote Control en Lego RC voertuig!

DIY Arduino Remote Control en Lego RC voertuig!

UPDATE (8/29/13): dank u lezers voor uw enthousiasme en soort opmerkingen met betrekking tot dit project! Het is een geweldige reis sinds ik begon dit project terug in maart, maar ik ben erg blij met het resulterende product en de opwinding waarmee h
Multiplexing met Arduino en de 74HC595

Multiplexing met Arduino en de 74HC595

de 74HC595 is een makkelijk en goedkoop (op ongeveer 60 cent per stuk) manier om te verhogen van het aantal digitale uitgang pinnen op je Arduino.  In deze tutorial zal ik u tonen hoe te rijden van maximaal 16 LEDs met een 74HC595 met behulp van een
Een beginnersgids voor Arduino

Een beginnersgids voor Arduino

Na enkele jaren van experimenteren met Arduino, besloten heb ik dat het tijd is om te delen van de kennis die ik heb verworven. Dus ik hier het gaat, een gids voor Arduino, met de blote basisprincipes voor beginners en sommige meer geavanceerde uitle
De klok van de wereld in het Duits met behulp van Arduino

De klok van de wereld in het Duits met behulp van Arduino

Terwijl in Duitsland zag vorig jaar ik een wereld klok in een gelijkaardig aan dit één in een winkel die is geprijsd op 900€ winkel. Ik lees verschillende instructables online over het maken van een klok van de wereld, dus heb ik besloten om het een
Arduino animatronics-Maak uw geweldige kostuums meer awesome!

Arduino animatronics-Maak uw geweldige kostuums meer awesome!

Hier is hoe te het licht, geluid en actie toevoegen aan uw favoriete Halloween-project met behulp van de opensource Arduino microcontroller. Arduino is gemakkelijk te leren te gebruiken en het opent een hele nieuwe wereld voor kostuum bouwers en sche
Arduino RC auto met lange afstand en aangepaste zender.

Arduino RC auto met lange afstand en aangepaste zender.

Hallo! Dit is mijn eerste instructable.Daarin zal ik u tonen hoe te maken van een RC auto met Arduino en de draadloze nrf24l01 +-module, of hoe om te upgraden een goedkope 27 MHz RC auto.De oude RC auto, die van I het chassis, en de heli Controller n
Kloppend hart Candy kom met Arduino

Kloppend hart Candy kom met Arduino

Ik wilde een snoep kom voor trick or treat die eruit zag als een spooky hart sloeg onder de snoep. Ik hoop dat de jongere kinderen vindt het spooky en niet te eng. Ik weet zeker dat de tieners met geen kostuum en een kussensloop zal niet onder de ind
De Idiot's Guide to programmering van AVR op de goedkope (met de Arduino IDE!)

De Idiot's Guide to programmering van AVR op de goedkope (met de Arduino IDE!)

Microcontrollers zijn, zonder twijfel, het verbazen van kleine dingen. Ze zijn veelzijdig, krachtig en zeer klein. De laatste karaktertrek is helaas ook gedeeld door zowel mijn portemonnee en mijn programmering vaardigheden. Mijn begrip van C is slec
Personal Assistant met Telegram & Arduino.

Personal Assistant met Telegram & Arduino.

Hallo mensen!Een paar maanden geleden hoorde ik over een project dat een instant messenger bot gebruikt voor het maken van een systeem dat zou automatisch verwerken en ordenen van pizza's verzendingen door de costumieren via Whats app. Ik was als...
DIY I2C LCD Display met ingangen

DIY I2C LCD Display met ingangen

De typische parallelle LCD gebruikt met een Arduino (16 x 2 of 20 x 4) heeft 16 pinnen. Slechts 6 I/O pinnen zijn vereist op de Arduino, maar wat als je kon krijgen dat tot twee I/O pinnen, en nog steeds hebben die pins beschikbaar voor andere appara
Analoge lijn volgeling upgraden naar Arduino met Attiny85

Analoge lijn volgeling upgraden naar Arduino met Attiny85

SamenvattingIn dit Instructable zullen wij tonen u hoe om te upgraden een goedkope analog lijn volgeling in een intelligente Arduino lijn volgeling door de LM393 comparator IC te vervangen door een intelligente Attiny85 en Arduino sketch.IntroductieL