超小型ボードM5Atom Liteをつかう その5:POSTのアクションをうけとる

shuzo-kino.hateblo.jp
の続き

WEBサーバがたてられるなら、POSTアクションもいけるのが道理。
設定値の書き換えを模したものをつくります、

実際のところ

前回の記事をベースに、handleRootを改編する形で。
なんか記述が冗長な気がしますが、後で見返して確実に再現できる気もしないので……。

const char* ssid = "ssid";
const char* password = "pass";

void handleRoot() {
 if (server.method() == HTTP_POST) {
   String buff_ssid = server.arg("ssid");
   String buff_pass = server.arg("pass");
   if (buff_ssid && buff_pass) {
    Serial.print("ssid:\t");
    Serial.println(buff_ssid);
    Serial.print("pass:\t");
    Serial.println(buff_pass);
   }
 }
 String mes = "";
 mes += "<html>";
 mes += "<meta charset='utf-8'>";
 mes += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
 mes += "<head><title>Config Page</title></head>\n";
 mes += "<body style='font-family: sans-serif; background-color: #ffeeaa ;' >\n";
 mes += "<h1>User Config</h1>\n";
 mes += "<p>\n";
 //wifi form
 mes += "<form action='' method='post'>";
 mes += "<div>";
 mes += "<label for='inputssid'>ssid</label>";
 mes += "<input id='inputssid' type='text' name='ssid' value='";
 mes += ssid;
 mes += "'>";
 mes += "</div>\n";
 mes += "<div>";
 mes += "<label for='inputpass'>psss</label>";
 mes += "<input id='inputpass' type='password' name='pass' value='";
 mes += password;
 mes += "'>";
 mes += "</div>\n";

 mes += "<div>";
 mes += "<input type='submit' value='send' accesskey='s'>";
 mes += "</div>\n";
 mes += "</form>\n";
 mes += "</p>\n";
 mes += "</body>\n";
 mes += "</html>\n";

 server.send(200, "text/html", mes);
}

前回mDNSで割り付けたURLのROOTをみると……
http://m5atom.local/
初期値に設定した値が反映された状態で、ページが表示されます。
f:id:shuzo_kino:20210225001100p:plain

コンソールをみると

ssid:	ssid
pass:	pass

蛇足

HTML書くのがあまりに久しぶりすぎて、FormにPOSTアクションを割り付けずURLオプションにSSIDだのPASSだのがぶら下がるだけのクソ雑魚状況を延々とやっていました。
……使わない技術も、定期的になにか作って勘戻さないとダメですね。

超小型ボードM5Atom Liteをつかう その4:mDNSをつかって社内ネットワークから内部データ

shuzo-kino.hateblo.jp
の続き。

実際のところ

シンプルな文字配信

サンプルをもとに、200と404には対応したサーバーを用意。
SSIDやPASSは今使っているWiFiのを設定してください。

#include "M5Atom.h"

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>

const char* ssid = "ssid";
const char* password = "pass";

WebServer server(80);

void handleRoot() {
  server.send(200, "text/plain", "hello from esp32!");
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void) {
  M5.begin(true, false, true);
  delay(500);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("m5atom")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}

同一のWiFiで繋げる

http://m5atom.local

にアクセスすると……"hello from esp32!"が出てくるという塩梅。

参考もと

developer.mozilla.org

【読書メモ】デザイナーじゃないのに!

ストーリー仕立てでデザインの考え方を学ぶ本。
類似書だと、いい例わるい例を並べて、これだから良くなってる……という説明の仕方ですが
こちらの本は同じテーマを段階的に良くしていくのが斬新に感じました。

【読書メモ】もりもりホットサンドと野菜ごろごろスープ 元気が出るよ! Kindle版

あるていど仕事がおちついてきたので、冷静になって生活を振り返っています。
生活は全面的に崩壊しているのですが、特に問題なのがメシ代。
自炊をしていた学生時代の3倍のコストがかかっていながら、満足度は標準以下。
このままでは高いカネはらいながら、味覚に緩やかな死を強要しているような勢いです。

これではマズいと、手軽で効果の高い何かと採用を思い立ったのがネットの飯テロでよく見かけるホットサンドメーカー
断片的な知識から想像するに、表面カリカリに焼けば水分もいくらか飛ぶので、持ち運びも可能。
朝焼いてカバンに突っ込んで、昼のコンビニ弁当を代替すれば中々QoLはあがりそうです。
喰い切れば弁当と違って洗う手間もないですしね、たぶん。
……でも、パエリアプレートよろしく専業調理器具と化すような代物では流石に躊躇してしまいます。

レシピ本がないかと探したら、本誌がでてました。
正確には、ホットサンドと、スープのレシピ本。
タイトルみたときホットサンドメーカーでスープ作るのかと思いましたが、流石に違いました。

中身は巷のキラキラ・フォトジェニックとは真逆のジャンク系。
ケッタイな謎調味料などなくとも作れるレシピが多いです。
タマゴ、肉、チーズ!
限界独身男性な私も夢膨らむ素敵な写真の数々。
これなら、少しは楽しくなる……かも?

超小型ボードM5Atom Liteをつかう その3:EEPROMの切り分け

shuzo-kino.hateblo.jp
の続き。

EEPROM手打ちしてもいいですが、保存領域の値を分離したりします。
たとえば、初期設定値の領域はそのままにしたいけど、
センシング領域は一定タイミングでクリアしたい……とか。

実際のところ

そのまんまサンプル写経。

/*
  ESP32 eeprom_class example with EEPROM library
  This simple example demonstrates using EEPROM library to store different data in
  ESP32 Flash memory in a multiple user-defined EEPROM class objects.
  
  Created for arduino-esp32 on 25 Dec, 2017
  by Elochukwu Ifediora (fedy0)
  converted to nvs by lbernstone - 06/22/2019
*/

#include "EEPROM.h"

// Instantiate eeprom objects with parameter/argument names and sizes
EEPROMClass  NAMES("eeprom0", 0x500);
EEPROMClass  HEIGHT("eeprom1", 0x200);
EEPROMClass  AGE("eeprom2", 0x100);

void setup() {
  Serial.begin(115200);
  Serial.println("Testing EEPROMClass\n");
  if (!NAMES.begin(NAMES.length())) {
    Serial.println("Failed to initialise NAMES");
    Serial.println("Restarting...");
    delay(1000);
    ESP.restart();
  }
  if (!HEIGHT.begin(HEIGHT.length())) {
    Serial.println("Failed to initialise HEIGHT");
    Serial.println("Restarting...");
    delay(1000);
    ESP.restart();
  }
  if (!AGE.begin(AGE.length())) {
    Serial.println("Failed to initialise AGE");
    Serial.println("Restarting...");
    delay(1000);
    ESP.restart();
  }

  const char* name = "Teo Swee Ann";
  char rname[32];
  double height = 5.8;
  uint32_t age = 47;

  // Write: Variables ---> EEPROM stores
  NAMES.put(0, name);
  HEIGHT.put(0, height);
  AGE.put(0, age);
  Serial.print("name: ");   Serial.println(name);
  Serial.print("height: "); Serial.println(height);
  Serial.print("age: ");    Serial.println(age);
  Serial.println("------------------------------------\n");

  // Clear variables
  name = '\0';
  height = 0;
  age = 0;
  Serial.print("name: ");   Serial.println(name);
  Serial.print("height: "); Serial.println(height);
  Serial.print("age: ");    Serial.println(age);
  Serial.println("------------------------------------\n");

  // Read: Variables <--- EEPROM stores
  NAMES.get(0, rname);
  HEIGHT.get(0, height);
  AGE.get(0, age);
  Serial.print("name: ");   Serial.println(rname);
  Serial.print("height: "); Serial.println(height);
  Serial.print("age: ");    Serial.println(age);
  
  Serial.println("Done!");
}

void loop() {
  delay(0xFFFFFFFF);
}

分離できていいこと。

commitやclearは別々に実行できるようなので、
冒頭に書いたように一部を初期値領域、一部をセンサデータの格納といった使い方ができます。

Ubuntu 20.10 on Raspberry Pi 4B にSeleniumの環境を構築してスクレイピング その3:クリックしてダウンロードする

続きものの本丸。
APIなり、あるいはダウンロードキーでも入れてくれてれば楽なのに
今回のターゲットはログインしてボタンクリックしないとダウンロードできない仕様です。
実にダルいので、こいつを何とかやっつけたいと思います。

実際のところ

今書いてまs