In this project we are going to use Load Cell and HX711 Amplifier with Arduino and Raspberry Pi to build a real time graph system using AWS Services. We are using Load Cell as a sensor since it gives data in high frequency which we can see changing on graphs easily. We have seen these pressure sensing gates at many malls and showrooms, which automatically opens when someone is standing near the door and get closed after that person is gone. Also in hospitals as weight scale.
Load cell is transducer which transforms force or pressure into electrical output. Magnitude of this electrical output is directly proportion to the force being applied. Load cells have strain gauge, which deforms when pressure is applied on it. And then strain gauge generates electrical signal on deformation as its effective resistance changes on deformation. A load cell usually consists of four strain gauges in a Wheatstone bridge configuration. Load cell comes in various ranges like 5kg, 10kg, 100kg and more, here we have used Load cell, which can weight upto 40kg.
Now the electrical signals generated by Load cell is in few millivolts, so they need to be further amplify by some amplifier and hence HX711 Weighing Sensor comes into picture. HX711 Weighing Sensor Module has HX711 chip, which is a 24 high precision A/D converter (Analog to digital converter). HX711 has two analog input channels and we can get gain up to128 by programming these channels. So HX711 module amplifies the low electric output of Load cells and then this amplified & digitally converted signal is fed into the Arduino to derive the weight.
Load cell is connected with HX711 Load cell Amplifier using four wires. These four wires are Red, Black, White and Green/Blue. There may be slight variation in colors of wires from module to module. Below the connection details and diagram:
Connect Load Cell with HX711 and Arduino like below.
Now since our Load Cell is connected to Arduino, we have to code Arduino board to communicate it with load cell.
For this we will have to download HX711 arduino library.
Download the library from the link, and add it to arduino libraries folder.
Below is the code to upload on arduino. (Code will work on any arduino platform if DT and SCK are connected on digital 3,4 pins respectively.)
#include "HX711.h"
#define DOUT 2
#define CLK 3
HX711 scale;
long int value;
float calibration_factor = 166; //-7050 worked for my 440lb max scale. Calbibration factor may be
different in your case.
void setup() {
Serial.begin(9600);
scale.begin(DOUT, CLK);
scale.set_scale(calibration_factor);
scale.tare(); //Reset the scale to 0
long zero_factor = scale.read_average(); //Get a baseline reading
}
void loop() {
value = scale.get_units(), 1;
if(value<0){ value=0; } Serial.print(value); //scale.get_units() returns a float Serial.println(); }
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
Now we are done with IoT Core setup. We can now proceed to setup our Raspberry Pi.
Following are steps to setup Raspberry Pi:
AWS_IOT_MQTT_HOST = '{YOUR_AWS_IOT_ENDPOINT}'
DEVICE_ID = '001'
AWS_IOT_MQTT_PORT = 8883
AWS_IOT_MQTT_CLIENT_ID ='Test'
AWS_IOT_MY_THING_NAME ='Test'
AWS_IOT_ROOT_CA_FILENAME ='/home/pi/iot-device/Certs/AmazonRootCA1.pem'
AWS_IOT_CERTIFICATE_FILENAME = '/home/pi/iot-device/Certs/client-cert.pem.crt'
AWS_IOT_PRIVATE_KEY_FILENAME = '/home/pi/iot-device/Certs/private-key.pem.key'
AWS_IOT_ARDUINO_SERIAL_PORT = '/dev/ttyUSB0'
AWS_IOT_TOPIC = 'loadcell/test'
AWS_IOT_READ_INTERVAL = 0
AWS_IOT_PUBLISH_INTERVAL = 0
AWS_IOT_KEEPALIVE = 60
AWS_IOT_QOS = 1
AWS_IOT_MAXINFLIGHTMESSAGES = 1
AWS_IOT_MAXQUEUEDMESSAGES = 10000
AWS_IOT_MQTT_ERR_NO_CONN = 1
AWS_IOT_MQTT_ERR_SUCCESS = 0
WAIT_UNTIL_REPUBLISH = 60
import datetime
import time
import config
import logging
import serial
import json
import paho.mqtt.client as mqttClient
import ssl
#from color_detection import Color_Detection
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(name)s %(levelname)s:
%(message)s')
logger = logging.getLogger(__name__)
'''
global variables
'''
TOPIC = config.AWS_IOT_TOPIC
DEVICE_ID = config.AWS_IOT_MQTT_CLIENT_ID
SERIAL_PORT = config.AWS_IOT_ARDUINO_SERIAL_PORT
READ_INTERVAL = config.AWS_IOT_READ_INTERVAL
DID = config.DEVICE_ID
arduino_connected_status = 0
connected = False # Stores the connection status
BROKER_ENDPOINT = config.AWS_IOT_MQTT_HOST
TLS_PORT = 8883 # Secure port
DEVICE_LABEL = config.AWS_IOT_MQTT_CLIENT_ID
TLS_CERT_PATH = config.AWS_IOT_ROOT_CA_FILENAME # Put here the path of your TLS cert
CERTPATH = config.AWS_IOT_CERTIFICATE_FILENAME
KEYPATH = config.AWS_IOT_PRIVATE_KEY_FILENAME
while True:
try:
ser = serial.Serial(SERIAL_PORT, 9600)
arduino_connected_status = 1
except:
logger.error("Arduino Not Connected")
arduino_connected_status = 0
time.sleep(1)
if arduino_connected_status == 1:
logger.info("Connected to Arduino")
break
jsonData = {}
counter = 0
'''
Functions to process incoming and outgoing streaming
'''
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("[INFO] Connected to broker")
global connected # Use global variable
connected = True # Signal connection
else:
print("[INFO] Error, connection failed")
def on_publish(client, userdata, result):
# print("Published!")
pass
def connect(mqtt_client, broker_endpoint, port):
global connected
if not connected:
mqtt_client.on_connect = on_connect
mqtt_client.on_publish = on_publish
mqtt_client.tls_set(TLS_CERT_PATH, certfile=CERTPATH,
keyfile=KEYPATH, cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqtt_client.tls_insecure_set(True)
mqtt_client.connect(broker_endpoint, port=port, keepalive=60)
mqtt_client.loop_start()
attempts = 0
while not connected and attempts < 5: # Wait for connection print(connected) print("Attempting
to connect...") time.sleep(1) attempts +=1 if not connected: print("[ERROR] Could not
connect to broker") return False return True def publish(mqtt_client, topic, payload): try:
mqtt_client.publish(topic, payload) except Exception as e: print("[ERROR] Could not publish
data, error: {}".format(e)) def init(): mqtt_client=mqttClient.Client() if not
connect(mqtt_client, BROKER_ENDPOINT, TLS_PORT): return False return True,mqtt_client
connection_status,mqtt_client=init() while 1: if(ser.in_waiting>0):
try:
jsonData = {}
line = ''
line = ser.readline()
line = line.decode('utf-8')
jsonString = json.loads(line)
data = int(line)
TIMESTAMP = datetime.datetime.now()
jsonData['DATA'] = data
jsonData['TIMESTAMP'] = TIMESTAMP
jsonData['TOPIC'] = TOPIC
jsonData['DID'] = DID
jsonStringForIoT = json.dumps(jsonData,default=str)
logger.info(jsonStringForIoT)
code = publish(mqtt_client,TOPIC,jsonStringForIoT)
except:
logger.error("No data over Serial")
In this post, I’ve shown you how to connect your Load Cell to AWS IoT Core over MQTT on port 8883 and sniffing data from PLC. If you have had a constraint in the past to open port 8883 in your corporate firewalls, you can now use a standard port for HTTPS traffic (443) to send your messages over MQTT to AWS IoT Core endpoint.
In next part, we are going create AWS IoT Rule to forward data to Kinesis Data Stream. Also, to setup backend and frontend to show real time graph based on sensor data.
Hope you are doing well. Goodbye for now. Let's meet in next part of this project.