I have been working on creating a Weighing scale using a 5 Kg Load Cell and HX711 Amp connected to a MySensor node. I plan to have a dynamic weighing scale for reporting weight of anything kept on the Load cell sensor (Aluminium Bar form factor load cell) . Ideal use case can be a Weight scale node kept in a refrigerator measuring the weight of a Milk bottle. The system will send out notification in case the milk bottle starts running low, which can be a trigger to go shop for groceries when your away from home.
Initial code for calibration of Load cell was taken from this website and then factored into My Sensor code. I have since been able to make a working node in MySensor and able to display weight data in Domoticz. I would like to further refine the code and make it more practical.
Source webiste: [http://circuits4you.com/2016/11/25/hx711-arduino-load-cell/](link url)
I am beginner in MySensor and C/C++ coding so thought it would be best if the My Sensor community can help me out in below objectives:
-
Ideally, I would want the sensor to be battery powered so I have ensured that I run a barebones Atmega 328p on 8 Mhz internal clock. Is it possible that
the sensor node is always in deep sleep consuming min battery power and only wake up if only requested from the Controller (in my case Domoticz). This way
the sensor will only report weight data when asked for and result in minimal battery usage and user can "Query" the node for the weight. Not sure if this will use
an Interrupt function. The readings from the Load Cell sampled every 3 seconds in my code below vary by a very small amount say by .001 gms.
-
Send a keep alive message say every 1 hour and update controller on the Weight.
Any help suggestions are welcome and really appreciate the MySensors Team and Community for being awwsum every time!
Thanks....
Source Code created for the Weight node
#define MY_DEBUG
#define MY_RADIO_NRF24
#define MY_NODE_ID 10
#include <MySensors.h>
#include <SPI.h>
#include "HX711.h"
#define DOUT 3
#define CLK 2
HX711 scale(DOUT, CLK);
float calibration_factor = -465000; //calcuated by trial and error; goal was to ensure Zero weight reading when no weight on the load cell
#define CHILD_ID_WEIGHT 1
unsigned long waitTime = 3000; // delay in milliseconds to set time between data readings
float weight_read;
MyMessage msgVolume(CHILD_ID_WEIGHT, V_LEVEL);
void setup() {
scale.set_scale();
scale.tare();
}
void presentation() {
sendSketchInfo("Weight Sensor", "1.0");
present(CHILD_ID_WEIGHT, S_DUST,"Weight");
}
void loop()
{
data_calc();
{
send(msgVolume.set(weight_read, 3));
}
wait(waitTime); //Wait then back to loop
}
void data_calc() {
scale.set_scale(calibration_factor);
#ifdef MY_DEBUG
Serial.print("Reading: ");
Serial.print(scale.get_units(), 3);
Serial.print(" kg");
weight_read = scale.get_units();
Serial.print(" Weight Read by sensor: ");
Serial.print(weight_read, 3);
Serial.println();
#endif
}
Output in Serial monitor
Starting sensor (RNNNA-, 2.0.0)
TSM:INIT
TSM:RADIO:OK
TSP:ASSIGNID:OK (ID=10)
TSM:FPAR
TSP:MSG:SEND 10-10-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
TSP:MSG:READ 0-0-10 s=255,c=3,t=8,pt=1,l=1,sg=0:0
TSP:MSG:FPAR RES (ID=0, dist=0)
TSP:MSG:PAR OK (ID=0, dist=1)
TSM:FPAR:OK
TSM:ID
TSM:CHKID:OK (ID=10)
TSM:UPL
TSP:PING:SEND (dest=0)
TSP:MSG:SEND 10-10-0-0 s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=ok:1
TSP:MSG:READ 0-0-10 s=255,c=3,t=25,pt=1,l=1,sg=0:1
TSP:MSG:PONG RECV (hops=1)
TSP:CHKUPL:OK
TSM:UPL:OK
TSM:READY
TSP:MSG:SEND 10-10-0-0 s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=ok:0100
TSP:MSG:SEND 10-10-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=ok:2.0.0
TSP:MSG:SEND 10-10-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=ok:0
TSP:MSG:READ 0-0-10 s=255,c=3,t=6,pt=0,l=1,sg=0:M
TSP:MSG:SEND 10-10-0-0 s=255,c=3,t=11,pt=0,l=13,sg=0,ft=0,st=ok:Weight Sensor
TSP:MSG:SEND 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=ok:1.0
TSP:MSG:SEND 10-10-0-0 s=1,c=0,t=24,pt=0,l=6,sg=0,ft=0,st=ok:Weight
Request registration...
TSP:MSG:SEND 10-10-0-0 s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=ok:2
TSP:MSG:READ 0-0-10 s=255,c=3,t=27,pt=1,l=1,sg=0:1
Node registration=1
Init complete, id=10, parent=0, distance=1, registration=1
Reading: 0.000 kg Weight Read by sensor: -0.000
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:-0.000
Reading: 0.001 kg Weight Read by sensor: 0.002
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.002
Reading: 0.229 kg Weight Read by sensor: 0.229
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.229
Reading: 0.229 kg Weight Read by sensor: 0.228
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.228
Reading: 0.229 kg Weight Read by sensor: 0.228
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.228
Reading: 0.228 kg Weight Read by sensor: 0.227
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.227
Reading: 0.229 kg Weight Read by sensor: 0.228
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.228
Reading: 0.227 kg Weight Read by sensor: 0.228
TSP:MSG:SEND 10-10-0-0 s=1,c=1,t=37,pt=7,l=5,sg=0,ft=0,st=ok:0.228
Reading: 0.229 kg Weight Read by sensor: 0.227