Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
Wen-Liang Lin
Published © GPL3+

Seat Monitor /Seat Sensor

Using Arduino and ARTIK cloud to monitor cabin seat state.

IntermediateFull instructions provided4 hours6,141
Seat Monitor /Seat Sensor

Things used in this project

Hardware components

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

Software apps and online services

ARTIK Cloud for IoT
Samsung ARTIK Cloud for IoT
Arduino IDE
Arduino IDE

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
29 projects • 34 followers
Hi, I am momososo
Contact

Comments

Please log in or sign up to comment.