// *** DataLogging *** // This example expands the previous SendandReceiveArguments example. // The Arduino will now wait for the StartLogging command, before sending analog data to the PC // and sent multiple float values in scientific format. #include <CmdMessenger.h> // CmdMessenger // Attach a new CmdMessenger object to the default Serial port CmdMessenger cmdMessenger = CmdMessenger(Serial); // Thermocouple pins const int AnalogPin1 = 0; const int AnalogPin2 = 1; bool acquireData = false; const unsigned long sampleInterval = 100; // 0.1 second interval, 10 Hz frequency unsigned long previousSampleMillis = 0; long startAcqMillis = 0; // This is the list of recognized commands. These can be commands that can either be sent or received. // In order to receive, attach a callback function to these events enum { // Commands kAcknowledge , // Command to acknowledge that cmd was received kError , // Command to report errors kStartLogging , // Command to request logging start (typically PC -> Arduino) kPlotDataPoint , // Command to request datapoint plotting (typically Arduino -> PC) }; // Commands we send from the PC and want to receive on the Arduino. // We must define a callback function in our Arduino program for each entry in the list below. void attachCommandCallbacks() { // Attach callback methods cmdMessenger.attach(OnUnknownCommand); cmdMessenger.attach(kStartLogging, OnStartLogging); } // ------------------ C A L L B A C K S ----------------------- // Called when a received command has no attached function void OnUnknownCommand() { cmdMessenger.sendCmd(kError,"Command without attached callback"); } // Callback function that responds that Arduino is ready (has booted up) void OnArduinoReady() { cmdMessenger.sendCmd(kAcknowledge,"Arduino ready"); } // Callback function calculates the sum of the two received float values void OnStartLogging() { // Start data acquisition startAcqMillis = millis(); acquireData = true; cmdMessenger.sendCmd(kAcknowledge,"Start Logging"); } // ------------------ M A I N ---------------------- // Setup function void setup() { // Listen on serial connection for messages from the pc Serial.begin(115200); // Adds newline to every command cmdMessenger.printLfCr(); // Attach my application's user-defined callback methods attachCommandCallbacks(); // Send the status to the PC that says the Arduino has booted cmdMessenger.sendCmd(kAcknowledge,"Arduino has started!"); } // Returns if it has been more than interval (in ms) ago. Used for periodic actions bool hasExpired(unsigned long &prevTime, unsigned long interval) { if ( millis() - prevTime > interval ) { prevTime = millis(); return true; } else return false; } // Loop function void loop() { // Process incoming serial data, and perform callbacks cmdMessenger.feedinSerialData(); // Do measurement after certain sample interval if (hasExpired(previousSampleMillis,sampleInterval)) { if (acquireData) { measure(); } } } // simple readout of two Analog pins. void measure() { float seconds = (float) (millis()-startAcqMillis) /1000.0 ; float Analog1 = analogRead(AnalogPin1); float Analog2 = analogRead(AnalogPin2); cmdMessenger.sendCmdStart(kPlotDataPoint); cmdMessenger.sendCmdArg(seconds,4); cmdMessenger.sendCmdSciArg(Analog1); cmdMessenger.sendCmdSciArg(Analog2); cmdMessenger.sendCmdEnd(); }