Skip to content

Commit

Permalink
Merge pull request #35 from jphacks/feature/next_api
Browse files Browse the repository at this point in the history
Feature/next api
  • Loading branch information
Hayatto9217 authored Nov 11, 2023
2 parents 65febd0 + d466ce8 commit ad91204
Show file tree
Hide file tree
Showing 4 changed files with 237 additions and 163 deletions.
269 changes: 123 additions & 146 deletions arduino/src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,55 +1,32 @@
#include <Arduino.h>
#include <M5Core2.h>

// put function declarations here:
// Unified Sensor Library Example
// Written by Tony DiCola for Adafruit Industries
// Released under an MIT license.

// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Arduino.h>
#include <ArduinoJson.h>
#include <ESPAsyncWebServer.h>
#include <HTTPClient.h>
#include <M5StickC.h>

#include <config.h>
#include <secret.h>
AsyncWebServer server(80);

#define DHT1 27
#define DHT2 19
#define DHT3 25
#define FAN 26
// 25, 27, 32
AsyncWebServer server(80);

#define DHTTYPE DHT22 // DHT 22 (AM2302)
StaticJsonDocument<192> json_doc;
HTTPClient http_session;
HTTPClient http_sensor;

DHT_Unified ShoesSensor1(DHT1, DHTTYPE);
DHT_Unified ShoesSensor2(DHT2, DHTTYPE);
DHT_Unified RoomSensor(DHT3, DHTTYPE);
const int update_interval_sec = 30;

uint32_t delayMS;
HTTPClient http;
bool drying = false;

float ShoesTemp1, ShoesTemp2, RoomTemp;
float ShoesHumi1, ShoesHumi2, RoomHumi;
long long timer = 0;

int count = 0;
float RoomTemp, RoomHumi, ShoeTemp, ShoeHumi;

void setup() {
M5.begin();
// Serial.begin(115200);
// Initialize device.
ShoesSensor1.begin();
ShoesSensor2.begin();
RoomSensor.begin();
sensor_t sensor;
delayMS = sensor.min_delay;
pinMode(FAN, OUTPUT);
json_doc["device_id"] = DEVICE_ID;

digitalWrite(FAN, 1);
M5.begin();
Serial.begin(115200);

// WiFi Setup

Expand All @@ -63,138 +40,138 @@ void setup() {
// Serial.println("Connecting to WiFi...");
M5.Lcd.fillScreen(BLACK); // 画面の塗りつぶし
M5.Lcd.setCursor(0, 0); // 文字列の書き出し位置
M5.Lcd.setTextSize(3); // 文字サイズを設定
M5.Lcd.setTextSize(1); // 文字サイズを設定
M5.Lcd.printf("Connecting to WiFi..."); // シリアルモニタ
}
// Serial.println("Connected to WiFi");
M5.Lcd.fillScreen(BLACK); // 画面の塗りつぶし
M5.Lcd.setCursor(0, 0); // 文字列の書き出し位置
M5.Lcd.setTextSize(3); // 文字サイズを設定
M5.Lcd.printf("Connected to WiFi");

M5.Lcd.fillScreen(BLACK); // 画面の塗りつぶし
M5.Lcd.setCursor(0, 0); // 文字列の書き出し位置
M5.Lcd.setTextSize(1); // 文字サイズを設定
M5.Lcd.printf("WiFi Success"); // シリアルモニタ

// リクエストに応じてJSON形式のデータを返すエンドポイントの設定
server.on("/data", HTTP_GET, [](AsyncWebServerRequest *request) {
String jsonData = "";
jsonData += "{\n";
jsonData += " \"sensor1\": {\n";
jsonData += " \"temperature\": " + String(ShoesTemp1, 2) + ",\n";
jsonData += " \"humidity\": " + String(ShoesHumi1, 2) + "\n";
jsonData += " },\n";
jsonData += " \"sensor2\": {\n";
jsonData += " \"temperature\": " + String(ShoesTemp2, 2) + ",\n";
jsonData += " \"humidity\": " + String(ShoesHumi2, 2) + "\n";
jsonData += " },\n";
jsonData += " \"sensor3\": {\n";
jsonData += " \"temperature\": " + String(RoomTemp, 2) + ",\n";
jsonData += " \"humidity\": " + String(RoomHumi, 2) + "\n";
jsonData += " }\n";
jsonData += "}\n";
request->send(200, "application/json", jsonData);
char exporter_plain_json[1536];
serializeJson(json_doc, exporter_plain_json, sizeof(exporter_plain_json));

request->send(200, "application/json", exporter_plain_json);
});

// サーバーの開始
server.begin();
}

int send_to_server(int id, bool status) {
http.begin(HOST_URL);
http.addHeader("Content-Type", "application/json");
int st = http.POST("{\"id\":" + String(id) + ",\"status\":" + String(status) +
"}");
http.end();
return st;
String get_session_id() {
String url =
String(HOST_URL) + String("/api/session/?device_id=") + String(DEVICE_ID);
http_session.begin(url);

int httpCode = http_session.GET();
String payload = http_session.getString();
http_session.end();

StaticJsonDocument<96> resp_json;

DeserializationError error = deserializeJson(resp_json, payload);

if (!error) {
const char *sessionID = resp_json["session_id"];
Serial.println("Session ID: " + String(sessionID));
return String(sessionID);
} else {
Serial.println("Failed to parse JSON");
return "";
}
}

int speed = 1;
int send_to_server(StaticJsonDocument<192> doc) {
char sender_plain_json[1536];
serializeJson(doc, sender_plain_json, sizeof(sender_plain_json));

void fan_on(int sp = 1) { speed = sp; }
void fan_off() { speed = 0; }
void fan_run() { digitalWrite(FAN, speed); }
// void fan_run() { analogWrite(FAN, speed); }
String url = String(HOST_URL) + String("/api/sensor/");
http_sensor.begin(url);

long long timer = 0;
http_sensor.addHeader("Content-Type", "application/json");

void loop() {
if (millis() - timer > delayMS) {
timer = millis();
int st =
http_sensor.POST((uint8_t *)sender_plain_json, strlen(sender_plain_json));

Serial.println(WiFi.localIP());
// Delay between measurements.
http_sensor.end();
return st;
}

// Get temperature event and print its value.
sensors_event_t event;
// ShoesSensor1
void insert_value() {
json_doc["external_temperature"] = RoomTemp;
json_doc["external_humidity"] = RoomHumi;

ShoesSensor1.temperature().getEvent(&event);
if (isnan(event.temperature)) {
// Serial.println(F("Error reading temperature!"));
M5.Lcd.printf("Error reading ShoesTemp1!");
} else {
ShoesTemp1 = event.temperature;
}
// Get humidity event and print its value.
ShoesSensor1.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
// Serial.println(F("Error reading humidity!"));
M5.Lcd.printf("Error reading ShoesHumi1!");
} else {
ShoesHumi1 = event.relative_humidity;
}
json_doc["internal_temperature"] = ShoeTemp;
json_doc["internal_humidity"] = ShoeHumi;
}

// ShoesSensor2
ShoesSensor2.temperature().getEvent(&event);
if (isnan(event.temperature)) {
// Serial.println(F("Error reading temperature!"));
M5.Lcd.printf("Error reading ShoesTemp2!");
} else {
ShoesTemp2 = event.temperature;
}
// Get humidity event and print its value.
ShoesSensor2.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
// Serial.println(F("Error reading humidity!"));
M5.Lcd.printf("Error reading ShoesHumi2!");
} else {
ShoesHumi2 = event.relative_humidity;
}
bool is_drying() {
if (abs(ShoeTemp - RoomTemp) < GAP_TEMP && (ShoeHumi - RoomHumi) > GAP_HUM) {
return true;
} else {
return false;
}
}

void main_func() {
insert_value();
bool current_drying = is_drying();

// RoomSensor
RoomSensor.temperature().getEvent(&event);
if (isnan(event.temperature)) {
// Serial.println(F("Error reading temperature!"));
M5.Lcd.printf("Error reading RoomTemp!");
if (drying) { // 乾燥実行中
if (current_drying) {
// 靴が湿気ている
send_to_server(json_doc);
} else {
RoomTemp = event.temperature;
// 靴が湿気ていない
drying = false;
json_doc["drying"] = drying;
send_to_server(json_doc);
}
// Get humidity event and print its value.
RoomSensor.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
// Serial.println(F("Error reading humidity!"));
M5.Lcd.printf("Error reading RoomHumi!");
} else {
RoomHumi = event.relative_humidity;
} else { // 乾燥未実行
if (current_drying) {
// 靴が湿気ている
drying = true;

json_doc["drying"] = drying;
json_doc["session_id"] = get_session_id();
send_to_server(json_doc);
}
// Serial.printf("Temperature: %f *C \t Humidity: %f %% \n", ShoesTemp1,
// ShoesHumi1);
M5.Lcd.fillScreen(BLACK); // 画面の塗りつぶし
M5.Lcd.setCursor(0, 0); // 文字列の書き出し位置
M5.Lcd.setTextSize(3); // 文字サイズを設定
M5.Lcd.printf("ShoesTemp1: %f *C \t ShoesHumi1: %f %% \n", ShoesTemp1,
ShoesHumi1);
M5.Lcd.printf("ShoesTemp2: %f *C \t ShoesHumi2: %f %% \n", ShoesTemp2,
ShoesHumi2);
M5.Lcd.printf("RoomTemp: %f *C \t ShoesHumi2: %f %% \n", RoomTemp,
ShoesHumi2);

if (abs(ShoesTemp1 - RoomTemp) < GAP_TEMP &&
(ShoesHumi1 - RoomHumi) > GAP_HUM) {
fan_on();
send_to_server(DEVICE_ID, true);
} else {
fan_off();
send_to_server(DEVICE_ID, false);
}
}

void sample() {
Serial.println(WiFi.localIP());

drying = true;
json_doc["drying"] = drying;

json_doc["session_id"] = get_session_id();

for (int i = 0; i < 5; i++) {
RoomTemp = random(2000, 2500) / 100.00;
ShoeTemp = random(2000, 2500) / 100.00;

RoomHumi = random(0000, 4000) / 100.00;
ShoeHumi = random(4000, 10000) / 100.00;

insert_value();
if (i == 4) {
drying = false;
json_doc["drying"] = drying;
}
};
Serial.println(send_to_server(json_doc));

fan_run();
delay(2000);
}
}

void loop() {
if (millis() - timer > update_interval_sec * 1000) {
timer = millis();

sample();
}
}
57 changes: 57 additions & 0 deletions doc/arduino/include.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Arduino 版の簡単な説明

## include

### config.h

- デバイスやセンサの設定を記述する
- base_config.h コピーし,config.h として利用する
- 基本的に値をいじらなくても何とかなる
- センサの設定
- それぞれ,温度と湿度の条件判定に利用する

``` cpp
#define GAP_TEMP 1.0
#define GAP_HUM 15.0
```

- デバイス IDID

``` cpp
const int DEVICE_ID = 1;
```

### secret.h

- WiFi の接続情報など,機密情報を記述する
- base_secret.h コピーし,secret.h として利用する

#### WiFi の接続設定(必須部分)

- WiFi の SSID とパスワードを記述する

``` cpp
#define WIFI_SSID ""
#define WIFI_PASSWORD ""
```

#### WiFi で固定IPアドレスを用いる際に設定する部分(任意)

- STATAIC_IP を 1 にする
- 以下の形式で,IPアドレス,ゲートウェイ,サブネットマスクをそれぞれ設定する

``` cpp
#define STATIC_IP 0
const IPAddress ip(192, 168, 10, 89);
const IPAddress gateway(192, 168, 10, 1);
const IPAddress subnet(255, 255, 255, 0);
```

#### サーバとの接続部分

- サーバのURLを記述する
- 例:<https://example.com>

``` cpp
#define HOST_URL ""
```
Loading

0 comments on commit ad91204

Please sign in to comment.