Arduino gebaseerd tijdsgebeurtenis logger



In het volgende voorbeeld broncode voor een Arduino gebaseerd tijdsgebeurtenis datalogger.  Toont interrupts, asynchrone logboekregistratie en contact-stuiteren.  Bestemd voor een positieschakelaar wiel logs moment waartegen de schakelaar is betrokken.

We zijn met behulp van een reed switch rietschakelaar die stuitert wanneer betrokken, zowel bij DIS bezig.  Dit werpt meerdere interrupts.  Ring buffer input controleert of gebeurtenis periode enorm korter dan eerder aangemelde tijdsgebeurtenis.  Zo ja, wordt korte reactieprijs afgewezen als contact stuiteren.  Geweigerde gebeurtenissen worden opgeslagen, en als vele verwerpt in een rij optreden, ze allemaal geregistreerd, ervan uitgaande dat iets gebeurd en kunnen zij belangrijke gebeurtenissen.  De motivatie is dat het beter is om te melden een paar stuitert dan om het missen van een evenement voor deze toepassing is.  De gegevens kunnen verder worden opgeruimd in de nabewerking, maar we willen niet rommel onze logs met alle gebeurtenissen contact stuiteren.

 /* $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 } } } 

Hier is een handige LINUX script weergeven en vastleggen van de gegevens van een seriële verbinding. Deze code is ingesteld voor een USB-/ seriële-poortverbinding, maar als u het apparaat lijkt voor het aan iets als/dev/rfcomm0 het kan worden ingesteld om over een Bluetooth/SPP-apparaat te werken.

 #!/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); } 

Gerelateerde Artikelen

Bijhouden van uw auto met een Arduino gebaseerde Lojack

Bijhouden van uw auto met een Arduino gebaseerde Lojack

De autodiefstal van de is een echte slepen! Verhoog uw kansen van het herstellen van uw auto door het installeren van deze eenvoudige Arduino gebaseerde tracker in uw auto.Dit project is vrij eenvoudig, en zou een goed project voor een nieuwe Arduino
Arduino gebaseerd Bi-color LED Matrix Audio Spectrum Visualizer

Arduino gebaseerd Bi-color LED Matrix Audio Spectrum Visualizer

Nadat we met de Bi-color LED Matrix Driver Module kit kwamen, we hebben ons gebogen rond voor interessante projecten te werken.Bent u wellicht geïnteresseerd in een aantal van de projecten die we hebben opgemaakt op instructables met behulp van deze
Arduino gebaseerde Bi-color LED Matrix Tetris Game

Arduino gebaseerde Bi-color LED Matrix Tetris Game

Een van de elektronica DIY kit jolliFactory kwam omhoog met is de Bi-color LED Matrix Driver Module Kit. Deze module is ontworpen om kunnen keten-zodat u kan serieschakeling de modules samen aan het aantal modules moet u past bij uw project.De volgen
Arduino gebaseerde Smart Home IOT systeem

Arduino gebaseerde Smart Home IOT systeem

Hallo, ik ben Michalis Vasilakis uit Ardumotive.com en in deze handleiding Instructables zal ik u tonen hoe kunt u gemakkelijk maken uw eigen smart home systeem op basis van Arduino uno en een Ethernet-module (of schild).U zal zitten kundig voor gebr
Monteren van een Arduino gebaseerd rook / hitte Alarm

Monteren van een Arduino gebaseerd rook / hitte Alarm

Zoals je uit deze blog entry zien kunt ik ontwikkelde de basis voor dit project twee jaar geleden als een alarm / uitschakeling schakelaar voor de RepRap 3D Printer kit die ik had net samengesteld... en dat had gerookt!Het eerste ProjectIk heb sindsd
Arduino gebaseerde Split-Flap game

Arduino gebaseerde Split-Flap game

We hebben een grote traditie van de Nederlandse vakantie genaamd sinterklaas (5 december, dit is dat wat de Amerikaanse Santa is gebaseerd op). Voor de oudere "non-believers" we verrassingen. Het doel is te kopen van een klein cadeautje, maar ee
Zeven Segment Display Thermometer - Arduino gebaseerd

Zeven Segment Display Thermometer - Arduino gebaseerd

Vandaag zal ik u tonen hoe te maken van uw eigen 7 segment - 2 digit - thermometer met Arduino uno en DS18B20 temperatuursensor.Ik verkies om te bouwen van mijn eigen arduino gebaseerd circuit met behulp van de ATmega328p uno bezitter, maar dit is op
AbHhGD - de Arduino gebaseerde digitale Gaming apparaat

AbHhGD - de Arduino gebaseerde digitale Gaming apparaat

Dit is een write-up op mijn Arduino gebaseerde hand-held gaming apparaat. Ik realiseer me het is een enigszins poshy verklaring maar hey, het is Arduino gebaseerd, het is draagbaar en het is een apparaat dat spelletjes speelt!Stap 1: Een hand-held ga
Arduino gebaseerde afstand maatregel vak

Arduino gebaseerde afstand maatregel vak

Hallo, in dit project zal ik u tonen hoe te bouwen uw eigen doos meter afstand met Arduino uno en een ultrasone sensor.Voordat u begint, zorg ervoor dat u hebt:Arduino unoHC-SR04 ultrasone SensorLCD 16 x 2Officiële website: http://www.ardumotive.com/
Arduino gebaseerde schaduw Alarm

Arduino gebaseerde schaduw Alarm

Schaduw alarmen worden meestal gebruikt voor bescherming tegen diefstal. Een schaduw alarm is een apparaat dat een geluidssignaal klinkt wanneer een schaduw valt. Hier beschreven is een eenvoudige schakeling van een arduino gebaseerd schaduw alarm. D
Lage hoogte milieubewaking met een Arduino gebaseerd weer Instrument en Remote Sensing Platform van Aeropod

Lage hoogte milieubewaking met een Arduino gebaseerd weer Instrument en Remote Sensing Platform van Aeropod

ProjectoverzichtStudenten op New Lothrop High School in Michigan hebben samengewerkt om te bouwen van een lage hoogte remote sensing platform genaamd een "Aeropod" en het uitgerust met een "Arduino" gebaseerd weer instrument om sfeervo
Arduino gebaseerd Robotic Car(wireless controls+Autonomous)

Arduino gebaseerd Robotic Car(wireless controls+Autonomous)

Dit instructable is over een Arduino gebaseerd Robotic auto die gebruik maakt van Arduino Arduino,, Arduino programmeertaal, motor bestuurder, een LCD-scherm te zien wat de huidige status van de auto en zelfs een Bluetooth-module voor draadloze commu
Arduino gebaseerd donker Switch

Arduino gebaseerd donker Switch

Arduino gebaseerde donkere Switch is een eenvoudig project die in feite voor Arduino-beginners die net begonnen met leren gebruiken van Arduino.Zoals de naam suggereert in dit project zullen we ON draaien de lichten automatisch als de omgevingstemper
ARDUINO gebaseerd IR afstandsbediening robot

ARDUINO gebaseerd IR afstandsbediening robot

Hallo iedereen. Dit mijn nieuwe project IR afstandsbediening robot met behulp van arduino. Dit is een eenvoudig ontwerp robot die kunt u gemakkelijk bouwen.Stap 1: vereisten:Projecteisen:Arduino uno Tsop1738 (ir ontvanger)H brug ic (L293D)Twee gelijk