Baserade Arduino tidshändelse logger




Exempel källkod för en Arduino baserad tidshändelse datalogger. Visar avbrott, asynkrona loggning och kontakt de studsa. Avsedda för en hjul-läges brytare, loggar som växel är förlovad.

Vi använder en reed switch som studsar både engagerade och när dis engagerade. Detta kastar flera avbrott. Ring buffert input kontroller om tidsperioden händelsen är vida kortare än tidigare loggade tidshändelse. I så fall avvisas kort trigger som kontakt bounce. Avvisade händelser lagras och om många avvisar inträffar i rad, de är alla inloggade, förutsatt att något hände och de kan vara viktiga händelser. Motivationen är att det är bättre att logga några studsar än att missa en händelse för det här programmet. Data längre kan saneras vid efterbehandlingen, men vi vill inte att våra loggar med alla händelser kontakta bounce-röran.

/*
$URL: svn + ssh://aaron $
$Id: vLogger.ino 62 2012-06-03 20:11:13Z aaron $

Logga in de tider när ett hjul lägesgivare utlöser,
som en indirekt metod för loggning tid och avstånd,
som kan användas för att beräkna hastighet och acceleration
i ett kust-ner vind motstånd experiment.

Användaren och vänder switch att spela in på en ring buffert.
Huvudloop skriver ut ringen buffert innehållet till serieport, asynch.

Varje gång de post operation cyklerna, återställs tiden till
börja på noll.

Sensor switch måste vara på pin 2, eftersom detta stift använder
standard yttre mellanjobb 0
*/

#define PIN_RECORD 4 / / spela in på/av-knapp
#define PIN_LED_RECORD 8 / / på när inspelning
#define PIN_LED_SENSOR 13 / / växlar som sensorn visar

#define BUF_LEN 256 / / prover i databufferten ring
#define MAX_SHORT 10 / / max "korta" händelser innan förutsatt att de inte är kontakta bounce

TypeDef lång DATATYP;

#include / / sprintf

Diagnostiska produktionen logger. Samtalsloggen från ISR, skriva ut utanför ISR
#define MAX_LOG_LEN 40
#define LOG_BUF_LEN 8
klass Logger {
skyddad:
flyktiga int nIn;
int nOut;
char buf [LOG_BUF_LEN] [MAX_LOG_LEN];
offentlig:
char msgBuf [MAX_LOG_LEN];
Logger() {nIn = nOut = 0;}
void print()
{
om (nOut > = nIn) återvända;
int jag = nOut % LOG_BUF_LEN;
nOut ++;
Serial.println(BUF[i]); Serial.flush();
}
Tom log (const char * msg)
{
int i, k;
k = nIn % LOG_BUF_LEN;
för (jag = 0; (msg[i]!=0) & & (jag < MAX_LOG_LEN-1); i ++) buf [k] [i] = msg [i];
BUF [k] [i] = 0;
nIn ++;
}
void log() {log(msgBuf);} / / för att använda som msgBuf
} Loggen;

klass RingBuffer {
skyddad:
flyktiga int nIn;
int nOut;
flyktiga DATATYPE buf [BUF_LEN];

offentlig:
void reset() {nIn = nOut = 0;}
RingBuffer() {reset();}

flyktiga void push(DATATYPE x)
{
om (nOut < = nIn - BUF_LEN)
{
sprintf (Log.msgBuf,"RingBuffer Overflow %d", x); Log.log();
Serial.println ("RingBuffer Overflow"); Serial.println(x);//Serial.flush();
hemkomst.
}
int jag = nIn % BUF_LEN;
BUF [i] = x;
nIn ++;
}
inline bool empty() const {return (nOut > = nIn);}
DATATYPEN pop()
{
om (nOut > = nIn) return(0xffff);
int jag = nOut % BUF_LEN;
nOut ++;
Return(BUF[i]);
}
DATATYPEN peek() / / kika på sista utgång
{
int jag = nOut % BUF_LEN;
Return(BUF[i]);
}
DATATYPEN kika (const int nBack) / / topp vid angivna prev INPUT, 0 är de senaste
{
int jag = nIn-1-nBack;
om (jag < 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);}
};

klass TimeEventRingBuffer: offentliga RingBuffer {
skyddad:
osignerade långa t0;
flyktiga int nShort;
flyktiga DATATYP shortBuf [MAX_SHORT];
offentlig:
void reset()
{
setZero();
nShort = 0;
RingBuffer::reset();
}
TimeEventRingBuffer()
{
nShort = t0 = 0;
}
void push()
{
osignerade långa tt = millis();
DATATYPEN tNow = (DATATYPE)(tt-t0);

Sök efter kontakt bounce
DATATYPEN t1 = peek(0); föregående inspelade input
DATATYPEN t2 = peek(1);
om (tNow-t1 < 0,1 * (t1-t2))
{/ / kort trigger, sannolikt kontakta bounce
om (nShort < MAX_SHORT)
{
shortBuf [nShort ++] = tNow;
hemkomst.
}
För många kort utlösare i rad, dumpa dem
för (int jag = 0; jag < MAX_SHORT; i ++) RingBuffer::push(shortBuf[i]);
}

spela in tidpunkten för denna händelse
RingBuffer::push(tNow);
nShort = 0; denna händelse var bra. Återställ räknaren för kort-trigger
}
void setZero()
{
t0 = millis();
}
};

TimeEventRingBuffer Data.
bool RecordingOn;

ISR när hjulet sensor händelse upptäcks
void wheelSense()
{
om (RecordingOn)
{
Data.push();
}
digitalWrite(PIN_LED_SENSOR,digitalRead(PIN_LED_SENSOR)? LOW:HIGH);
}

void setup()
{
pinMode(2,INPUT); hårdkodad till stift 2, sedan använda standard ext. avbryta 0
pinMode(PIN_RECORD,INPUT);
digitalWrite(PIN_RECORD,HIGH); Aktivera 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 är på stift 2 (INT1 på stift 3)

Serial.BEGIN(9600); kanske vill en annan seriell bildskärm, som kan vara snabbare
}

void loop()
{
Log.Print(); Kontrollera om några loggmeddelanden behöver skrivas ut

IF (!. Data.Empty())
{
Serial.Print(data.nPop());
Serial.Print("\t");
Serial.println(data.pop());
Serial.flush();
}

Kontrollera om inspelningen är aktiverat
bool rec = (digitalRead (PIN_RECORD) == låg)? sant: falskt;
REC = sant; / / alltid rekord för testning

om (RecordingOn)
{
om (! rec)
{/ / slå inspelning OFF
digitalWrite(PIN_LED_RECORD,LOW);
RecordingOn = false;
Delay(2); undvika kontakt bounce
}
}
annat
{/ / inspelning är off
om (rec)
{/ / övergång från av till på, börja spela in
digitalWrite(PIN_LED_RECORD,HIGH);
Data.setZero();
om (Data.empty()) Data.reset();
RecordingOn = sant;
Delay(2); undvika kontakt bounce
}
}
}

Här är ett bekvämt LINUX skript att både Visa och logga data från en seriell anslutning. Denna kod är inställt för en-USB/seriell portanslutning, men om du ändrar enheten det ser till något liknande /dev/rfcomm0 det kan ställas in att arbeta över en Bluetooth/SPP enhet.

#! / usr/bin/perl - w
# Loggar ut från en arduino typiska 9600 8-n-1

# antar de flesta nyligen skapade tty är Arduino.
# för de flesta användare, bör detta vanligtvis arbete
$devName = ' ls -t/dev/tty * | huvud 1 ";
Chomp($devName);
skriva ut "Lyssna på $devName\n";

# Ställ in port för vanliga Arduino (SerialMonitor-liknande) inställningar
system ("stty -F $devName cs8 9600 ignbrk - brkint - icrnl - imaxbel - opost - onlcr - isig - icanon - iexten-eko - echoe - echok - echoctl - echoke noflsh - ixon - crtscts");

$logFileName = ($#ARGV > = 0)? $ARGV [0]: "/ tmp/serial.log";
skriva ut "Loggning till $logFileName\n";

$pid = fork();
om ($pid == 0)
{
# Detta är barnet.
lokala $cmd = "svans -f $devName > $logFileName";
# av någon anledning, ovan fungerade inte på en netbook, men det gjorde:
#local $cmd = "cat $devName > $logFileName";
skriva ut "$cmd\n";
exec($CMD);
}
annat
{
# Detta är överordnad, Visa logg.
# förhoppningsvis när är ^ C'ed eller dödades, det kommer att döda barn också
sova 2.
lokala $cmd = "svans -f $logFileName";
skriva ut "$cmd\n";
exec($CMD);
}

Relaterade Ämnen

Baserade Arduino Bi-color LED Matrix Tetris spelet

En av elektronik DIY kit jolliFactory kom upp med är den Bi-color LED Matrix Driver modul Kit. Denna modul är utformad för att kunna kedja-så att du kan seriekoppla moduler tillsammans med antalet moduler du behöver för att passa ditt projekt.Följand...

BASERADE ARDUINO MPPT sol LADDNINGSREGULATORN

BASERADE ARDUINO MPPT SOL LADDNINGSREGULATORNBesök min hemsida för Schematisk och kod Baserade ARDUINO MPPT sol LADDNINGSREGULATORNVad är Mppt (Maximum power point spårning)?"vi använder MPPT algoritm för att få maximal tillgänglig effekt från solcel...

Baserade Arduino - Power Control System för RPi bil PC

Hej alla! Jag är Michalis Vasilakis från www.ardumotive.com och i handboken jag kommer att visa dig hur man gör en enkel - baserade Arduino - Power Control System för RPi Car PC.Detta system är utformat för att undvika abrupta stängningen av PRi bile...

AbHhGD - baserade Arduino handhållna spelenheten

Detta är en skriva upp på min Arduino baserat handhållna spelenheten. Jag inser att det är ett ganska trevliga uttalande men hey, det är baserade Arduino, det är handhållen och det är en enhet som spelar spel!Steg 1: En handhållen gaming anordning......

Arduino - dörren händelse logger

Ok, så för min första instructable jag trodde att dela något jag bara har gjort idag.Det är en logger för allt verkligen som består av något som är på eller av (ifall den dörren, öppna / stängda).För detta ska tillämpas på en dörr, den tryckknapp har...

Baserade Arduino House värmare Controler med SMS användargränssnitt

projektet innehåller instruktioner och koden för att bygga en uppvärmning controller för ditt hem eller avlägsna land hus, som kan kontrolleras och övervakas av GSM via SMS-kommandon. Jag började att utforma det så vi behövde en pålitlig och Register...

Hemmabyggd (DIY) CNC router - baserade Arduino (GRBL)

Redan för några var månader eller år, jag planerar att bygga mitt eget CNC fräsmaskin. Nu bestämde jag mig för det var tid att göra det! Jag läser mycket om andra DIY projekt och till slut jag gillade designen från Arduino CNC intstructable som jag h...

Baserade Arduino 4WD Bluetooth Microbot

Denna microbot är inspirerad av Arduino-Nano-baserade-Microbot. Istället för att använda 2 servon, är denna robot drivs av 4, vilket eliminerar behovet av spår.Micro controller jag använder är Bluno skalbaggen, som är en liten Arduino baserade contro...

Baserade Arduino RC med två växlar (mustasch som) för att undvika hinder

Min RCs funktion är baserad på två permanent öppen kretsar, en på vänster sida och en på höger sida av RC, som stängs när sidan knölar på något. En mustasch som kabeln trycks sedan på en skruv och växeln stängt ger signalen till arduino att vända sig...

Baserade Arduino remote översättare

Det finns 3 fjärrkontrollen är bara att titta på min TV, för TV, sätta topp låda och sound bar. Förfarande för att titta på TV är byta på TV att sätta sin källa till A / V, inkoppling ljudsystem och sätta dess källa för aux och inkoppling sätta topp...

Snow klockan (baserade Arduino)

dag jag ska visa dig hur man gör snö klockan. Det är en väckarklocka som bara går på när skolan är öppen. Men om skolan är stängd det går inte.Detta sker genom Arduino och vissa python kodning.Steg 1: Få delar För detta projekt behöver du:-En Arduino...

Pinguino Egypten - PIC baserade Arduino

Det har varit elva år sedan jag först började lära och bygga min första Microchip PIC mikrokontroller krets. Jag gillar verkligen denna Microcontroller familj.Nyligen började jag läsa och försöker vissa Arduino.Jag ville verkligen bygga en liknande k...

Baserade Arduino avstånd åtgärd Box

Hej, i detta projekt kommer att jag visa dig hur man bygger din egna avstånd mätaren box med Arduino uno och en ultrasonic sensor.Innan du börjar, se till att du har:Arduino unoHC-SR04 Ultrasonic SensorLCD 16 x 2Officiella sida: http://www.ardumotive...

Baserade Arduino Solar PV energimätare med Xively anslutning (kan övervakas på android eller iPhone)

Det har varit ungefär två dagar sedan jag gjorde den Arduino PV generationen mätare, men det var ett misstag att inte att ta de steg för steg bilderna innan du fortsätter för provningen. Och det var en hemsk idé att Visa raw du för så kallade elmätar...

Baserade Arduino Piano

Hej killar, idag gör vi en elektronisk Arduino baserade piano (E-Piano). Det är en enkel piano som spelar de grundläggande musiknoter (göra Re mig Fa så La Si). Jag har lagt till en anpassad Super Mario Bros Melody E-piano som gjordes av PrinceTronic...

Baserade Arduino skrivbordet linje efterföljare - jolliBot

Ett av de klassiska projekt som kan intressera intrade nivå robotics hobby är linjen efter robot som är mer allmänt känd som en rad efterföljare. Det finns massor av kit sätter tillgänglig att bygga linjen anhängare men de är i allmänhet ganska stor...

JavaScript robotics och browser-baserade Arduino kontroll

Använd dina JavaScript och web utveckling kunskaper för att styra Arduino projekt och även robotar (nod + robotar = nodebots)!Detta görs enkelt med node.js, Firmata och Johnny-fem. Låt oss komma igång! Johnny-fem logo av Mike Sgier. Arduino foto Steg...

Arduino närvaro logger

Jag undrar alltid hur många timmar per månad jag spenderar arbeta på mina projekt. Jag designa hopfully atendance logger för lokala företag och imidiatelly såg potentialen i denna enkla logger. Första prototypen gjordes med Arduino och var bara ett b...

Baserade Arduino Beer fermenteren termostat

Tanken var att göra en arduino baserade termostat för en fridgecombined med en värmekälla utan hacking kylen själv.För detta projekt behöver du (länkar se belgiska webbshop så kan du se ett exempel):-Arduino (eller Funduino etx.) 3-2 relä modul (BTE1...