Arduino basierte Zeit-Ereignisprotokollierung



Beispiel-Quellcode für ein Arduino basierte Zeitereignis Datenlogger.  Zeigt, dass Interrupts, asynchrone Protokollierung und Kontakt de-bounce.  Bestimmt für einen Rad-Positionsschalter meldet sich mal an dem Schalter aktiviert ist.

Wir verwenden einen Reed-Schalter, die sowohl als beschäftigt, und wenn springt DIS beschäftigt.  Dies wirft mehrere Interrupts.  Ring-Puffer-Eingang überprüft, ob Event Zeitraum erheblich kürzer als bisher protokollierten Ereignis ist.  Wenn ja, wird kurz Trigger als Kontaktprellen abgelehnt.  Abgelehnte Ereignisse werden gespeichert, und wenn viele lehnt hintereinander auftreten, sie sind alle angemeldet, geht man davon aus, dass etwas passiert und sie möglicherweise bedeutende Ereignisse.  Die Motivation ist, dass es besser ist, ein paar Sprünge als zu verpassen eine Veranstaltung für diese Anwendung anmelden.  Die Daten weiter in der Nachbearbeitung bereinigt werden können, aber wir wollen nicht unsere Protokolle mit allen Ereignissen Kontaktprellen zu verunstalten.

 /* $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 ist eine praktische LINUX-Script sowohl anzeigen und melden die Daten über eine serielle Verbindung. Dieser Code wird für einen USB/seriell-Port-Verbindung festgelegt, sondern ändert man das Gerät sucht nach so etwas wie /dev/rfcomm0 es eingerichtet werden kann, über ein Bluetooth/SPP-Gerät zu arbeiten.

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

In Verbindung stehende Artikel

Arduino basierte automatische Lichtsteuerung

Arduino basierte automatische Lichtsteuerung

Dies ist mein zweiter instructable. Ich möchte einige der grundlegenden Dinge, die ich mit dem Arduino, ich bin in letzter Zeit so beschäftigt gemacht. dann bekam ich die Chance, diese Freizeit... inspiriert von meiner ehemaligen Schüler und einer an
Arduino-basierte Schaltung Spannungsregler

Arduino-basierte Schaltung Spannungsregler

DC/DC-Wandler werden verwendet, um effizient Gleichspannungen umzuwandeln. Sie haben einen Wirkungsgrad von bis zu 95 % für LED Streifen, Fahrradbeleuchtung, Akku-Ladegeräte und solar betriebene Geräte nützlich machen. Ein Spannungswandler erfordert
Arduino basierte Bi-Color LED Matrix Audio Spectrum Visualizer

Arduino basierte Bi-Color LED Matrix Audio Spectrum Visualizer

Nachdem wir mit dem Bi-Color-LED-Matrix-Treibermodul Kitkam, haben wir für interessante Projekte zu arbeiten gesucht um.Sie könnten einige der Projekte interessieren, die wir bei Instructables mit dieser LED-Matrix-Kit gestellt haben.Instructable, ei
Einführung Climaduino - das Arduino-basierte Thermostat können Sie von Ihrem Handy steuern!

Einführung Climaduino - das Arduino-basierte Thermostat können Sie von Ihrem Handy steuern!

Update:Es gibt eine neue Version von der Climaduino und dem Climaduino Controller mit einigen sehr wichtigen Änderungen.Unterstützt mehrere ZonenNutzt die Arduino YúnArbeiten mit zentrale a/cKommuniziert mit dem MQTT -Protokoll (kann Integration mit
Arduino basierte Lap-Timer

Arduino basierte Lap-Timer

Vor kurzem bekamen wir halten von "Crazy Cart", eine wirklich coole Karre Rennen herum mit. Da wir nur eine haben, wollte ich etwas machen das fahren ein bisschen wettbewerbsfähiger zu machen, damit ich ein Arduino-basierte Lap-Timer bauen.Der L
Arduino basierte Bi-Color-LED-Matrix-Snake-Spiel

Arduino basierte Bi-Color-LED-Matrix-Snake-Spiel

Wir gezeigt, wie ein Arduino basierte Bi-Color LED Matrix Tetris Spiel gebaut werden kann in unsere letzte instructable. Wir waren ganz überrascht es war auf Instructables Homepage vorgestellt und haben eine Handvoll Favoriten über einen kurzen Zeitr
Arduino-basierte Schatten Alarm

Arduino-basierte Schatten Alarm

Schatten-Alarme dienen in der Regel zum Schutz vor Diebstahl. Ein Schatten-Alarm ist ein Gerät, das ein Alarm ertönt, wenn ein Schatten auf sie fällt. Hier beschrieben, ist eine einfache Schaltung des Alarms Arduino basierte Schatten. Dieses kompakte
ARDUINO basierte MPPT SOLARLADEREGLER

ARDUINO basierte MPPT SOLARLADEREGLER

ARDUINO BASIERTE MPPT SOLARLADEREGLERSchaltplan und Code finden Sie auf meiner Website ARDUINO basierte MPPT SOLARLADEREGLERWas ist Mppt (Maximum Power Point tracking)?"Wir verwenden MPPT Algorithmus, um die maximal verfügbare Leistung aus der Photov
Daves Tanz in einem Arduino basierte Bewegung empfindlich leichten Anzug

Daves Tanz in einem Arduino basierte Bewegung empfindlich leichten Anzug

Ein Arduino basierte Bewegung empfindlich leichten AnzugEs kann auch Muster und so anzeigen, auch wenn es nur die Bewegungserkennung in dem Vid. Es verwendet einen ADXL335 Beschleunigungsmesser, um die Träger-Bewegung zu spüren. Mein Freund Dave freu
Mobile Roboter mit Scratch: ein Arduino-basierte insektenartige Walker zu bauen und Programmieren mit Scratch

Mobile Roboter mit Scratch: ein Arduino-basierte insektenartige Walker zu bauen und Programmieren mit Scratch

Wir huschen um? Dies ist ein Arduino-basierte, einfache Version des insektenartige Walker mit Kleiderbügel Draht und ursprünglich von Jerome Demers (siehe auch diese instructable) und Gareth Branwyn zu bauen. Es kommt in zwei Versionen:eine eigenstän
Arduino-basierte Einbrecher und Brandmeldeanlage

Arduino-basierte Einbrecher und Brandmeldeanlage

Hi Leute, ich möchte mein Projekt mit Ihnen zu teilen.Es ist ein Arduino-basierte Alarmsystem bestehend aus 4 x 4-Matrix Tastatur, 16 x 02 LCD-Bildschirm an Bord mit 2-Draht Schaltplan auf 74LS164 und ATmega328p verbunden ist.Hier ist die Quellen: ht
Arduino basierte Hula-Tänzerin

Arduino basierte Hula-Tänzerin

Diese instructable entstand zur Erfüllung der Projektanforderungvon der Makecourse an der University of South FloridaÜber dieses Projekt: Hey jeder! Ich bin sicher, dass Sie das Dashboard Hula-Tänzer gehört, die ein fester Bestandteil jeder 16-Wheele
Arduino-basierte Roboter mit IR Radar

Arduino-basierte Roboter mit IR Radar

der Roboter-Prototyp in dieser Instructable ist meine zweite Arduino basierende "Slumbot" ist ein autonomer Roboter. Es ist zusammen mit Haushaltsgegenständen und Fetzen befestigt. Der Roboter sieht"" mit einer IR-Scan-Sensor durch ein
Wie erstelle ich einen Arduino basierte Nachtlicht mit Infrarot-Fernbedienung!

Wie erstelle ich einen Arduino basierte Nachtlicht mit Infrarot-Fernbedienung!

Hier ist ein Instructable, die Ihnen zeigen, wie ein Arduino-basierte Nachtlicht mit baueneine kleine Infrarot-Fernbedienung, die Blättern 10 Pre festgelegten Farben und eine zufällige verblassen lässtFarbe-Routine, die für immer Schleifen.Diese inst