Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Chronomètre Arduino Simple : Construisez un Chronomètre Activé par Bouton

Composants et Fournitures

Composant Description Quantité
Arduino UNO Tout Arduino compatible 1
Bouton poussoir (non verrouillant) Avec résistance de pull-down (1 kΩ utilisée) 1
Résistance 10 kΩ 1

Applications et Services en Ligne

Application Description
Arduino IDE Environnement de développement pour programmer l'Arduino

À Propos de ce Projet

Je travaille sur un projet amusant et j'avais besoin d'un chronomètre Arduino qui se lance à l'appui d'un bouton. Ce n'est pas complexe, mais je me suis dit que ce bout de code pourrait servir à d'autres. J'ai probablement économisé 1 heure de codage à quelqu'un !

EEPROM

Mémoire de l'Arduino qui conserve ses informations même après coupure d'alimentation ou réinitialisation. J'utilise la bibliothèque #include <EEPROM.h> qui fait tout le travail et est installée par défaut.

Interruptions

Des événements se produisent dans l'Arduino, mais nous voulons qu'il arrête ce qu'il fait pour exécuter notre fonction ISR (Interrupt Service Routine) quand une broche passe à l'état HIGH, par exemple. Pas de bibliothèque supplémentaire nécessaire.

L'interruption est configurée sur attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE); – elle se déclenche à chaque changement d'état de la broche (HIGH→LOW ou LOW→HIGH), c'est-à-dire au début et à la fin de l'appui sur le bouton. Si rien ne se passe, la broche reste LOW grâce à la résistance de pull-down qui la "force" à l'état bas.

Le Code du Projet

Définitions et Inclusions

#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0 //ADRESSE POUR L'EEPROM DE L'ARDUINO (mémoire non volatile interne)
float starttime = 0; //Variables pour les calculs
float endtime=0;
float resulttime=0, oldresulttime=0;

Rien de nouveau : on inclut la bibliothèque EEPROM, on choisit la broche 2 pour le bouton. On utilise l'adresse 0 de l'EEPROM pour stocker le temps (float = 4 octets). L'Arduino Uno a 1024 octets (puce ATmega328), j'ai choisi l'adresse 0 pour être organisé une fois dans ma vie.

setup()

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Serial comms are ready sir!:.. bip bip");
  attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
}

Initialisation classique de la communication série (9600 bauds). L'attachInterrupt active la fonction quand le niveau logique de interruptPin change.

loop()

void loop() { }

Rien ici ! Mettez votre propre code dans la boucle principale.

Autres Fonctions

void refreshTime(){
  if(digitalRead(interruptPin)){
    starttime=millis();
    Serial.print("Start time: ");
    Serial.println(starttime);
  }else if(digitalRead(interruptPin)==LOW){
    endtime=millis();
    resulttime=endtime-starttime;
    Serial.print("End time: ");
    Serial.println(endtime);
    Serial.print("Result time: ");
    Serial.println(resulttime);
    WhatsNewEeprom(); //stocke en EEPROM
  }
}

Cette fonction s'exécute à chaque interruption sur interruptPin. L'interruption se déclenche à chaque changement d'état (HIGH→LOW ou LOW→HIGH). Les conditions if(...) détectent si c'est le passage HIGH→LOW ou LOW→HIGH. On stocke les temps via l'horloge interne millis() et on calcule la différence. À la fin, on stocke la nouvelle info en EEPROM.

void WhatsNewEeprom(){
  Serial.println("-----------checking eeprom");
  EEPROM.get( eeAddress, oldresulttime );
  Serial.print("oldresulttime");Serial.println(oldresulttime);
  Serial.print("resulttime");Serial.println(resulttime);
  if(resulttime!=oldresulttime){
    EEPROM.put( eeAddress, resulttime);
    Serial.print("-----Ding!New time recorded in eeprom: ");Serial.println(resulttime);
  }else{
    Serial.println("No new time found, eeprom was not disturbed");
  }
}

Cette fonction vérifie si la valeur stockée en EEPROM est identique à notre variable resulttime. Si c'est le cas, on ne l'a pas modifiée, donc on ne fait rien.

Bonus : Antirebond du Bouton (Debouncing)

Nous, humains, sommes extrêmement lents pour le temps de traitement de l'Arduino. Un appui sur le bouton nous semble rapide, mais pour l'Arduino c'est très lent, ce qui fait "rebondir" le signal (commutation HIGH/LOW/HIGH/LOW plusieurs fois avant de se stabiliser).

Si on veut corriger ça (je ne l'ai pas fait), deux approches :

J'ai simplement ajouté un condensateur de 220 nF en parallèle (de la broche de détection vers GND). Le condensateur "absorbe" les variations rapides de tension.

Code Complet

Chronomètre Arduino (Arduino)

Utilise l'EEPROM et les interruptions, facilement adaptable

//coded by Javier Muñoz 23/10/2017
//questions and singed telegrams to javimusama@gmail.com
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0 //ADDRESS FOR THE ARDUINO´S EEPROM (internal non volatile memory)
float starttime = 0; //Variables to do the math
float endtime=0;
float resulttime=0, oldresulttime=0;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Serial comms are ready sir!:.. bip bip");
  attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);//activates the function when the logic level of interruptPin changes so: (__-HERE------------------_HERE____)this way it stores the time our finger was pressing the button
}

void loop() {
  //your stuff here
  //(eeprom stored) last time measured in miliseconds "float resulttime"
}

void refreshTime(){
  if(digitalRead(interruptPin)){
    starttime=millis();
    Serial.print("Start time: ");
    Serial.println(starttime);
  }else if(digitalRead(interruptPin)==LOW){
    endtime=millis();
    resulttime=endtime-starttime;
    Serial.print("End time: ");
    Serial.println(endtime);
    Serial.print("Result time: ");
    Serial.println(resulttime);
    WhatsNewEeprom();
  }
}

void WhatsNewEeprom(){
  Serial.println("-----------checking eeprom");
  EEPROM.get( eeAddress, oldresulttime );
  Serial.print("oldresulttime");Serial.println(oldresulttime);
  Serial.print("resulttime");Serial.println(resulttime);
  if(resulttime!=oldresulttime){
    EEPROM.put( eeAddress, resulttime);
    Serial.print("-----Ding!New time recorded in eeprom: ");Serial.println(resulttime);
  }else{
    Serial.println("No new time found, eeprom was not disturbed");
  }
}

Schémas

Connexion simple d'un bouton avec une résistance de pull-down

Chronomètre Arduino Simple : Construisez un Chronomètre Activé par Bouton

Processus de fabrication

  1. Construire une horloge murale design avec anneaux Neopixel 60 LED Adafruit et Arduino
  2. Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
  3. Construire un oscilloscope Arduino 20 kHz sur écran Nokia 5110 – Guide DIY facile
  4. Construire un Spybot Arduino piloté par Bluetooth
  5. FlickMote : Télécommande IR à gestes pour maison connectée
  6. TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
  7. Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
  8. Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
  9. Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO