Wen-Liang Lin
Published © GPL3+

Seat Monitor

Using ARTIK cloud to monitor cabin seat state.

IntermediateFull instructions provided4 hours6,072
Seat Monitor

Things used in this project

Hardware components

Arduino MKR1000
Arduino MKR1000
×1
Realtek Ameba RTL8195 Board
×1
Piezo Sensor
ControlEverything.com Piezo Sensor
×1
Seeed Studio Grove - Piezo Vibration Sensor
×1

Software apps and online services

ARTIK Cloud for IoT
Samsung ARTIK Cloud for IoT

Story

Read more

Schematics

seat monitor

seat monitor

Code

controller

Arduino
controller MKR1000
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <WiFi101.h>

const char* _SSID     = "_SSID"; //Wi-Fi SSID 
const char* _PASSWORD = "_PASSWORD"; // Wi-Fi Password 

// MQTT - Artik Cloud Server params
char Artik_Cloud_Server[]     = "api.artik.cloud"; // Server 
int  Artik_Cloud_Port         = 8883; // MQTT Port
char Client_Name[] = "train"; // Any Name 
char Device_ID[]   = "Device_ID"; // DEVICE ID
char Device_TOKEN[]   = "Device_TOKEN"; //  DEVICE TOKEN
char MQTT_Publish[]      = "/v1.1/messages/Device_ID"; // (/v1.1/messages/"DEVICE ID")
char MQTT_Subscription[] = "/v1.1/actions/Device_ID"; // (/v1.1/actions/"DEVICE ID")

char buf[200]; // Json Data to Artik Cloud 
char receivebuf[200]; // Json Data receive from Artik Cloud 
WiFiSSLClient client; //must use SSL client when MQTT protocol
MQTTClient MQTT_Artik_Client; // MQTT Protocol

//led SET
const int BROADLEDPin = 6; //use on broad led to show seat state, LED on have seat/ off seat is full

//data ram
int haveseat; //1:have seat / 0: no seat

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  Serial.print("incoming: ");
  Serial.print(topic);
  Serial.print(" - ");
  Serial.print(payload);
  Serial.println();
  String t = topic;
  if(t == MQTT_Subscription) // check DEVICE ID
  {
    parseBuffer(payload);
  }
}

void setup() {
  Serial.begin(57600);  
  // Wifi Setting
  WiFi.begin(_SSID, _PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  MQTT_Artik_Client.begin(Artik_Cloud_Server, Artik_Cloud_Port, client); // Connect to Artik Server
  while (!MQTT_Artik_Client.connect(Client_Name, Device_ID, Device_TOKEN)) { // Connect to Artik IOT Device 
    Serial.print("*");
    delay(1000);
  }
  MQTT_Artik_Client.subscribe(MQTT_Subscription);//set subscribe
  //power on setting
  pinMode(BROADLEDPin, OUTPUT);
  digitalWrite(BROADLEDPin, HIGH);   
  haveseat=1; //default seat is empty
  loadBuffer();
  MQTT_Artik_Client.publish(MQTT_Publish, buf);// Publishing data to the Artik Cloud 
  Serial.println("Publishing..");
}

void loadBuffer(void) {//load function, make data to json form
  StaticJsonBuffer<200> jsonBuffer;
  /*
   * smaple field
   * {"have_seat":1}
   */
   //creat field data make it short or ARTIK cloud not work
  JsonObject& dataPair = jsonBuffer.createObject();
  dataPair["have_seat"]=haveseat;
  dataPair.printTo(buf, sizeof(buf));
  Serial.println(buf);
  
}
void parseBuffer(String _payload) { //parse function
  StaticJsonBuffer<200> jsonBuffer;
  String json = _payload;
  
  json.toCharArray(receivebuf,200); //chang string to char or json can't work

  //*****************************
  JsonObject& root = jsonBuffer.parseObject(receivebuf);
  if (!root.success()) {
    Serial.println("parseObject() failed");
  }
  //****************************
  /*
   *{"actions":[{"name":"seaton","parameters":{"s1":1}}]}
   */
  int seatstate = root["actions"][0]["parameters"]["s1"]; //parse data from receive buffer, as sample show above seatstate will be 1 or 0 after string {"s1": 
  if(seatstate == 1) //seat full, LED off
  {
    digitalWrite(BROADLEDPin, LOW); //LED off
    haveseat=0;//clear haveseat flag and load it to buffer then publishing data to the Artik Cloud
    loadBuffer();
    MQTT_Artik_Client.publish(MQTT_Publish, buf);
    Serial.println("Publishing..");
  }
  if(seatstate ==0 ) // have seat, LED on
  {
     digitalWrite(BROADLEDPin, HIGH);   //LED on
    haveseat=1; //set haveseat flag and load it to buffer then publishing data to the Artik Cloud 
    loadBuffer();
    MQTT_Artik_Client.publish(MQTT_Publish, buf);
    Serial.println("Publishing..");
  }

}
void loop() {
  for (int i =0; i<10;i++){ // delay 1 Mnts
    MQTT_Artik_Client.loop(); //client loop
    Serial.println(buf); //print buffer to check , can be remove to add performance
    delay(6000);
  }  
}

seat sensor

Arduino
Ameba RTL8195 Board
/*
 Thanks Ameba Basic MQTT example
 I mark some point I stuck
*/

#include <WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.

char ssid[] = "ssid";     // your network SSID (name)
char pass[] = "pass";  // your network password
int status  = WL_IDLE_STATUS;    // the Wifi radio's status
//******************************************************************************
//must double check when you copy the code
//******************************************************************************
// MQTT - Artik Cloud Server params
char mqttServer[]     = "api.artik.cloud";
int  mqttPort         = 8883;
char clientId[]       = "seat";
char Device_ID[]   = "Device_ID"; // DEVICE ID
char Device_TOKEN[]   = "Device_TOKEN"; //  DEVICE TOKEN
char publishTopic[]   = "/v1.1/messages/Device_ID";
char subscribeTopic[] = "/v1.1/actions/Device_ID";
char publishPayload[128];

int sensorValue;
int sensorValuetemp;
//******************************************************************************
//must use SSL when MQTT protocol
//******************************************************************************
WiFiSSLClient wifiClient;
PubSubClient client(mqttServer, mqttPort,wifiClient);

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(clientId, Device_ID, Device_TOKEN)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish(publishTopic, publishPayload);
      // ... and resubscribe
      client.subscribe(subscribeTopic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void publish(void) //publish seat sensor value to cloud
{
  /*
   * smaple field
   * {"seatvalue":1}
   */
   //creat field data make it short or ARTIK cloud not work
  memset(publishPayload, 0, sizeof(publishPayload));
  sprintf(publishPayload, "{\"seatvalue\":%d}",sensorValue);
  printf("\t%s\r\n", publishPayload);
  client.publish(publishTopic, publishPayload);
}
void setup()
{
  Serial.begin(38400);

  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
    // wait 5 seconds for connection:
    delay(5000);
  }
  reconnect();
  Serial.println("initial sensorValue");
  Serial.println(sensorValue);
  // Allow the hardware to sort itself out
  delay(1500);
}

void loop()
{
  
  if (!client.connected()) { //check connect state and reconnect
    reconnect();
  }
  for (int i =0; i<10;i++)
  { // delay 1 Mnts
   client.loop();
   sensorValue = analogRead(A0); //read sensor value
   Serial.println(sensorValue);
   if(sensorValue!=sensorValuetemp) //publish when sensorValue change
   {
      publish();
      sensorValuetemp = sensorValue; //save current sensor value
   }
    Serial.println(publishPayload);
    delay(6000);
  }  
}

Credits

Wen-Liang Lin

Wen-Liang Lin

29 projects • 35 followers
Hi, I am momososo

Comments