Introduction: Moodstat
In cooperation with keiningenieur ♥
Haptic mood tracker that shows your current mood and statistics on a website. To give your friends subtle hints on when to bother you.
Supplies
- ESP Lolin V3
- Ultrasonic Distance Sensor
- LED Strip
- Wooden Box
- Anet A8 Heatbed Spring (6mm x 25mm)
Step 1: 3D Print
3D Print the thumbs, button brackets, power jack holder and sensor cover.
Step 2: Wood Box
Cut 3 holes with a diameter of 32 mm into the wooden box and an opening for the distance sensor.
Step 3: Assemble
Screw the button holders into place and insert the springs.
Step 4: Electronic
Assemble the electronic as shown.
Attachments
Step 5: Glue
Glue everything in place.
Step 6: ESP Code
Insert your WiFi name and password, as well as a custom session ID and the fingerprint of your website. Upload the ESP Code.
#include <FastLED.h> #include <ESP8266HTTPClient.h> #include <WiFiClientSecure.h> #include <ESP8266WiFi.h> // Distance #define TRIG_PIN 16 #define ECHO_PIN 5 // Led #define LED_BACK 0 #define NUM_LEDS 20 // Button #define BUTTON_GOOD 14 #define BUTTON_MED 13 #define BUTTON_BAD 12 // Variables float duration_us, distance_cm; CRGB leds[NUM_LEDS]; const char* ssid = ""; const char* password = ""; const char* fingerprint = ""; void setup() { Serial.begin (9600); // Distance pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); // Led pinMode(LED_BACK, OUTPUT); FastLED.addLeds<WS2812, LED_BACK, GRB>(leds, NUM_LEDS); // Button pinMode(BUTTON_GOOD, INPUT_PULLUP); pinMode(BUTTON_MED, INPUT_PULLUP); pinMode(BUTTON_BAD, INPUT_PULLUP); // WiFi delay(4000); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); // Wait till WiFi is connected Serial.println("Connecting WLAN"); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("Connected WLAN"); } void sendData(String moodData) { // Check if Wifi is still connected if (WiFi.status() == WL_CONNECTED) { HTTPClient https; BearSSL::WiFiClientSecure testclient; testclient.setInsecure(); https.begin(testclient, "https://moodstat.0xffd700.com/esppost.php"); https.addHeader("Content-Type", "application/x-www-form-urlencoded"); String mood = "mood=" + moodData + "&ids=<session id>"; int httpResponseCode = https.POST(mood); // Get POST return if (httpResponseCode > 0) { String response = https.getString(); Serial.println("HTTP code:"); Serial.println(httpResponseCode); Serial.println("Answer:"); Serial.println(response); } else { Serial.print("Error: "); Serial.println(httpResponseCode); } https.end(); } else { Serial.println("Disconnected WLAN"); } } void loop() { // Trigger puls for Distance digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); duration_us = pulseIn(ECHO_PIN, HIGH); distance_cm = 0.017 * duration_us; Serial.print("distance: "); Serial.print(distance_cm); Serial.println(" cm"); // if a person stands close to Moodstat if (distance_cm < 25) { Serial.print("Background Led an\n"); for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB(255, 255, 255); FastLED.show(); } } else { Serial.print("Background Led aus\n"); for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB(0, 0, 0); FastLED.show(); } } // waits for button to be pressed // GOOD if (digitalRead(BUTTON_GOOD) == LOW) { Serial.print("GOOD"); for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB(0, 255, 0); FastLED.show(); } sendData("2"); delay(10000); } // MEDIUM else if (digitalRead(BUTTON_MED) == LOW) { Serial.print("MED"); for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB(255, 128, 0); FastLED.show(); } sendData("1"); delay(10000); } // BAD else if (digitalRead(BUTTON_BAD) == LOW) { Serial.print("BAD"); for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB(255, 0, 0); FastLED.show(); } sendData("0"); delay(10000); } delay(500); }
Attachments
Step 7: Webserver
Change the session ID in esppost.php and upload it and the Moodweb files to your web server.
<?php // Filters out GET requests if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Mood parameter $mood = $_POST["mood"]; $ids = $_POST["ids"]; // Validate SessionId if ($ids == <session id>) { //Get date date_default_timezone_set('Europe/Berlin'); $Date = date("Y-m-d"); $Time = date("h:i"); $File = date("Y").".csv"; //Validate Userinput if ($mood === "0" || $mood === "1" || $mood === "2") { //Date,Time,Mood $stringData = $Date.",".$Time.",".$mood.PHP_EOL; //Append to File $fp = fopen($File, 'a') or die("can't open file"); fwrite($fp, $stringData); fclose($fp); } else { echo "Wrong Input"; } } } ?>