Arduino selon le consignateur d’événements-temps


Exemple de code source pour un Arduino fonction enregistreur de données de temps-événement.  Montre interruptions, journalisation asynchrone et contact de rebondissent.  Destinés à un interrupteur de position roue, enregistre les temps au cours de laquelle la touche est enfoncée.

Nous utilisons un interrupteur reed qui rebondit lorsque engagés et lorsque dis-engagés.  Cela lève plusieurs interruptions.  Anneau tampon entrée vérifie si la durée de l’événement est considérablement plus courte que l’événement temps précédemment connecté.  Dans l’affirmative, déclenchement court est rejeté comme rebond de contact.  Événements rejetés sont stockés, et en cas de nombreux rejets d’affilée, ils sont tous connectés, en supposant que quelque chose s’est passé et ils peuvent être des événements importants.  La motivation, c’est qu’il vaut mieux se connecter quelques rebonds qu’afin de manquer un événement pour cette application.  Les données peuvent être nettoyées plus loin en post traitement, mais nous ne voulons pas encombrer nos bûches avec tous les événements de rebondissements de contacts.

 /* $URL: svn+ssh://aaron $ $Id: vLogger.ino 62 2012-06-03 20:11:13Z aaron $ Log the times when a wheel position sensor triggers, as an indirect method of logging time and distance, which can be used to estimate velocity and acceleration in a coast-down wind resistance experiment. User flips switch to record to a ring buffer. Main loop prints ring buffer contents to serial port, asynch. Each time the record operation cycles, the time is reset to start at zero. Sensor switch must be on pin 2, since this pin uses standard external interrupt 0 */ #define PIN_RECORD 4 // record on/off switch #define PIN_LED_RECORD 8 // on when recording #define PIN_LED_SENSOR 13 // toggles as sensor turns #define BUF_LEN 256 // samples in data ring buffer #define MAX_SHORT 10 // max "short" events before assuming they are NOT contact bounce typedef long DATATYPE; #include // sprintf // Diagnostic output logger. Call log from ISR, print outside ISR #define MAX_LOG_LEN 40 #define LOG_BUF_LEN 8 class Logger { protected: volatile int nIn; int nOut; char buf[LOG_BUF_LEN][MAX_LOG_LEN]; public: char msgBuf[MAX_LOG_LEN]; Logger() { nIn=nOut=0; } void print() { if (nOut >= nIn) return; int i = nOut % LOG_BUF_LEN; nOut++; Serial.println(buf[i]);Serial.flush(); } void log(const char *msg) { int i,k; k = nIn % LOG_BUF_LEN; for (i=0; (msg[i]!=0) && (i < MAX_LOG_LEN-1); i++) buf[k][i]=msg[i]; buf[k][i]=0; nIn++; } void log() { log(msgBuf); } // for using provided msgBuf } Log; class RingBuffer { protected: volatile int nIn; int nOut; volatile DATATYPE buf[BUF_LEN]; public: void reset() { nIn=nOut=0; } RingBuffer() { reset(); } volatile void push(DATATYPE x) { if (nOut <= nIn - BUF_LEN) { sprintf(Log.msgBuf,"RingBuffer Overflow %d",x);Log.log(); //Serial.println("RingBuffer Overflow ");Serial.println(x);//Serial.flush(); return; } int i = nIn % BUF_LEN; buf[i]=x; nIn++; } inline bool empty() const { return(nOut >= nIn); } DATATYPE pop() { if (nOut >= nIn) return(0xffff); int i = nOut % BUF_LEN; nOut++; return(buf[i]); } DATATYPE peek() // peek at last OUTPUT { int i = nOut % BUF_LEN; return(buf[i]); } DATATYPE peek(const int nBack) // peak at indicated prev INPUT, 0 is most recent { int i=nIn-1-nBack; if (i < 0) return 0; return(buf[i]); } inline int nPush() const { return(nIn); } inline int nPop() const { return(nOut);} inline int depth() const { return(nIn-nOut); } inline int maxDepth() const { return(BUF_LEN); } }; class TimeEventRingBuffer : public RingBuffer { protected: unsigned long t0; volatile int nShort; volatile DATATYPE shortBuf[MAX_SHORT]; public: void reset() { setZero(); nShort=0; RingBuffer::reset(); } TimeEventRingBuffer() { nShort=t0=0; } void push() { unsigned long tt = millis(); DATATYPE tNow = (DATATYPE)(tt-t0); // check for contact bounce DATATYPE t1 = peek(0); // prev recorded input DATATYPE t2 = peek(1); if ( tNow-t1 < 0.1 * (t1-t2) ) { // short trigger, likely contact bounce if (nShort < MAX_SHORT) { shortBuf[nShort++]=tNow; return; } // Too many short triggers in a row, dump them for (int i=0; i < MAX_SHORT; i++) RingBuffer::push(shortBuf[i]); } // record the time of this event RingBuffer::push(tNow); nShort=0; // this event was good. reset short-trigger counter } void setZero() { t0 = millis(); } }; TimeEventRingBuffer Data; bool RecordingOn; // ISR when wheel sensor event is detected void wheelSense() { if (RecordingOn) { Data.push(); } digitalWrite(PIN_LED_SENSOR,digitalRead(PIN_LED_SENSOR)?LOW:HIGH); } void setup() { pinMode(2,INPUT); // hard-coded to pin 2, since using standard ext. interrupt 0 pinMode(PIN_RECORD,INPUT); digitalWrite(PIN_RECORD,HIGH); // enable pull-up resistor digitalWrite(2,HIGH); pinMode(PIN_LED_RECORD, OUTPUT); pinMode(PIN_LED_SENSOR, OUTPUT); digitalWrite(PIN_LED_RECORD,HIGH); digitalWrite(PIN_LED_SENSOR,HIGH); RecordingOn = true;//false; attachInterrupt(0,wheelSense,RISING); // INT0 is on pin 2 (INT1 on pin 3) Serial.begin(9600); // may want a different serial monitor, which can be faster } void loop() { Log.print(); // check if any log messages need to be printed if (!Data.empty()) { Serial.print(Data.nPop()); Serial.print("\t"); Serial.println(Data.pop()); Serial.flush(); } // check if recording is currently enabled bool rec = (digitalRead(PIN_RECORD)==LOW)?true:false; //rec=true;// always record for testing if (RecordingOn) { if (!rec) { // turn recording OFF digitalWrite(PIN_LED_RECORD,LOW); RecordingOn = false; delay(2); // avoid contact bounce } } else { // recording is off if (rec) { // transition from off to on, start recording digitalWrite(PIN_LED_RECORD,HIGH); Data.setZero(); if (Data.empty()) Data.reset(); RecordingOn = true; delay(2); // avoid contact bounce } } } 

Voici un script LINUX pratique pour afficher et enregistrer les données d’une connexion série. Ce code est défini pour une connexion au port série/USB, mais si vous changez le périphérique, il cherche quelque chose comme /dev/rfcomm0, il peut être mis en place pour travailler sur un appareil Bluetooth/SPP.

 #!/usr/bin/perl -w # Logs output from an arduino at typical 9600 8-n-1 # assume most recently created tty is the Arduino. # for most users, this should usually work $devName = `ls -t /dev/tty* | head -1`; chomp($devName); print "Listening on $devName\n"; # set up port for typical Arduino (SerialMonitor-like) settings system("stty -F $devName cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts"); $logFileName = ($#ARGV>=0) ? $ARGV[0] : "/tmp/serial.log"; print "Logging to $logFileName\n"; $pid = fork(); if ($pid==0) { # this is the child. local $cmd = "tail -f $devName > $logFileName"; # for some reason, the above did not work on a netbook, but this did: #local $cmd = "cat $devName > $logFileName"; print "$cmd\n"; exec($cmd); } else { # this is the parent, display log. # hopefully when this is ^C'ed or killed, it will kill child too sleep 2; local $cmd = "tail -f $logFileName"; print "$cmd\n"; exec($cmd); } 

Articles Liés

Arduino Real Time radio-réveil avec température et éclairage LED. Télécommandé

Arduino Real Time radio-réveil avec température et éclairage LED. Télécommandé

Horloge de l'Arduino, avec, batterie de secours (horloge temps réel), heure, Date, alarme, température, LCD sortie, télécommande IR entrée, mode "veille", éclairage (10 X) LED rouge et bleu multimode.Étape 1: Étape 1: liste des piècesHorloge de
Pont basculant de Londres automatique du (Arduino selon projet étudiant)

Pont basculant de Londres automatique du (Arduino selon projet étudiant)

Salut tout le monde ! Ce Instructable vous montre comment faire un automatiqueModèle Londres Bascule Bridge facilement en utilisant Arduino UNO, capteurs IR et moteur pas à pas. La structure du modèle est faite de la feuille d'acrylique. Nous avons u
Comment mesurer la température très précisément avec un Arduino et un Conseil de capteur de température TSYS01.

Comment mesurer la température très précisément avec un Arduino et un Conseil de capteur de température TSYS01.

Alors qu'il étudiait à l'Université, nous avons été contestés dans le cadre d'un travail en cours dans la conception d'une boîte avec un contrôle très précis de la température. Si le projet devait réussir, plusieurs boîtes devaient être construits et
Arduino LCD thermomètre avec sonde de température LM35

Arduino LCD thermomètre avec sonde de température LM35

: mise à jour du PIN 13 : Merci à cybersbpour les captures.Le Fritzing schématique montre à l'aide de broches 12 et 13. Cela ne résout pas. Doit utiliser les broches figurant dans le code, les bornes 11 et 12.C'est comme le titre l'indique, un Arduin
Arduino - deux 7 LED Segments + capteur de température & humidité DHT11

Arduino - deux 7 LED Segments + capteur de température & humidité DHT11

Je veux vous montrer dans ce « Instructable » comment lire DHT11 temperatura & humidité capteur et affichez-la dans deux 7 segments LED.Etape 1: Eléments requis1.-Arduino UNO2. - 2 - 7-segment-affichage3. - 5 résistance ohms k4.-température DHT11 &
Bricolage maison Portable Arduino café Coaster avec LED indicateur de température

Bricolage maison Portable Arduino café Coaster avec LED indicateur de température

Beaucoup de choses se produire juste en buvant du café. Les bonnes idées grandes entreprises sortent alors que les gens sont le chat buvant café. J'aime avoir le café surtout quand je suis dans le bureau. Je suis sûr que tout le monde là-bas aime caf
Arduino selon compteur - un nombreux LED Driver

Arduino selon compteur - un nombreux LED Driver

comme le résultat direct d'une question dans le forum Instructables, pour un diagramme à barre afficher des données sur le tableau de bord d'une voiture, une électronique personnalisée instructable.Ici, pour votre délectation est l'auto-barDuino, un
Arduino Nano - HTS221 l’humidité Relative et température capteur tutoriel

Arduino Nano - HTS221 l’humidité Relative et température capteur tutoriel

HTS221 est un ultra compact numérique un capteur capacitif d'humidité relative et de température. Il comprend un capteur et un signal mixé circuit(ASIC) intégrée spécifique demande de fournir l'information de mesure par l'intermédiaire des interfaces
Contrôleur de matrice de LED RVB Arduino 8 x 8 avec sonde de température et les registres à décalage 4

Contrôleur de matrice de LED RVB Arduino 8 x 8 avec sonde de température et les registres à décalage 4

La première moitié de cette vidéo d'enseignement montre qu'un projet fini d'un Arduino avec 4 registres à décalage (74HC595) utilisé pour contrôler et 8 x 8 matrice de LED RVB. Il y a aussi un capteur de température DS18B20 utilisé pour afficher la t
Contrôleur de température Arduino Basic - toute

Contrôleur de température Arduino Basic - toute

Ce code Arduino lit un capteur de température de Dallas Semiconductor One-Wire et rapports sur un portail exosites via l'Ethernet Shield. Cet article décrit les informations de branchement et code pour un dispositif de surveillance de température con
Programmation ESP8266 ESP-12F NodeMCU v1.0 avec Arduino IDE dans l’enregistreur de température sans fil

Programmation ESP8266 ESP-12F NodeMCU v1.0 avec Arduino IDE dans l’enregistreur de température sans fil

Retour à fin 2014 et 2015 au début, votre vraiment tombé surCette ESP8266 de puce WiFi astucieux (l'ESP-01) et dois bataille parmi les documentations incompatibles provenant de diverses sources. Pour l'instant de l'éperon, il a documenté ses frustrat
Arduino thermomètre avec sonde de température LM35

Arduino thermomètre avec sonde de température LM35

Arduino thermomètre avec sonde de température LM35 est un très simple à mettre en œuvre le projet Arduino basé. Ses un projet parfait si vous êtes un débutant et avez juste commencé à tester pratiquement projets Arduino.Dans ce projet, nous exposera
Capteur de température interne Arduino

Capteur de température interne Arduino

Source : http://www.theorycircuit.com/arduino-internal-temperature-sensor/Plupart des puces AVR (microcontrôleurs) ont un capteur de température interne, donc nous pouvons utiliser cette option pour obtenir des températures en état rare, cela pourrai
Sauvegarder les données de température et d’humidité sur MySQL avec Arduino Uno et Wifly

Sauvegarder les données de température et d’humidité sur MySQL avec Arduino Uno et Wifly

Bonjour les gars, je fais ce instructable pour les gens qui aimaient l'électronique et la botanique, avec cela, vous avez les données concernant la temperatura et l'humidité de votre verger et ce registre de données MySQL de base.Pour ce projet dont