Using Machinechat's JEDI Serial Data Collector with Arduino and the Grove Beginner Kit

Description

With Machinechat’s JEDI v3.0 software release, a serial data collector was added. The serial data collector enables data in CSV (comma separated values) format to be sent to JEDI via a serial interface on the machine where JEDI is running. This project demonstrates using Arduino and Seeed’s Grove Beginner Kit to send sensor data to JEDI Pro using the serial data collector. The project discusses serial data collector format requirements, collector setup in JEDI and debug capabilities. Machinechat’s JEDI Pro IoT platform is installed on Seeed’s Odyssey Blue mini PC running Ubuntu.

Hardware

Software

  • JEDI Pro or JEDI Pro SSE
    Adaptable software for IoT data collection, visualization, monitoring and data storage that can be integrated into IoT solutions. Capabilities include: collect data from sensors, devices and machines; build intuitive real-time and historical data and system view dashboards; create rules to monitor and respond to data conditions automatically; receive alert notifications by email and SMS. JEDI Pro SSE is the Seeed Studio Edition version of JEDI Pro that adds a Data Collector for Seeed’s line of SenseCAP LoRaWAN sensors
  • Arduino
    Arduino is an open-source electronics platform based on easy-to-use hardware and software.

Serial Data Collector Details

The serial data collector allows for up to 15 data fields to be received in a recurring serial message. Each data field needs to be separated by a comma and can contain a number, string, Boolean, or blank (null or “no value” in that message). The record delimiter for the serial message needs to be configured and can be set to “New Line” or “Carriage Return”. The number of data fields in the message must match the number of fields set up in the data collector. Position of the data in the serial message corresponds to the number associated with the field in the data collector configuration.
For example, a serial data message may contain the values for “light”, “sound”, and “temperature”. The message could look like the below:

124,33,72.1

In order for the value 124 to be associated with “light”, 33 with “sound” and 72.1 with “temperature”; the corresponding three data collector fields would need to be set up like the following example.
image

Setting up a JEDI serial data collector consists of 5 steps:
1 - Select the serial port to monitor
2 - Select a unique TargetID name for the data stream
3 - Set the serial port parameters (baud rate, stop bits, data bits, and parity)
4 - Set the record delimiter
5 - Add the CSV fields
Optionally, the timestamp can be extracted from the serial data if it is present, but by default the data is stamped as it comes in.

Debugging the Serial Data Collector:
If you are having issues bringing in or viewing serial data, a debugger can be enabled to create a log file. In the lower left of the serial data collector setup screen there is a “Enable Debug” slider. When enabled, this captures activity and any errors taking place when the collector is running. You can find the output of this capture in the “debug.log” file in the “debug/datacollectors” sub-directory where JEDI is installed.

Detailed information on the serial data collector can be found in Machinechat’s article Using the Serial Data Collector.

Implementation

An Arduino application running on the Grove Beginner Kit reads the five on-board sensors (light, sound, temperature/humidity, pressure, accelerometer), displays sensor data on the OLED display, and sends sensor data over the serial interface to the Odyssey Blue Mini-PC running JEDI in format specific for the Serial Data Collector. The Arduino code is a modified version of the Grove Beginner Kit example code that loops through each sensor every 10 seconds and repeats. Hardware implementation is straightforward, a USB cable just needs to be connected between the Odyssey Blue and Grove Beginner Kit. Below diagram illustrates the connection (see Scheme-it OdysseyGrove Project and BOM).

Set up the Seeed Grove Beginner Kit

1 - Set up Arduino on the Grove Beginner Kit. See link Grove Beginner Kit for Arduino. In Arduino IDE, when selecting “Board” select “Arduino Uno”

2 - Install libraries needed for application. Add these libraries thru Arduino’s Library Manager:

3 - Code walkthrough (filename: UNO_GroveBeginnerKitJediProSerialLoop.ino)

Initial setup

//
// Seeed Grove Beginner Kit for Arduino - default code
// Modified to send CSV information over serial (USB) port
// For use as input to Machinechat JEDI software
// v0.1 DRM 07-04-2022
//
// CSV is as follows: "Light, Sound, Temoperature, Humidity, Air Pressure,
// Acceleration X, Acceleration Y, Acceleration Z"
//
// Only one parameter is sent at a time based on selection displayed on OLED
// Display
// SBR modification to remove selection capability and just loop thru the sensors send & display data on OLED
//
#include <U8g2lib.h>
#include <Wire.h>
//#include <MsTimer2.h>
#include "DHT.h" 
#include "Seeed_BMP280.h"
#include "LIS3DHTR.h"
#include "millisDelay.h" //part of SafeString library for non-blocking timer use
#define WIRE Wire
millisDelay loopDelay;
//20*20
const unsigned char sound_bmp[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3e, 0x00, 0x80, 0x3f, 0x0c, 0xc0, 0x3b, 0x0c, 0xfe, 0xb8, 0x0d, 0x7f, 0xb8, 0x0d, 0x03, 0xb8, 0x0d, 0x03, 0xb8, 0x0d, 0x03, 0xb8, 0x0d, 0x03, 0xb8, 0x0d, 0x03, 0xb8, 0x0d, 0xff, 0xb8, 0x0d, 0xc0, 0x39, 0x0c, 0x80, 0x3f, 0x0c, 0x00, 0x3e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00};
//20*30
const unsigned char temp_bmp[] U8X8_PROGMEM = {0x00, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x80, 0x19, 0x00, 0x80, 0x19, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x06, 0x00};
//20*20
const unsigned char hum_bmp[] U8X8_PROGMEM= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x80,0x10,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x40,0x00,0x20,0x40,0x00,0x10,0x80,0x00,0x10,0x80,0x00,0x08,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x01,0x10,0x80,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x80,0x10,0x00};
//20*20
const unsigned char pressure_bmp1[] U8X8_PROGMEM= {0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0x80,0x96,0x01,0x80,0x1f,0x03,0x00,0x0f,0x06,0x18,0x06,0x04,0x1c,0x04,0x04,0x06,0x00,0x06,0xc6,0xff,0x03,0xc6,0xff,0x01,0x04,0x00,0x00,0xfc,0xff,0x03,0xf8,0xff,0x03,0x00,0x00,0x00,0xfe,0xff,0x07,0xfe,0xff,0x07,0x00,0x00,0x00};
//30*30
const unsigned char pressure_bmp[] U8X8_PROGMEM= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc8,0xc4,0x01,0x00,0xf8,0x87,0x07,0x00,0xf8,0x87,0x07,0x60,0xf0,0x03,0x04,0x60,0xf0,0x03,0x04,0xf0,0xc0,0x00,0x04,0xf0,0xc0,0x00,0x04,0x18,0x00,0x00,0x06,0x18,0x00,0x00,0x06,0x08,0xfc,0xff,0x03,0x08,0xfc,0xff,0x03,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xf0,0xff,0xff,0x03,0xf0,0xff,0xff,0x03,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x1f,0xfe,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//30*30
const unsigned char light_tmp[] U8X8_PROGMEM = {0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0xc1, 0x60, 0x00, 0x80, 0xc3, 0x70, 0x00, 0x00, 0xc3, 0x30, 0x00, 0x00, 0xc7, 0x38, 0x00, 0x00, 0x06, 0x18, 0x00, 0x0c, 0xf0, 0x03, 0x0c, 0x3c, 0xfc, 0x0f, 0x0f, 0x78, 0x1e, 0x9e, 0x07, 0x60, 0x07, 0xb8, 0x01, 0x00, 0x03, 0x30, 0x00, 0x80, 0x03, 0x70, 0x00, 0x80, 0x01, 0x60, 0x00, 0xbf, 0x01, 0x60, 0x3f, 0xbf, 0x01, 0x60, 0x3f, 0x80, 0x01, 0x60, 0x00, 0x80, 0x03, 0x70, 0x00, 0x00, 0x03, 0x30, 0x00, 0x60, 0x07, 0xb8, 0x01, 0x78, 0x1e, 0x9e, 0x07, 0x3c, 0xfc, 0x0f, 0x0f, 0x0c, 0xf0, 0x03, 0x0c, 0x00, 0x06, 0x18, 0x00, 0x00, 0xc7, 0x38, 0x00, 0x00, 0xc3, 0x30, 0x00, 0x80, 0xc3, 0x70, 0x00, 0x80, 0xc1, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00};
//30*30
const unsigned char sound_bmp1[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, 0x48, 0x80, 0x01, 0x00, 0x4c, 0x18, 0x03, 0x00, 0x46, 0x30, 0x02, 0x00, 0x43, 0x60, 0x04, 0x80, 0x41, 0x43, 0x04, 0xfc, 0x40, 0x84, 0x08, 0x46, 0x40, 0x8c, 0x08, 0x46, 0x40, 0x88, 0x08, 0x46, 0x40, 0x10, 0x09, 0x06, 0x40, 0x10, 0x09, 0x06, 0x40, 0x10, 0x19, 0x06, 0x40, 0x10, 0x09, 0x06, 0x40, 0x10, 0x09, 0x46, 0x40, 0x18, 0x09, 0x46, 0x40, 0x88, 0x08, 0x46, 0x40, 0x8c, 0x08, 0xfc, 0x40, 0x86, 0x0c, 0x80, 0x41, 0x43, 0x04, 0x00, 0x43, 0x20, 0x04, 0x00, 0x42, 0x30, 0x02, 0x00, 0x44, 0x0c, 0x03, 0x00, 0x48, 0x80, 0x01, 0x00, 0x50, 0xc0, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//30*30
const unsigned char acel_bmp[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x80, 0x01, 0x60, 0x00, 0x60, 0x00, 0x80, 0x00, 0x30, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x04, 0x04, 0x20, 0x01, 0x08, 0x04, 0x10, 0x02, 0x08, 0x02, 0xf8, 0x03, 0x08, 0x02, 0x0c, 0x0e, 0x10, 0x02, 0x0a, 0x10, 0x10, 0x02, 0x0a, 0x10, 0x10, 0x02, 0x02, 0x0a, 0x10, 0x02, 0x18, 0x06, 0x18, 0x06, 0x10, 0x02, 0x08, 0x04, 0x20, 0x01, 0x08, 0x04, 0xc0, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x04, 0x18, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x03, 0x60, 0x00, 0x80, 0x01, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//30*30
const unsigned char temp_bmp1[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x1f, 0x8f, 0xff, 0xff, 0x3f, 0x0f, 0x00, 0x00, 0x3e, 0x0f, 0x00, 0x00, 0x3e, 0x8f, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x07, 0xfc, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

#define BoardVersion 2

#if BoardVersion == 1
char led = 5;
char buzzer = 6;
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/U8X8_PIN_NONE);
char button = 2;
char rotary = A1;
char light = A2;
char sound = A0;
DHT dht(4,DHT11);
BMP280 bmp280; 
// LIS3DHTR<TwoWire> accelemeter(I2C_MODE);
LIS3DHTR<TwoWire> accelemeter; //IIC

#elif BoardVersion == 2
char led = 4;
char buzzer = 5;
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/U8X8_PIN_NONE);
char button = 6;
char rotary = A0;
char light = A6;
char sound = A2;
DHT dht(3,DHT11);
BMP280 bmp280; 
//LIS3DHTR<TwoWire> accelemeter(I2C_MODE);
LIS3DHTR<TwoWire> accelemeter; //IIC
#endif

#define CLICKS 100
int BuzzerFrequency = 300;
char MODE = 1;
char LongPress = false;
int x = 50, y = 13;
char PressCounter = 0;
char BlinkEnable = true;
#define BLINK 10
#define SQueueLEN 10
int SQueue[SQueueLEN] = {0};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  if(!bmp280.init()){
    Serial.println("bmp280 init error!");
  }
  //accelemeter.begin(Wire);
  accelemeter.begin(WIRE, LIS3DHTR_ADDRESS_UPDATED); //IIC init
  delay(100);
  //accelemeter.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);
  accelemeter.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);

  if (!accelemeter) {
      Serial.println("LIS3DHTR didn't connect.");
  }
  for (int Index = 0 ; Index < SQueueLEN ; Index ++)
  {
    SQueue[Index] = analogRead(sound);
  }
  u8g2.begin();

  //SBR mod
  MODE = 1;
  loopDelay.start(10000);  // start a 10sec delay
}

Main loop - call sensor subroutines to read sensors, display sensor data on OLED and send data over serial interface

void loop() {
  if (loopDelay.justFinished()) {
    MODE = MODE + 1; // increment mode
    loopDelay.start(10000);  // start a 10sec delay
  }

  //reset mode loop
  if (MODE == 6) {
    MODE = 1;
  }

   if (MODE == 1) {
    Light_show();
  } else if (MODE == 2) {
    Sound_show();
  } else if (MODE == 3) {
    Temp_show();
  } else if (MODE == 4) {
    Pressure_show();
  } else if (MODE == 5) {
    Acele_show();
  }
}

Sensor subroutines for light, sound, temperature/humidity, pressure, and accelerometer sensors(reads sensor, sends sensor data in specific position in serial message, and displays sensor data on kit’s on-board OLED display)

void Light_show()
{
  int l = analogRead(light);
  Serial.println(String(l) + ",,,,,,,");
  Serial.flush();
  delay(500);
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_t0_16b_mr);
    u8g2.drawCircle(8, 8, 8, U8G2_DRAW_ALL);
    if (l >= 50 && l < 100) {
      u8g2.drawDisc(8, 8, 8, U8G2_DRAW_UPPER_LEFT);
    }
    if (l >= 100 & l < 200) {
      u8g2.drawDisc(8, 8, 8,  U8G2_DRAW_UPPER_RIGHT | U8G2_DRAW_UPPER_LEFT);
    }
    if (l >= 200 && l < 350) {
      u8g2.drawDisc(8, 8, 8,  U8G2_DRAW_LOWER_LEFT | U8G2_DRAW_UPPER_RIGHT | U8G2_DRAW_UPPER_LEFT);
    }
    if (l >= 350) {
      u8g2.drawDisc(8, 8, 8,  U8G2_DRAW_ALL);
    }
    u8g2.setCursor(26, 32);
    u8g2.print(F("Light:"));
    u8g2.setCursor(80, 32);
    u8g2.print(l);
     //SBR mod
    u8g2.setCursor(0, 64);
    u8g2.print(F("JEDI Serial data"));

    
  } while (u8g2.nextPage());
}

int filter1(int NEW_DATA,int QUEUE[],char n)
{
    int max;
    int min;
    int sum;
    char i;
    QUEUE[0]=NEW_DATA;
    if (QUEUE[0] < 0)
    QUEUE[0] = 0;
    max=QUEUE[0];
    min=QUEUE[0];
    sum=QUEUE[0];
    for(i=n-1;i!=0;i--){
        if(QUEUE[i]>max)max=QUEUE[i];                  
        else if (QUEUE[i]<min)min=QUEUE[i];             
        sum=sum+QUEUE[i];                              
        QUEUE[i]=QUEUE[i-1];                            
    }

    i=n-2;
    sum=sum-max-min+i/2;
    sum=sum/i;                                     
                                                    
    return ((int)sum);
}       
void Sound_show()
{
  int s = analogRead(sound);
  s = filter1(s,SQueue,SQueueLEN);
  delay(500);
  Serial.println("," + String(s) + ",,,,,,");
  Serial.flush();
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_t0_16b_mr);
    u8g2.setCursor(28, 32);
    u8g2.print(F("Sound:"));
    u8g2.setCursor(76, 32);
    u8g2.drawXBMP(0, 0, 20, 20, sound_bmp);
    u8g2.print(s);
    //SBR mods
    u8g2.setCursor(0, 64);
    u8g2.print(F("JEDI Serial data"));
    
  } while (u8g2.nextPage());
}

void Temp_show()
{
  int tempC = 0, humid = 0;
  float tempF = 0.0;
  do{
  humid = dht.readHumidity();
  tempC = dht.readTemperature();
  tempF = (float(tempC) * 1.8) + 32.0F;
  } while ((humid == 0) && (tempC == 0)); 
  delay(500);
  Serial.println(",," + String(int(tempF)) + ",,,,,");
  Serial.flush();
  Serial.println(",,," + String(humid) + ",,,,");
  Serial.flush();
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_t0_16b_mr);
    u8g2.setCursor(32, 16);
    u8g2.print(F("Temp:"));
    u8g2.setCursor(72, 16);
    u8g2.print(int(tempF));
    u8g2.setCursor(88, 16);
    u8g2.print("F");
    u8g2.setCursor(32, 40);
    u8g2.print(F("Humid:"));
    u8g2.setCursor(80, 40);
    u8g2.print(humid);
    u8g2.drawXBMP(0, 0, 20, 30, temp_bmp);
    u8g2.setCursor(0, 64);
    u8g2.print(F("JEDI Serial data")); 
  } while (u8g2.nextPage());
}

void Pressure_show()
{
  float pressure = (bmp280.getPressure() * 0.000295300586F);
  delay(500);
  Serial.println(",,,," + String(pressure, 2) + ",,,");
  Serial.flush();
  u8g2.setFont(u8g2_font_t0_16b_mr);
  u8g2.firstPage();
  do {
      u8g2.setCursor(76, 32);
      u8g2.drawXBMP(0, 0, 20, 20, pressure_bmp1);
      u8g2.setCursor(30, 25);
      u8g2.print("Pressure:"); 
      u8g2.setCursor(30, 40);
      u8g2.print(pressure);
      u8g2.print("inHg");
      u8g2.setCursor(0, 64);
      u8g2.print(F("JEDI Serial data"));       
    } while (u8g2.nextPage());
}

void Acele_show()
{
  float ax, ay, az;
  ax = accelemeter.getAccelerationX();
  ay = -accelemeter.getAccelerationY();
  az = accelemeter.getAccelerationZ();
  delay(500);
  Serial.println(",,,,," + String(ax, 2) + ",,");
  Serial.flush();
  Serial.println(",,,,,," + String(ay, 2) + ",");
  Serial.flush();
  Serial.println(",,,,,,," + String(az, 2));
  Serial.flush();
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_t0_16b_mr);
    u8g2.setCursor(0, 16);
    u8g2.print(F("Accel:")); 
    u8g2.setFont(u8g2_font_t0_12b_mr);   
    u8g2.setCursor(55, 16);
    u8g2.print(F("X:"));
    u8g2.setCursor(71, 16);
    u8g2.print(ax);
    u8g2.setCursor(55, 32);
    u8g2.print(F("Y:"));
    u8g2.setCursor(71, 32);
    u8g2.print(ay);
    u8g2.setCursor(55, 48);
    u8g2.print(F("Z:"));
    u8g2.setCursor(71, 48);
    u8g2.print(az);
    u8g2.setFont(u8g2_font_t0_16b_mr);
    u8g2.setCursor(0, 64);
    u8g2.print(F("JEDI Serial data"));        
  } while (u8g2.nextPage());
}

Latest source code for the UNO_GroveBeginnerKitJediProSerialLoop.ino application is on github at below link:

Set up JEDI Serial Data Collector and Data Dashboard

In JEDI, select “Settings” tab, then select “Data Collectors” and select “Add Collector”.

Configure Collector as shown below. Name Data Collector “SerialGroveBeginner” (or whatever you prefer), select Collector Type as “Serial”, select Serial Port to serial port for the Grove Beginner Kit (in my setup it was /dev/ttyUSB0) , name Target ID “GroveKit” (or whatever you prefer), select Data Rate “115200”, select Data Bits to “8 bits”, select Parity to “No Parity”, select Record Delimiter to “New Line”. Add the Data Fields for the eight sensor parameter fields as shown below (Light, Sound, Temperature, Humidity, Pressure, AccelX, AccelY, AccelZ).

In JEDI Pro, select “Data Dashboards”, then select “+” to add a new chart.

Configure data chart(s) and select “Add” to include in your Data Dashboard(see example below)

image

Conclusion

Machinechat’s Serial Data Collector for the JEDI IoT application software provides a quick and easy means to pull in sensor or other types of data from development boards, platforms or any devices capable of sending serial data in CSV format. Data can come from USB, RS-232, RS-485 or any other serial devices connected to the hardware running the JEDI software as long as it sent in CSV format.

References

1 Like