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";
}
}
}
?>





