Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Eenvoudige Arduino-chronometer

Componenten en benodigdheden

Arduino UNO
elke arduino.. en soms niet alleen
× 1
knop (niet vergrendelend)
met een pulldown-weerstand (ik gebruik 1kohm)
× 1
Weerstand 10k ohm
× 1

Apps en online services

Arduino IDE

Over dit project

Ik ben op weg om een ​​leuk project te doen en ik had een Arduino-chronometer nodig die werkt wanneer ik op een knop druk. Het is niet ingewikkeld, maar ik dacht dat dit stukje code handig zou zijn voor de projecten van andere mensen.

Ik heb je waarschijnlijk 1 uur van je leven bespaard met coderen.

EEPROM:

Geheugen van Arduino dat zijn informatie niet verliest wanneer u de stroom loskoppelt of het bord reset.(info). Ik gebruik #include bibliotheek die eigenlijk alles doet en het is al standaard geïnstalleerd.

ONDERBREKINGEN:

Er gebeuren dingen in onze Arduino, maar we willen dat hij stopt met doen wat het ook was en onze ISR-functie bijwoont wanneer bijvoorbeeld een pin HOOG wordt getrokken. Geen extra bibliotheek nodig hier:

De code van het project:

  • Definieert en omvat:
#include  #define interruptPin 2 #define eeAddress 0 //ADRES VOOR DE EEPROM VAN DE ARDUINO (intern niet-vluchtig geheugen) float starttime =0; // Variabelen om de wiskunde float endtime =0 te doen; float resultaattijd=0, oude resultaattijd=0;  

Niets nieuws hier, we nemen de EEPROM-bibliotheek op, we beslissen waar de knop wordt bevestigd (pin 2).

Toen besloot ik dat ik het adres 0 van ons EEPROM-geheugen zou gaan gebruiken om onze tijd op te slaan (float=4bytes). Arduino UNO heeft 1024 bytes (chip ATmega328) maar ik koos het adres 0 omdat ik probeerde om voor een keer in mijn leven georganiseerd te zijn.

  • setup()
void setup() { Serial.begin(9600); while (!Serial) {; // wacht tot de seriële poort verbinding maakt. Alleen nodig voor native USB-poort } Serial.println ("Seriële communicatie is gereed, meneer!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);}  

Gebruikelijke dingen, we initiëren seriële communicatie tussen de Arduino en onze pc (9600 bauds):

attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE); 

Attachinterrupt activeert de functie wanneer het logische niveau van interruptPin zo verandert:(____________-HIER------------------_HERE____________).

Op deze manier wordt het twee keer geactiveerd aan het begin van onze persing en aan het einde. Als er niets gebeurt, blijft onze interruptPin-waarde LAAG omdat onze pulldown-weerstand deze "dwingt" om laag te blijven.

  • loop()
void loop() { }  

Niets. Stop daar je spullen in!

  • Andere functies:
void refreshTime(){ if(digitalRead(interruptPin)){ starttime=millis(); Serial.print("Begintijd:"); Serial.println(starttijd); }else if(digitalRead(interruptPin)==LAAG){ endtime=millis(); resultaattijd=eindtijd-begintijd; Serial.print("Eindtijd:"); Serial.println(eindtijd); Serial.print("Resultaattijd:"); Serial.println(resultaattijd); WhatsNewEeprom();//stores eeprom }  

Dit is de functie die wordt uitgevoerd wanneer de onderbreking in pin (interruptPin) plaatsvindt.

De onderbreking wordt geactiveerd telkens wanneer de status in de interruptPin verandert (HOOG naar LAAG of LAAG naar HOOG), die als (...) zijn om te detecteren of het HOOG->LAAG of LAAG->hoog verandert.

Slaat de tijd op die is vastgelegd door de interne klok van Arduino millis() en doet het verschil om onze resultaattijd gereed te hebben. Aan het einde slaat het nieuwe informatie op in eeprom:

void WhatsNewEeprom(){ Serial.println("----------- eeprom controleren"); EEPROM.get(eeAddress, oldresulttime); Serial.print("oude resultaten");Serial.println(oude resultaten); Serial.print("resultaattijd");Serial.println(resultaattijd); if(resulttime!=oldresulttime){ EEPROM.put(eeAddress, resultaattijd); Serial.print("-----Ding!Nieuwe tijd geregistreerd in eeprom:");Serial.println(resulttime); }else{ Serial.println("Geen nieuwe tijd gevonden, eeprom was niet gestoord"); }  

Deze controleert of de tijdwaarde die is opgeslagen in eeprom dezelfde is als in onze variabele "resulttime", zo ja, dan hebben we deze niet gewijzigd, dus doe niets.

Extra! Onze knop debouncen:

Wij mensen zijn extreem traag voor de Arduino-verwerkingstijd, één druk op de knop lijkt snel voor ons, maar voor Arduino is het erg traag, waardoor het signaal "stuitert", zoals een paar keer schakelen van highlowhighlowhighlow voordat de echte status wordt bepaald.

Als we dat willen (ik deed het niet), kunnen we het repareren via hardware of software:

  • Debounce via software
  • Debounce via hardware, gebruik een condensator!!! :D

Ik ga gewoon een 220nF parallel toevoegen (van sensepin naar GND)

De condensator "eet" snelle variaties in spanning op.

Code

  • arduino-chronometer
arduino chronometerArduino
gebruikt eeprom en onderbrekingen, gemakkelijk te hacken
//gecodeerd door Javier Muñoz 23/10/2017//questions en geschroeide telegrammen naar [email protected]#include #define interruptPin 2#define eeAddress 0 // ADRES VOOR DE EEPROM VAN DE ARDUINO (intern niet-vluchtig geheugen) float-starttijd =0; // Variabelen om de wiskunde float endtime =0 te doen; float resultaattijd=0, oude resultaattijd=0; void setup() { Serial.begin(9600); while (!Serial) {; // wacht tot de seriële poort verbinding maakt. Alleen nodig voor native USB-poort } Serial.println ("Seriële communicatie is gereed, meneer!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);// activeert de functie wanneer het logische niveau van interruptPin zo verandert:(__-HIER------------------_HERE____) op deze manier slaat het de tijd op dat onze vinger op de knop drukte} ongeldige lus () {// je spullen hier // (eeprom opgeslagen) laatste keer gemeten in milliseconden "float resultaattijd"} ongeldige refreshTime (){ if (digitalRead (interruptPin) ){ starttijd=millis(); Serial.print("Begintijd:"); Serial.println(starttijd); }else if(digitalRead(interruptPin)==LAAG){ endtime=millis(); resultaattijd=eindtijd-begintijd; Serial.print("Eindtijd:"); Serial.println(eindtijd); Serial.print("Resultaattijd:"); Serial.println(resultaattijd);WhatsNewEeprom(); }}void WhatsNewEeprom(){ Serial.println("-----------eeprom controleren"); EEPROM.get(eeAddress, oldresulttime); Serial.print("oude resultaten");Serial.println(oude resultaten); Serial.print("resultaattijd");Serial.println(resultaattijd); if(resulttime!=oldresulttime){ EEPROM.put(eeAddress, resultaattijd); Serial.print("-----Ding!Nieuwe tijd geregistreerd in eeprom:");Serial.println(resulttime); }else{ Serial.println("Geen nieuwe tijd gevonden, eeprom was niet gestoord"); }}

Schema's

eenvoudige verbinding van een knop met een pulldown-weerstand chronometer_APM32Y9FoM.fzz

Productieproces

  1. Eenvoudige wandklok met Adafruit 1/4 60 Ring Neopixel
  2. Eenvoudige Word Clock (Arduino)
  3. DIY Eenvoudige 20 kHz Arduino-oscilloscoop op Nokia 5110 LCD
  4. Arduino Spybot
  5. FlickMote
  6. Zelfgemaakte tv B-Gone
  7. Hoofdklok
  8. Eenvoudige obstakelsensor met Arduino
  9. Vind mij
  10. Arduino Power
  11. Eenvoudige wekker met DS1302 RTC