#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include "HX711.h"
#include <ArduinoJson.h>
// Replace with your network credentials (STATION)
#define ssid "Wokwi-GUEST"
#define password ""
// AWS IoT settings
const char* aws_endpoint = "a3h6hikkeop485-ats.iot.us-east-1.amazonaws.com";
const char* topic = "esp32/hx711/weight"; // Your defined topic
// Thing certificate and private key
const char* certificate = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIVALpsvR2+BhTRbKFGExz/263UNdTuMA0GCSqGSIb3DQEB
CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t
IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0yNDA1MTYxODA0
MzRaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh
dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCu9oGpZbk7WAkYmFYm
0ATtoLIn/h28ge+8L68FWr/13GbC0JAhyg4oIFM3GbTjr/Plw5GDj4U31dW+rzGr
XKGbJXNgX9VdJgZ6oc6bJ4dM6wbfCk/jrq8j5AvUhUj6wbGLK/nEvYvMCnVikatP
ZuvbZWLupn0jc9zCA/1YnPEb6SzGoo3PMkt9cr2dFUcyt+pYZ+ddyVc/LMgzv/Hk
gQrnyd0w2IGOJJHAe0mJjeV9DySECXDziGhPsf265ktnLkHYV6PynrcAj9RM06y/
9W9N06dKYB9yESo1wtaKzz/IsBr62aWucyeJ0YcAgpFW8NTBqqijZji6b/X4u1oS
C90RAgMBAAGjYDBeMB8GA1UdIwQYMBaAFFIiNcKhkL/Va4ezum7U+euR2zKCMB0G
A1UdDgQWBBR/zRVqx5HrQXsITYIekyCZb+++3zAMBgNVHRMBAf8EAjAAMA4GA1Ud
DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEASPqp2e8niplXG00lITkqX1aX
ssD3e+sBtEF+9RTo3s7G2x5Mg6+QP6/v0VLaD1wt3pCN/MFXVFR7iOtoh2TRM8s3
r0bIPhoBZzgbDIz+m421V4SeKumdb6qrUAp3/9TgrcJ7Z5IQg8vd3kW3YXwmmWx2
093obJWE+5V+GcjQ/5UMirVv8kHkLTMeshtuy7Z4CW5nDDxhdg3zuRfZQ7TnZpo8
/g2A7OjRpowa0H4u+5cQ9js8d34WDPY+aREJzs1zKdBNcv2+njg1o8IWNvSzg5oW
ITjTehkDwazOoAeAeYxfVQzC9i32/1e9biccmNKKMkPD9YB1utI4TBgeom6QXA==
-----END CERTIFICATE-----
)KEY";
const char* private_key = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArvaBqWW5O1gJGJhWJtAE7aCyJ/4dvIHvvC+vBVq/9dxmwtCQ
IcoOKCBTNxm046/z5cORg4+FN9XVvq8xq1yhmyVzYF/VXSYGeqHOmyeHTOsG3wpP
466vI+QL1IVI+sGxiyv5xL2LzAp1YpGrT2br22Vi7qZ9I3PcwgP9WJzxG+ksxqKN
zzJLfXK9nRVHMrfqWGfnXclXPyzIM7/x5IEK58ndMNiBjiSRwHtJiY3lfQ8khAlw
84hoT7H9uuZLZy5B2Fej8p63AI/UTNOsv/VvTdOnSmAfchEqNcLWis8/yLAa+tml
rnMnidGHAIKRVvDUwaqoo2Y4um/1+LtaEgvdEQIDAQABAoIBAQCsv++eFjYiBfZV
NnQ5tkJnbbb6DcnGinTuVhZ1LvlCA+/igpMNCbeYnvILAXK9LMmgHszaHSbnzlZR
BCIClF9sFDoq+fRtGFJlWsXoI8tPgu8x4binkZ6TzWJw33kDPaPTSgQ+4Pfa6qik
PjfrGi/eW+imwfPkwU1CszW9/JeDecEPDRo/Yx2unz61o1QM5XB3PmlrSYT+1+ly
+9/jAczVN5Kbl+hFbB14X9HySsSvx7vz8utxp6rAZ8fHihDWB2/LFtIiVyQUZWZV
pZNCUXz15HMbG8B8QmAGT7V3X9Kzpy4YwaGvymwaBggC8jkwKnE4E9qH4HnLS5z9
YOnWioHRAoGBANkqAPEW3X7EdHhSPjpOwARHeJzNpgMLtYBC7pyByRRtZm5en0RZ
1M4K0wMbFwveZGiNgqRQx+QCyIDnTltHEWEI5k/85loLuWHHlKoEBFLPKw17woyS
iob43hagV9h5+S4t180gHr7GfN45XmVB6T3HN8BvW8JpZ1VVBN6K6P0bAoGBAM5A
fW5mBTY8hsV0e7O/bDTjMHSqngjLNSnMblJFxKOjb8r5HIBkSo/95J9Lxe5rZHj6
L8O9Z5xWlj9po2TNZRB3DNGnGMprWEOqqBm6a3DgMqtf4Ivk8Uvt0UEVKDEHr05o
xexMxD6WeXG4FTug7G2+kCQmMq67vFWX/q3SWc1DAoGBAKZ+47Xzt+HnMPzG4VrG
4cTmHvzpVmxjX8Z0ioiHoOj+b1gTR7yZuuQ1vE5XSLYazZSzWgQswvR3hc3+iT7G
H/brYdjVpq5G6tyircIjzkTG/NUbm6828upEh9GFIZSg/4B+OUPVan0NpNKj3VF4
1SA+SupI9mr5cPYldtRAYB0dAoGBALSAlgVm/Yqwv9XQkm4FyeIjLgX8R6A0jwtM
oQQZkPURFMZS61Gl8+c+cLXEb62viNejROgOO74DvSwz/E48vwUA21Qj47tK5I0b
rlAN6Pd5Dn8SwoZLz6z+rVJC/NCkBBUf9o9Nw7VupUwTqWls9V06GBW65EIthK53
/egLnpHXAoGARIVd+lF+jKyzbMufuPpqZQB5EJMIu+pWj9S+Ckp6HrFuKuAZDkzr
loigvn0Kb73XVb/nNexTyziUJMG+cEAyxtUGN7OIA0J39fVpNKyYN7e32fxJdjQb
4KN/fH8/pW9I575hyV673abYTTsO7jj7NgBjWPYmJbC4xkHRmVXAeSU=
-----END RSA PRIVATE KEY-----
)KEY";
const char* ca_cert = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
)KEY";
// HTTP settings
const int httpsPort = 443;
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 19;
const int LOADCELL_SCK_PIN = 18;
HX711 scale;
void setup() {
Serial.begin(57600);
Serial.println("HX711");
Serial.println("Initializing the scale");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(); // Set the scale to 0 initially
scale.tare(); // Reset the scale to 0
initWiFi();
Serial.println("Place a known weight on the scale...");
delay(10000); // Wait for 10 seconds to place the weight
float known_weight = 100.0; // Change this to the actual known weight in grams
long reading = scale.get_units(10); // Get the average reading for 10 samples
float scale_factor = reading / known_weight;
scale.set_scale(scale_factor); // Set the scale factor
Serial.print("Scale factor: ");
Serial.println(scale_factor);
}
void initWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void sendToAWS(float weight) {
WiFiClientSecure client;
client.setCACert(ca_cert);
client.setCertificate(certificate);
client.setPrivateKey(private_key);
if (!client.connect(aws_endpoint, httpsPort)) {
Serial.println("Connection to AWS IoT failed!");
return;
}
HTTPClient https;
https.begin(client, String("https://") + aws_endpoint + String("/topics/") + topic + String("?qos=1"));
https.addHeader("Content-Type", "application/json");
StaticJsonDocument<200> jsonDoc;
jsonDoc["weight"] = weight;
String requestBody;
serializeJson(jsonDoc, requestBody);
int httpResponseCode = https.POST(requestBody);
if (httpResponseCode > 0) {
Serial.printf("HTTP Response code: %d\n", httpResponseCode);
} else {
Serial.printf("Error code: %d\n", httpResponseCode);
}
https.end();
}
void loop() {
float weight = scale.get_units(10);
Serial.print("one reading:\t");
Serial.print(weight, 1);
Serial.print("\t| average:\t");
Serial.println(weight, 5);
sendToAWS(weight);
delay(5000);
}