In our previous two guides, we discussed how to create graph on IBM Watson IoT Dashboard, also provided code for DH11 sensor and in last guide how to use Pulse Monitor amped with ESP32 was shown with minimal theory. Here is Simple ESP32 Arduino IBM Watson IoT Pulse Sensor With Easy Coding and Default Graphing Widgets of IBM Watson IoT. It is important to realize that I am using a cheap China pulse monitor which definitely not a great piece of hardware to keep analog data smooth, also our code does not include PulseSensor library, hence while IBM Watson IoT dashboard will add filter to smoothen jitter, the pattern will be lost. We can advice the new readers to read our linked guides (and linked guides from them) to get started with our basic codes with IBM Watson IoT instead of this slight complex one.
ESP32 Arduino IBM Watson IoT Pulse Sensor Code
As because everything around how to setup IBM Watson IoT and how to setup ESP32 Arduino with Pulse Sensor has been discussed via other linked articles, in this guide we will only provide the required code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /** * A simple IBM IoT example for testing Pulse Sensor monitor * Onboard LED on pin 2 will blink with each heart beat detected * Pulse Sensor's data pin attached to pin 34 * Serial monitor will give required output * Base code written by Abhishek Ghosh, https://thecustomizewindows.com/ * Needs below 2 steps : * (1) On IBM IoT dashboard, go to Security > Connection Security > TLS Optional * (2) Install the required libraries such as PubSubClient library from Arduino IDE * Adding LED on pin 4 is optional * * On IBM Watson IoT dashboard, create a new card to graph pulse */ uint32_t delayMS; #include <WiFi.h> #include <WiFiClient.h> #include <PubSubClient.h> // Variables int PulseSensorPurplePin = 34; // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 34 int LED13 = 2; // The on-board ESP32 LED int Signal; // holds the incoming raw data. Signal value can range from 0-1024 int Threshold = 2550; // Determine which Signal to "count as a beat", and which to ingore. // 2550 is a value after trial & error. It can be 550 for your thing. // <------- CHANGE PARAMETERS BELOW THIS LINE ------------> const char* ssid = "YOUR-HOTSPOT-NAME"; const char* password = "YOUR-HOTSPOT-PASSWORD"; #define ORG "YOUR-ORG-NAME-ON-IBM-DASHBOARD" #define DEVICE_TYPE "YOUR-SET-DEVICE-TYPE" #define DEVICE_ID "YOUR-SET-DEVICE-TYPE" #define TOKEN "YOUR-SET-TOKEN-OR-AUTOGENERATED-TOKEN" // <------- CHANGE PARAMETERS ABOVE THIS LINE ------------> char server[] = ORG ".messaging.internetofthings.ibmcloud.com"; char pubTopic[] = "iot-2/evt/status/fmt/json"; char subTopic[] = "iot-2/cmd/test/fmt/String"; char authMethod[] = "use-token-auth"; char token[] = TOKEN; char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID; WiFiClient wifiClient; PubSubClient client(server, 1883, NULL, wifiClient); void receivedCallback(char* pubTopic, byte* payload, unsigned int length) { Serial.print("Message received: "); Serial.println(pubTopic); Serial.print("payload: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); /* we got '1' -> on */ } // The SetUp Function: void setup() { pinMode(LED13,OUTPUT); // pin that will blink to your heartbeat! Serial.begin(115200); // Set's up Serial Communication at certain speed. Serial.println("IBM Watson IoT ESP32 Pulse Monitor Amped"); // just a funky text Serial.print("Connecting to "); Serial.print(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP()); if (!client.connected()) { Serial.print("Reconnecting client to "); Serial.println(server); while (!client.connect(clientId, authMethod, token)) { Serial.print("."); delay(500); } client.setCallback(receivedCallback); if (client.subscribe(subTopic)) { Serial.println("subscribe to cmd OK"); } else { Serial.println("subscribe to cmd FAILED"); } Serial.println("IBM Watson IoT connected"); } } long lastMsg = 0; long pulse = 0; // The Main Loop Function void loop() { Signal = analogRead(PulseSensorPurplePin); // Read the PulseSensor's value. // Assign this value to the "Signal" variable if(Signal > Threshold){ // If the signal is above "2550", then "turn-on" ESP32's on-Board LED. digitalWrite(LED13,HIGH); } else { digitalWrite(LED13,LOW); // Else, the sigal must be below "2550", so "turn-off" this LED. } client.loop(); long now = millis(); if (now - lastMsg > 3000) { lastMsg = now; pulse = (Signal); String payload = "{\"d\":{\"Name\":\"" DEVICE_ID "\""; payload += ",\"pulse\":"; payload += pulse; payload += "}}"; Serial.print("Sending payload: "); Serial.println(payload); // Serial.println(Signal); // Send the Signal value to Serial Plotter for debug if (client.publish(pubTopic, (char*) payload.c_str())) { Serial.println("Publish ok"); } else { Serial.println("Publish failed"); } } delay(10); } |
We have kept the above code on our GitHub repo for IBM Watson IoT (see under Pulse-Monitor).
---