2025年12月31日水曜日

毒書案内:読んではいけない35冊+中国2冊

  1.  〇太宰治『人間失格』人間として生きられない人間の悲惨な生涯
  2. 〇ヨーハン・ヴォルフガング・ゲーテ『若きウェルテルの悩み』善女の顔をした悪女に殉ずる青年の悲劇
  3. ▽ルイス・キャロル『不思議の国のアリス』 少女というトリックスターの異界めぐり 青空電子あり、完遂?
  4. ▽沼正三『家畜人ヤプー』マゾヒストの奇想が構築した倒錯のユートピア 有料電子あり 県で完遂?
  5. 〇安部公房『砂の女』 砂の世界に囚われた失踪者の新しい日常
  6. 〇フランツ・カフカ『審判』自分の知らない罪によって裁かれる恐怖
  7. ▽埴谷雄高『死霊』嗜好の実験室で培養された観念小説の極北 第一巻で挫折。。。
  8. ▽夢野久作『ドグラ・マグラ』読者の現実感覚を崩壊させる記憶の迷宮 世界観を知る意味で代替『瓶詰地獄』を読んだ
  9. 〇アルチュール・ランボー『地獄の季節』 鮮烈なイメージが炸裂する天才の散文詩
  10. 〇フリードリッヒ・ニーチェ『ツァラストゥストラ』 読者の魂を焼き尽くす神なき世界の黙示録
  11. 〇三島由紀夫『金閣寺』 美を滅ぼすことに憑かれた青年僧の告白
  12. 〇大岡昇平『野火』 戦争という狂気が生み出す人肉食の悪夢
  13. 〇ウィリアム・フォークナー『サンクチュアリ』 「聖域」で繰り広げられる変質者の陰惨な暴力
  14. 〇中上健次『千年の愉楽』 「路地」に生まれた若者たちの沸騰する生と死
  15. 〇川端康成『眠れる美女』死臭漂う宿で老人たちが営む性の秘儀
  16. 〇ウラジミール・ナボコフ『ロリータ』中年男を「萌え」させるニンフェットの魔力
  17. 〇江戸川乱歩『芋虫』人間が人間であることの極限に触れた短篇
  18. ジョルジュ・バタイユ『眼球譚(がんきゅうたん)』読者に嫌悪と嘔吐を催させる究極の背徳
  19. @永山則夫『無知の涙』 獄中で自我に目覚めた連続射殺魔の手記 有料電子 県立在庫
  20. @アドルフ・ヒトラー『わが闘争』 世界を破滅へと導いた反ユダヤ思想のバイブル300頁 有料電子 県立在庫
  21. @マルキ・ド・サド『悪徳の栄え』残虐行為の快楽を称揚する悪の哲学 有料電子 県立在庫
  22. @ウィリアム・バロウズ『裸のランチ』 麻薬常習者の錯乱が生み出すおぞましい幻覚 手元あり
  23. @河野多恵子『幼児狩り』幼い男児を物色する女の歪んだ欲望 『ミイラ取り猟奇譚』 手元あり
  24. @ジャン・ジュネ『ブレストの乱暴者』男色泥棒作家 代替『泥棒日記』 手元あり
  25. @ロートレアモン『マルドロールの歌』 野生の言語が繰り広げる荒唐無稽な幻想文学 手元あり
  26. @大江健三郎『われらの時代』 疾走する文体で読者を揺さぶる挑発的作品 手元あり
  27. @ヘンリー・ミラー『北回帰線』性の躍動と欲望の噴出を歌い上げる言葉の奔流! 手元あり
  28. @ライナー・マリア・リルケ『マルテの手記』 パリを彷徨する孤独な青年の心象風景 キンドルで読書中
  29. @原口統三『二十歳のエチュード』少年少女の夭折(ようせつ)願望を刺激する若き魂の記録 キンドルで読書中
  30. @谷崎潤一郎『鍵・瘋癲(ふうてん)老人日記』 観念の世界で欲望を駆り立てる男たちの痴態 Kobo読書中
  31. @島尾敏雄『死の棘(とげ)』 夫婦の愛憎の極限を描く凄惨な私小説 読書中
  32. @フョードル・ドストエフスキー『地下室の手記』 自意識の病を分析する「ニート」の独白 電子もあるが古典新訳で読書中
  33. @ジャン=ジャック・ルソー『孤独な散歩者の夢想』生と死の境界線を消滅させる甘美な思索の書 岩波ワイドで読書中
  34. @トーマス・マン『ヴェニスに死す』少年の妖しい美に魅せられた中年作家の死 古典新訳で読書中
  35. 中国がらみ @エン・レンカ 『四書』 1956年の百花斉放百家争鳴、その後の大躍進政策を風刺するディストピア、一時毛沢東は失脚するも1966年に文化大革命で復権、1977年鄧小平の完全復権にて1989年に天安門事件、2020年に習近平の香港領土化
  36. 中国がらみ @高行健 『ある男の聖書』 文革で紅衛兵だったころの自伝
  37. そのほか 田舎司祭の日記、ミドルマーチ、エジプト、徒然草、テス、マンスフィールド
  38. 購入予定 ラクダのシャンツ、寒い夜、

2025年12月26日金曜日

PICO Wで音出し cf 加速度・角速度は未はんだ(倒立振り子用)メムマイク

 mp3player,audio recorder,human voice synthesizerは成功ずみ,memsマイクは未踏、max98357は2個とも実施後にusb interfaceがあかんようになり再起動必要であきらめた

結局単純なドレミでOK牧場とした

from machine import Pin, PWM

import utime

# GP0をPWM出力に設定

buzzer = PWM(Pin(0))

# 音階と周波数の対応表 (Hz)

notes = {

    'do': 262,

    're': 294,

    'mi': 330,

    'fa': 349,

    'so': 392,

    'la': 440,

    'si': 494,

    'do2': 523

}


def play_tone(frequency, duration):

    if frequency == 0:

        buzzer.duty_u16(0) # 無音(休符)

    else:

        buzzer.freq(frequency) # 周波数を設定

        buzzer.duty_u16(32768) # デューティ比50%で音を鳴らす

    

    utime.sleep_ms(duration)

    buzzer.duty_u16(0) # 音を止める

    utime.sleep_ms(50) # 音の切れ目を作るための短い休止


# ドレミファソラシドを順番に鳴らす

scale = ['do', 're', 'mi', 'fa', 'so', 'la', 'si', 'do2']


for note in scale:

    print(f"Playing: {note}")

    play_tone(notes[note], 400) # 各音を400ms鳴らす


# プログラム終了時に確実に止める

buzzer.deinit()

ーーーーーーーーーちょうちょは以下のごとしーーーーーーーーーーーーーーーーーーーー

from machine import Pin, PWM

import utime


buzzer = PWM(Pin(0))


# ハ長調

notes = {

    'C': 262,

    'D': 294,

    'E': 330,

    'F': 349,

    'G': 392,

    'A': 440,

    'C2': 523,   # 高いド

    'rest': 0

}


def play(f, t):

    if f == 0:

        buzzer.duty_u16(0)

    else:

        buzzer.freq(f)

        buzzer.duty_u16(32768)

    utime.sleep_ms(t)

    buzzer.duty_u16(0)

    utime.sleep_ms(40)


# 🦋 ちょうちょ ちょうちょ

melody = [

    ('G', 400), ('E', 400), ('E', 800),

    ('F', 400), ('D', 400), ('D', 800),


    # なーのはに とーまれ

    ('C', 400), ('D', 400), ('E', 400), ('F', 400),

    ('G', 800),


    ('rest', 400)

]


for n, t in melody:

    play(notes[n], t)


buzzer.deinit()


Pico W + MAX98357A(chatgpt) https://www.otosozai.com/se1_1.htmlよりステレオ音源とったが、、、

一度はうごいたがその後無音に。。。。製品が2個とも悪いのかも、あきらめた

 **「ステレオ WAV でも再生できる」**ようにします。

やり方は ステレオ → モノラルにソフトで変換(L+R を平均)して I2S に流す方式です。
👉 MAX98357A が モノラル接続でも確実に鳴る一番安全な方法です。


方針(重要)

  • WAV が

    • モノラル → そのまま再生

    • ステレオL/R を平均してモノラル化して再生

  • 対応フォーマット

    • PCM

    • 16bit

    • mono / stereo 両対応


ステレオ対応版:WAV 再生コード(Pico W + MAX98357A)

from machine import Pin, I2S import struct # ============================== # I2S ピン設定 # ============================== BCLK_PIN = 10 # GP10 WS_PIN = 11 # GP11 DIN_PIN = 12 # GP12 WAV_FILE = "test.wav" # ============================== # WAV ヘッダ解析 # ============================== def read_wav_header(f): if f.read(4) != b'RIFF': raise ValueError("RIFF形式ではありません") f.read(4) if f.read(4) != b'WAVE': raise ValueError("WAVE形式ではありません") # fmt チャンク探索 while True: cid = f.read(4) size = struct.unpack("<I", f.read(4))[0] if cid == b'fmt ': fmt = f.read(size) break else: f.seek(size, 1) audio_format, channels, sample_rate = struct.unpack("<HHI", fmt[:8]) bits = struct.unpack("<H", fmt[14:16])[0] print("==== WAV 情報 ====") print("チャンネル数 :", channels) print("ビット深度 :", bits) print("サンプル周波数:", sample_rate, "Hz") if audio_format != 1: raise ValueError("PCM形式のみ対応") if bits != 16: raise ValueError("16bitのみ対応") if channels not in (1, 2): raise ValueError("mono / stereo のみ対応") # data チャンク探索 while True: cid = f.read(4) size = struct.unpack("<I", f.read(4))[0] if cid == b'data': return sample_rate, channels, size else: f.seek(size, 1) # ============================== # ステレオ → モノラル変換 # ============================== def stereo_to_mono(data): out = bytearray(len(data) // 2) for i in range(0, len(data), 4): l = struct.unpack_from("<h", data, i)[0] r = struct.unpack_from("<h", data, i + 2)[0] m = (l + r) // 2 struct.pack_into("<h", out, i // 2, m) return out # ============================== # WAV 再生 # ============================== with open(WAV_FILE, "rb") as f: rate, channels, data_size = read_wav_header(f) audio = I2S( 0, sck=Pin(BCLK_PIN), ws=Pin(WS_PIN), sd=Pin(DIN_PIN), mode=I2S.TX, bits=16, format=I2S.MONO, rate=rate, ibuf=40000 ) print("▶ 再生開始") BUF_SIZE = 1024 * (2 if channels == 2 else 1) remaining = data_size while remaining > 0: raw = f.read(min(BUF_SIZE, remaining)) if not raw: break if channels == 2: raw = stereo_to_mono(raw) audio.write(raw) remaining -= len(raw) audio.deinit() print("■ 再生終了")
-------------------------------------------------------------

2025年12月24日水曜日

TB6612使用 Dual DCモータードライブキット 秋月 (uno/pic)

 akizukidenshi.com は、ピンの位置が微妙にずれているので要注意

真ん中の3本がgnd,stby,vccになっている stbyはポジティブにセットしておく方法とプログラムでセットするやり方がある、後者のほうがベターだが配線がめんどい 以後は前者

const int motorPWM = 3;

const int motorAin1 = 4;

const int motorAin2 = 5;

int motorSpeed = 100; // pwmのデューティ比で0~255で調整

void setup() {

   // declare pin 9 to be an pwm output:

   pinMode(motorPWM, OUTPUT);

   pinMode(motorAin1, OUTPUT);

   pinMode(motorAin2, OUTPUT);

}


void loop() {

  analogWrite(motorPWM, motorSpeed);

  digitalWrite(motorAin1, LOW);

  digitalWrite(motorAin2, HIGH);

  delay(3000);

  digitalWrite(motorAin1, HIGH);

  digitalWrite(motorAin2, LOW);

  delay(3000);

}



2025年12月21日日曜日

pic16f18325 no-mcc aqm0802

http://machoto2.g2.xrea.com/page/P16F18325/P18325_M01.htm ばっちり動いた

 main.c

/*********************************************************************
 * データをLCDに表示する。 1MHz (内部クロック)
 * RC5 SCL
 * RC4 SDA
 *
 * PIC16F18325  MPLAB X IDE with XC8
 * Copyright (c) 2017 iwamoto All Rights Reserved
 * *******************************************************************/
#define _XTAL_FREQ 1000000

#include <xc.h>
#include <stdio.h>
#include "LCDi2c.h"
//******************* コンフィグレーション ****************************
#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = ON,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF

// ******************* main ******************************************
void main() {
    i2c_int();
    LCD_int();                  // LCDを初期化
    printf("LCD Test");
    LCD_posyx(1,1);             // 下段にカーソル移動
    printf("%04X",0x12AB);      // 数値をHEX表示する
    while(1);
}

LCDi2c.h

/*
 * File:   LCDi2c.h
 *  データをLCDに表示する。
 *    秋月(ACM1602NI)I2C LCD表示器を使用
 *          1MHz (内部クロック)
 * RC5 SCL
 * RC4 SDA
 *
 * PIC16F18325  MPLAB X IDE with XC8
 * Copyright (c) 2017 iwamoto All Rights Reserved
 ** Author: ki
 * Created on October 21, 2017, 11:53 AM
 */

#ifndef _XTAL_FREQ
#define _XTAL_FREQ 1000000
#endif

 //*************************************************
 //  調整用定数
 //*************************************************
 #define CONTRAST  0x28          // for 3.3V
 // #define CONTRAST  0x18       // for 5.0V


 // プロトタイプ *******************************
 void i2c_int(void);
 void i2cByteWrite(char, char, char);
 void i2cTxData(char);
 void LCD_dat(char);
 void LCD_cmd(char);
 void LCD_clr(void);
 void LCD_posyx(char,char);
 void LCD_int(void);

 void LCD_str(char *);
 void LCD_ROMstr(const char *);

LCDi2c.c

/* ************************************
 *  File:   LCDi2c.c
 * プログラム例
 *      int a = 1234;
 *      printf("%d %o %x\n", a, a, a);
 *      printf("%s %c\n", "abc", 'x');
 * 結果 -------------------------------
 *      1234 2322 4d2
 *      abc x
 * *************************************/
#include <xc.h>
#include <stdio.h>
#include "LCDi2c.h"

//******************************************************
// LCD で printf関数が使用できるようにするため putch を設定する
//******************************************************
void putch(char data) {
        LCD_dat(data);      // LCD への一文字表示関数
}

//******************************************************
// I2C 関連 RC5 SCL, RC4 SDA
//******************************************************
void i2c_int(void){
    TRISC4 = 1;             // RC4を入力にする
    TRISC5 = 1;             // RC5を入力にする
    ANSC4  = 0;             // RC4をデジタルIO
    ANSC5  = 0;             // RC5をデジタルIO
    ODCC4  = 1;             // RC4をオープンドレイン
    ODCC5  = 1;             // RC5をオープンドレイン
    LATC4  = 1;             // RC4をオープンにする
    LATC5  = 1;             // RC5をオープンにする
    WPUC4  = 1;             // RC4弱プルアップ ON
    WPUC5  = 1;             // RC5弱プルアップ ON
    RC4PPS     = 25;        // RC4をDAT出力に指定
    RC5PPS     = 24;        // RC5をCLK出力に指定
    SSP1DATPPS = 0x14;      // RC4をDATに入力指定
    SSP1CLKPPS = 0x15;      // RC5をCLK入力に指定

    // SSP1設定 ------------------------------------------
    SSP1STAT = 0b10000000;     // スルーレート制御はOff
    SSP1ADD  = 1;              // クロック設定 125k@1MHz
    SSP1CON1 = 0b00101000;     // I2C Master modeにする
}
//-------- ByteI2C送信
void i2cByteWrite(char addr, char cont, char data){
    SSP1CON2bits.SEN = 1;      // Start condition 開始
    while(SSP1CON2bits.SEN);   // Start condition 確認
    i2cTxData(addr);           // アドレス送信
    i2cTxData(cont);           // 制御コード送信
    i2cTxData(data);           // データ送信
    SSP1CON2bits.PEN = 1;      // Stop condition 開始
    while(SSP1CON2bits.PEN);   // Stop condition 確認
}
//-------- Data送信
void i2cTxData(char data){
    PIR1bits.SSP1IF = 0;       // 終了フラグクリア
    SSP1BUF = data;            // データセット
    while(!PIR1bits.SSP1IF);   // 送信終了待ち
}
//********************************************************
// LCD 関連
//********************************************************
//-------- 1文字表示
void LCD_dat(char chr){
    i2cByteWrite(0x7C, 0x40, chr);
    __delay_us(50);            // 50μsec
}
//-------- コマンド出力
void LCD_cmd(char cmd){
    i2cByteWrite(0x7C, 0x00, cmd);
    if(cmd & 0xFC)             // 上位6ビットに1がある命令
        __delay_us(50);        // 50usec
    else
        __delay_ms(2);         // 2msec ClearおよびHomeコマンド
}
//-------- 全消去
void LCD_clr(void){
    LCD_cmd(0x01);             //Clearコマンド出力
}
//-------- カーソル位置指定
void LCD_posyx(char ypos, char xpos){
    unsigned char pcode;
    switch(ypos & 0x03){
        case 0:    pcode=0x80;break;
        case 1:    pcode=0xC0;break;
    }
    LCD_cmd(pcode += xpos);
}
//-------- 初期化
void LCD_int(void){
    __delay_ms(100);
    LCD_cmd(0x38);             // 8bit 2行 表示命令モード
    LCD_cmd(0x39);             // 8bit 2行 拡張命令モード
    LCD_cmd(0x14);             // OSC  BIAS 設定1/5
                               // コントラスト設定
    LCD_cmd(0x70 + (CONTRAST & 0x0F));
    LCD_cmd(0x5C + (CONTRAST >> 4));
    LCD_cmd(0x6B);             // Ffollwer
    __delay_ms(100);
    __delay_ms(100);
    LCD_cmd(0x38);             // 表示命令モード
    LCD_cmd(0x0C);             // Display On
    LCD_cmd(0x01);             // Clear Display
}
//-------- 文字列出力
void LCD_str(char *str){
    while(*str)                //文字列の終わり(00)まで継続
        LCD_dat(*str++);       //文字出力しポインタ+1
}
//-------- Rom 文字列出力
void LCD_ROMstr(const char *str){
    while(*str)                //文字列の終わり(00)まで継続
        LCD_dat(*str++);       //文字出力しポインタ+1
}

2025年12月20日土曜日

HSPのhspext.asは超便利

#include "hspext.as"

    com_port = 10 ; arduinoのシリアルモニタは使えなくなる

    com_baud = "baud=9600 parity=N data=8 stop=1"

    comopen com_port, com_baud

    if stat != 0 : dialog "COMポートを開けませんでした。": end

    mes "COM" + com_port + " を開きました。"

    ; --- 重要:Arduinoがリセットから立ち上がるのを待つ --- これがないと

ArduinoはPCから接続(comopen)された瞬間に再起動(リセット)がかかります。

    mes "Arduinoの準備を待っています..."

    wait 300  ; 3秒間待機(これがないと送信データが無視されます)

再起動中のArduinoはデータを受け取れないため、送信前に待ち時間を入れる必要があります。

    ; --- データの送信 ---

    comput "Hello HSP3.7"

    mes "データを送信しました。LEDが4秒間光るはずです。"

    ; 送信が物理的に完了するまで少し待ってから閉じる

    wait 100 

    comclose

    mes "ポートを閉じました。"

    stop

----------------対応arduino code-----------------

void setup() {
  // 内蔵LED(13番ピン)を出力モードに設定
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW); // 最初は消灯
  // HSP側の設定に合わせて 9600bps で開始
  Serial.begin(9600);
}

void loop() {
  // シリアルバッファにデータが届いているか確認
  if (Serial.available() > 0) {
    // 送信された文字列を読み取る
    String data = Serial.readString();
    // 受信した文字列に "Hello HSP3.7" が含まれているか判定
  // これならcr/lf処理が省けるので便利
    if (data.indexOf("Hello HSP3.7") != -1) {
      digitalWrite(LED_BUILTIN, HIGH); // LEDを点灯
      delay(4000);
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}


2025年12月18日木曜日

aqm1602 on pic16f18857(gokan IOT pedia)

 /***********IOT 3.2.1yori*******************************

 *  I2C接続のセンサとLCDを使う mccだけでOK すばらしい

 *  温湿度、気圧の表示

 *****************************************/

#include "mcc_generated_files/mcc.h"

#include "mcc_generated_files/examples/i2c1_master_example.h"

//#include "mcc_generated_files/weather.h"

// 変数定義

uint8_t Flag;

double temp, humi, pres;

char Line1[17], Line2[17]; // aqm1602は16x2 17は多すぎ

char Line1[]="0123456789012345";

char Line2[]="0000000000000000";

// 液晶表示器 コントラスト用定数

//#define CONTRAST  0x18    // for 5.0V

#define CONTRAST  0x25        // for 3.3V  bme280併用時はこれで

// 関数プロト

void lcd_data(char data);

void lcd_cmd(char cmd);

void lcd_init(void);

void lcd_str(char * ptr);

/***** タイマ0割り込み処理関数******/

void TMR0_Process(void){

    Flag = 1;

}

/***** メイン関数 ******/

void main(void)

{

    SYSTEM_Initialize();                    // システム初期化

    TMR0_SetInterruptHandler(TMR0_Process);

    INTERRUPT_GlobalInterruptEnable();

    INTERRUPT_PeripheralInterruptEnable();    

    lcd_init();                             // LCD初期化

    /****** メインループ ************/

    while (1)

    {    

        if(Flag == 1){

            Flag = 0;

            /** センサデータ読み出し **/

            //Weather_readSensors();

            //temp = Weather_getTemperatureDegC();

           // humi = Weather_getHumidityRH();            

            //pres = Weather_getPressureKPa() * 10;

            // 表示データ編集

           

           // sprintf(Line1, "T=%2.1fC  H=%2.1f%%", temp, humi);

           //              sprintf(Line2, "P=%4.1f hPa", pres);

            // LCD表示

            lcd_cmd(0x80);                      // 1行目

            lcd_str(Line1);

            lcd_cmd(0xC0);                      // 2行目

            lcd_str(Line2);

        }

    }

}

/****** 液晶表示器ライブラリ ***************/

/******************************

* 液晶へ1文字表示データ出力

*******************************/

void lcd_data(char data){

    I2C1_Write1ByteRegister(0x3E, 0x40, data); 

    __delay_us(30);                             // 処理待ち遅延

}

/*******************************

* 液晶へ1コマンド出力

*******************************/

void lcd_cmd(char cmd){

    I2C1_Write1ByteRegister(0x3E, 0x00, cmd);

    /* ClearかHomeのとき長遅延 */

    if((cmd == 0x01)||(cmd == 0x02))

        __delay_ms(2);                  // 2msec待ち

    else

        __delay_us(30);                 // 30μsec待ち

}

/*****************************

* 液晶表示器 文字列表示関数

*****************************/

void lcd_str(char * ptr){

    while(*ptr != 0)                    // 文字列最後まで

        lcd_data(*ptr++);               // 文字表示実行

}

/*******************************

*  液晶表示器 初期化関数

*******************************/

void lcd_init(void){

    __delay_ms(150);                    // ハード初期化待ち

    lcd_cmd(0x38);                      // 8bit 2line Normal mode

    lcd_cmd(0x39);                      // 8bit 2line Extend mode

    lcd_cmd(0x14);                      // OSC 183Hz BIAS 1/5

    /* コントラスト設定 */

    lcd_cmd(0x70 + (CONTRAST & 0x0F));

    lcd_cmd(0x5C + (CONTRAST >> 4));

//    lcd_cmd(0x6B);                    // Follower for 5.0V

    lcd_cmd(0x6B);                      // Follwer for 3.3V

    __delay_ms(300);

    lcd_cmd(0x38);                      // Set Normal mode

    lcd_cmd(0x0C);                      // Display On

    lcd_cmd(0x01);                      // Clear Display

}


hsp37のwifiサーバ

hsp37ではtcp-serverの切断は原則ない! 

 #include "hspsock.as"

port = 12345

sdim buf, 1024

dim position

title "HSP TCP Server"

sockmake 0, port

if stat != 0 : dialog "ポートを開けません": end

mes "12345で待機中..."

*main

    sockwait 0

    if stat == 0 {

        mes "接続されました"

        goto *recv

    }

    wait 10

    goto *main


*recv

    sockget buf, 1024, 0

    if buf != "" {

        position = 0

        getstr buf, buf, position, 10 ; 10は

        mes buf

        if buf = "ledon"  : mes "LED ON"

        if buf = "ledoff" : mes "LED OFF"

        sockput "OK\n", 0

        buf = ""

    }

    wait 10

    goto *recv



2025年12月14日日曜日

hstp37/dolittle//xcratch/mitapp(other page) on windows with arduino

 hsp37ではarduino.asが同梱されておりstandardfirmata.inoでうごく

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

xcratchはstandardfirmata.inoでうごく

 !が出ている場合はcomを選択してopen!  でないとgpioが制御できない

-----------------------ドリトル通信は--firmataでない--------------------------------------------------

WebAPI 完動:getでjsonを返すサーバを書けばいいだけ

  • WebAPIサーバにアクセスして情報を取得するためのオブジェクトです。
  • GETでのリクエストに対応しています。
  • オンライン版では利用できません。
  • 作る: WebAPIオブジェクトを作成します。
    • (例)waという名前でWebAPIオブジェクトを生成します。
 wa=WebAPI!作る。
  • 読む: Webクライアントオブジェクトを作成します。
    • オブジェクトのプロパティでURLとパラメータを設定します。urlの設定は必須です。
    • 取得データはJSON形式に対応しています。取得したデータをプロパティと配列の構造に変換したオブジェクトを返します。
    • (例)wという名前でWebクライアントオブジェクトを生成します。
 wa=webapi!作る。
 wa:url="https://zip-cloud.appspot.com/api/search"。
 wa:zipcode="0790177"。
 ret=wa!読む。
 フィールド!(ret:results_1:address3)作る。

https://dolittle.eplang.jp/doku.php?id=ch_arduino 

で勉強 linux/raspberry piはうまくいかん なんでやろ? (xcratchも同様。。。)

以下で通信する(firmata的)

void setup(){
  Serial.begin(9600);
  Serial.write(' ');
}
void loop(){
  int wait=5;
  if (Serial.available() > 0) {
    byte in = Serial.read();
    byte cmd = in & 0xe0;
    byte port = in & 0x1f;

    switch (cmd) {
    case 0x40: // pinMode(Dout)
      pinMode(port ,OUTPUT);
      delay(wait);
      break;
    case 0x60: // pinMode(Din)
      pinMode(port ,INPUT);
      delay(wait);
      break;
    case 0x80: // Dout
      delay(wait);
      if (Serial.read() == 1) { digitalWrite(port, HIGH); } else { digitalWrite(port, LOW); }
      break;
    case 0xA0: // Din
      Serial.write(digitalRead(port));
      break;
    case 0xC0: // Aout
      delay(wait);
      analogWrite(port, Serial.read());
      break;
    case 0xE0: // Ain
      Serial.write(analogRead(port)/4);
      break;

    default :
      break;
    }
  }
}

2025年12月8日月曜日

pickit5 pedia / raspberry pi pico again

 ミニpcになってからUSB挿し口を変えて成功することが多くなった。。。。

https://tool-lab.com/pic-basic-23/ ここに電源関係がくわしい sdc,lancableはペンディング

なお書き込みスピードが速すぎとエラーがでたので以下を参考にスピードをLOWにした

書き込み失敗は多くLVP onで起こるようで、mplab snapをつかわんのでLVP offとした

https://www.watchittrend.com/mplab-icd4-write-speed-error/

以下はgetchのコンフリクトが起こったので、char eusart_getch(void)として

(eusart.c内で)衝突回避できた、c90でuart redirectでprintfがつかえた 便利

#include "mcc_generated_files/mcc.h"

#include <stdio.h>

#include <stdlib.h>

int16_t Xaxis,Yaxis,Zaxis;

char Line1[] = "  X     Y     Z ";

char Line2[] = "-xxx  -xxx  -xxx";


void itostring(char digit, uint16_t data, char *buffer){

    char i;

    buffer += digit;

    for(i=digit; i>0; i--){

        buffer--;

        *buffer = (data % 10) + '0';

        data = data / 10;

    }   

};

void numtostr(int16_t number, char *buf){

    char* ptr;

    ptr = buf; 

    if(number >= 0)

        *buf = '+';

    else {

        number *= -1;

        *buf = '-';

    }

    itostring(3, (uint16_t)number, ptr+1);

};

void main(void){

    SYSTEM_Initialize();

    while(1){

        Xaxis = (int16_t)ADC_GetConversion(ANX) - 511;

        Yaxis = (int16_t)ADC_GetConversion(ANY) - 511;

        Zaxis = (int16_t)ADC_GetConversion(ANZ) - 511;

        

        numtostr(Xaxis,Line2);

        numtostr(Yaxis,Line2+6); 

        numtostr(Zaxis,Line2+12);

        printf(" X Y Z is %s\n", Line1);

        printf("%s\n", Line2);

        __delay_ms(1000);

    }

}


------------------------------------------------------------------

aqm0802が3.3v駆動にて以下を実行(温度はダミー、ビルトインledは便利)

# LM61CIZ

import machine

import utime

# AQM0802

from machine import Pin, I2C

from micropython import const


from utime import sleep



# LM61 Vout connected to 34pin(ACD2)

# input LM61CIZ , convert voltage to temp value

sensor_temp = machine.ADC(2)

conversion_factor = 3.3 / (65535)


# AQM function

_ST7032  = const(0x3e)

_SETTING = const(0x00)

_DISPLAY = const(0x40)


# AQM initialized

def init(i2c):

    orders = [b'\x38', b'\x39', b'\x14', b'\x73', b'\x56', b'\x6c',

              b'\x38', b'\x0c', b'\x01']

    sleep(0.04)

    for order in orders[:6]:

        i2c.writeto_mem(_ST7032, _SETTING, order)

        sleep(0.001)

    sleep(0.2)

    for order in orders[6:]:

        i2c.writeto_mem(_ST7032, _SETTING, order)

        sleep(0.001)

    sleep(0.001)

    

# AQM show setting

def show(i2c, string):

    i2c.writeto_mem(_ST7032, _SETTING, b'\x01')

    sleep(0.002)

    for i in string:

        i2c.writeto_mem(_ST7032, _DISPLAY, i.encode())

# AQM show setting    

def main():

    i2c = I2C(1, scl=Pin(27), sda=Pin(26))

    init(i2c)

    #display temp data

    show(i2c, tempdata)


while True:

    #センサーから値を取り出します

    #reading = sensor_temp.read_u16() * conversion_factor

    #センサから取り出した電圧

    #print(sensor_temp.read_u16())

    # 電圧を温度に変換

    #temp_calc = (reading*1000-600) / 10

    temp_calc = 23.0

    #shellに表示

    #print("{0:.1f}".format(temp_calc)  + "C")

    #print(reading)

    #tempdata = str(temp_calc)

    #小数点以下1位のみ表示+ 温度のCをつける

    tempdata = ("{0:.1f}".format(temp_calc)  + "C")


    #Run

    #if __name__ == '__main__':

    main()

    # 動作確認用のLチカ

    led = machine.Pin(25, machine.Pin.OUT)

    led.value(1)

    utime.sleep(0.2)

    led.value(0)

  

    #each 2 second

    utime.sleep(2)

 

2025年11月28日金曜日

vlang docmentation(https://docs.vlang.io/introduction.html) すこしづつ改訂必要(チャット君利用)

V ではトップレベルに置けるのは:

  • 関数宣言

  • グローバル変数の宣言(__global or pub mut

  • 型宣言(struct, enum など)

  • import

です。
:= を使った代入は 必ず関数内で書く必要 があります。


module main

fn foo() (int, int) {

    return 2, 3

}


fn main() {

    a, b := foo()

    println(a) // 2

    println(b) // 3

    c,_ := foo()

    println(c) // 2

}

pico-sdk and vlang

 https://zenn.dev/nonnoise/articles/8c8997c2757cc0でwsl2/ubuntuでできた pico用がメインでpico-wはちょっとめんどげ

-------------------------------------------------------

 v -cc gcc -o blink.c blink.v (-cc gccが重要)

blink.v is as below

#flag -I.~/pico/pico/pico-sdk/src/common/pico_stdlib_headers/include

#include "stdlib.h"

#include "time.h"


// ▼ C 関数の宣言(正しい型で)

fn C.stdio_init_all()

fn C.gpio_init(pin u32)

fn C.gpio_set_dir(pin u32, dir bool)

fn C.gpio_put(pin u32, value bool)

fn C.sleep_ms(ms u64)


// ▼ Pico の実行エントリ(V main は使わない)

@[no_main]

@[export: "main"]

fn main() {

    C.stdio_init_all()


    C.gpio_init(25)

    C.gpio_set_dir(25, true)

    for {

        C.gpio_put(25, true)

        C.sleep_ms(500)

        C.gpio_put(25, false)

        C.sleep_ms(500)

    }

}

できたblink.cをcmake/makeする 。。。。ここからが謎

2025年11月22日土曜日

arduino uno r4 wifi with very convenient httpserver library

UnoR4WiFi_Webserver libraryがうごいた

 /*  main.cpp
 * This example demonstrates how to create a multi-page web server with:
 * - Home page with navigation
 * - Temperature monitoring page
 * - LED control page
 *
 * Hardware: Arduino Uno R4 WiFi or DIYables STEM V4 IoT
 * Library: UnoR4WiFi_WebServer
 */

#include <UnoR4WiFi_WebServer.h>
#include "home.h"
#include "temperature.h"
#include "led.h"
#include "arduino_secrets.h"

// WiFi credentials
const char WIFI_SSID[] = SECRET_SSID;
const char WIFI_PASSWORD[] = SECRET_PASS;

// LED configuration
#define LED_PIN 13
int ledState = LOW;  // Track LED state

// Create web server instance
UnoR4WiFi_WebServer server;

// Helper function to send LED page with current status
void sendLedPage(WiFiClient& client) {
  String ledStatus = (ledState == HIGH) ? "ON" : "OFF";
  String response = LED_PAGE;
  response.replace("%LED_STATUS%", ledStatus);
  server.sendResponse(client, response.c_str());
}

// Page handlers

void handleHome(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
  server.sendResponse(client, HOME_PAGE);
}

void handleTemperature(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
  float tempC = 25.5;  // Simulated temperature value, you can replace with actual sensor reading
 
  String response = TEMPERATURE_PAGE;
  response.replace("%TEMP_C%", String(tempC, 1));
 
  server.sendResponse(client, response.c_str());
}

void handleLed(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
  sendLedPage(client);
}

void handleLedOn(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
  ledState = HIGH;
  digitalWrite(LED_PIN, ledState);
  sendLedPage(client);
}

void handleLedOff(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) {
  ledState = LOW;
  digitalWrite(LED_PIN, ledState);
  sendLedPage(client);
}

void setup() {
  Serial.begin(9600);
  delay(1000);
 
  // Initialize LED pin
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, ledState);
 
  Serial.println("Arduino Uno R4 WiFi - Multi-Page Web Server");
 
  // Connect to WiFi
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  delay(1000); // ここが大変重要で入れないとconnected 0.0.0.0でdhcpdがうごかん!
  Serial.println(" connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
 
  // Configure routes
  server.addRoute("/", handleHome);
  server.addRoute("/temperature", handleTemperature);
  server.addRoute("/led", handleLed);
  server.addRoute("/led/on", handleLedOn);
  server.addRoute("/led/off", handleLedOff);
 
  // Start server
  server.begin();
 
  Serial.println("\n=== Web Server Ready! ===");
  Serial.print("Visit: http://");
  Serial.println(WiFi.localIP());
}

void loop() {
  server.handleClient();
}
ーーーーーーーーーーーーーhome.hーーーーーーーーーーーーーーーーーーーーーーーーーー
#ifndef HOME_H
#define HOME_H

const char HOME_PAGE[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="icon" href="data:,">
  <title>Arduino Web Server</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
      margin: 50px;
      background-color: #f5f5f5;
    }
    .container {
      max-width: 600px;
      margin: 0 auto;
      background-color: white;
      padding: 30px;
      border-radius: 10px;
      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    }
    h1 {
      color: #333;
      margin-bottom: 30px;
    }
    .nav-menu {
      list-style: none;
      padding: 0;
      margin: 0;
    }
    .nav-item {
      margin: 15px 0;
    }
    .nav-link {
      display: inline-block;
      padding: 15px 30px;
      text-decoration: none;
      background-color: #007bff;
      color: white;
      border-radius: 5px;
      font-size: 16px;
      min-width: 200px;
      transition: background-color 0.3s;
    }
    .nav-link:hover {
      background-color: #0056b3;
    }
    .description {
      margin: 30px 0;
      color: #666;
      font-size: 14px;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>Arduino Uno R4 WiFi Web Server</h1>
    <div class="description">
      <p>Welcome to the Arduino web server demo!</p>
      <p>Explore the features below:</p>
    </div>
    <ul class="nav-menu">
      <li class="nav-item">
        <a href="/temperature" class="nav-link">🌡️ Temperature Data</a>
      </li>
      <li class="nav-item">
        <a href="/led" class="nav-link">💡 LED Control</a>
      </li>
    </ul>
    <br><br><br><br>
    This works with Arduino Uno R4 WiFi and <a href="https://diyables.io/products/diyables-stem-v4-iot-fully-compatible-with-arduino-uno-r4-wifi" target="_blank">DIYables STEM V4 IoT</a>
  </div>
</body>
</html>
)rawliteral";

#endif
ーーーーーーーーーーーーーーーled.hーーーーーーーーーーーーーーーーーーーーーーー

#ifndef LED_H
#define LED_H

const char LED_PAGE[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="icon" href="data:,">
  <title>LED Control</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
      margin: 50px;
    }
    .led-status {
      font-size: 24px;
      font-weight: bold;
      color: #0000ff;
    }
    .button {
      display: inline-block;
      padding: 10px 20px;
      margin: 10px;
      text-decoration: none;
      background-color: #007bff;
      color: white;
      border-radius: 5px;
      border: none;
      cursor: pointer;
    }
    .button:hover {
      background-color: #0056b3;
    }
  </style>
</head>
<body>
  <h1>LED Control Panel</h1>
  <div>LED Status: <span class="led-status">%LED_STATUS%</span></div>
  <p>Control the LED using the buttons below:</p>
  <a href="/led/on" class="button">Turn LED ON</a>
  <a href="/led/off" class="button">Turn LED OFF</a>
  <br><br>
  <a href="/">Back to Home</a>
  <br><br><br><br>
  This works with Arduino Uno R4 WiFi and <a href="https://diyables.io/products/diyables-stem-v4-iot-fully-compatible-with-arduino-uno-r4-wifi" target="_blank">DIYables STEM V4 IoT</a>
</body>
</html>
)rawliteral";

#endif
-------------------temperture.h-----------------------------
#ifndef TEMPERATURE_H
#define TEMPERATURE_H

const char TEMPERATURE_PAGE[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="icon" href="data:,">
  <title>Temperature Data</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
      margin: 50px;
      background-color: #f5f5f5;
    }
    .temperature-container {
      background: white;
      padding: 30px;
      border-radius: 10px;
      box-shadow: 0 2px 10px rgba(0,0,0,0.1);
      display: inline-block;
      margin: 20px;
    }
    .temperature-value {
      font-size: 48px;
      font-weight: bold;
      color: #0066cc;
      margin: 20px 0;
    }
    .info {
      margin: 20px 0;
      font-size: 16px;
      color: #666;
    }
    .refresh-btn {
      background: #0066cc;
      color: white;
      padding: 10px 20px;
      text-decoration: none;
      border-radius: 5px;
      margin: 10px;
      display: inline-block;
    }
  </style>
</head>
<body>
  <h1>🌡️ Temperature Monitor</h1>
 
  <div class="temperature-container">
    <div class="temperature-value">%TEMP_C%°C</div>
   
    <div class="info">
      <p><strong>Status:</strong> Temperature reading</p>
      <p><em>Refresh the page to see updated values</em></p>
    </div>
   
    <a href="/temperature" class="refresh-btn">🔄 Refresh</a>
    <a href="/" class="refresh-btn">🏠 Home</a>
    <br><br><br><br>
    This works with Arduino Uno R4 WiFi and <a href="https://diyables.io/products/diyables-stem-v4-iot-fully-compatible-with-arduino-uno-r4-wifi" target="_blank">DIYables STEM V4 IoT</a>
  </div>
</body>
</html>
)rawliteral";

#endif



2025年11月19日水曜日

new Blynkはesp01(at mode)はつかえない!uno r3 + esp01-atはチャット君に聞いた

 sunfounderのチュートリアルはblynk legacyでないとあかん ふるいのをインストは危険

そうなので断念 チャット君に聞いて次のコードを得た

以下のスケッチは、Arduino UnoからESP-01へATコマンドを送信し、簡単なWebサーバーを立てるための基本的な枠組みです。YOUR_SSIDYOUR_PASSWORDを実際のWi-Fi情報に置き換えてください。
とのことだったが、AT-THINKER_E71E5Cというアクセスポイントが出てきてpwdなしだった
cpp
#include <SoftwareSerial.h>

// ESP-01のRX/TXピンをArduinoの任意のデジタルピンに接続
// ここでは D2(RX) と D3(TX) を使用する例
SoftwareSerial espSerial(2, 3); // RX, TX

void setup() {
  Serial.begin(9600);
  espSerial.begin(115200); // ESP-01のデフォルトボーレートに合わせて調整 (115200 bpsが多い)

  Serial.println("Starting ESP-01 Web Server...");

  // ATコマンドでESP-01を設定
  sendData("AT+RST\r\n", 2000); // リセット
  sendData("AT+CWMODE=2\r\n", 1000); // APモードに設定
  sendData("AT+CIFSR\r\n", 1000); // IPアドレスを取得
  sendData("AT+CIPMUX=1\r\n", 1000); // 多重接続モード有効化
  sendData("AT+CIPSERVER=1,80\r\n", 1000); // TCPサーバー開始 (ポート80)
}

void loop() {
  if (espSerial.available()) {
    if (espSerial.find("+IPD,")) { // クライアントからのデータ受信を検出
      delay(100);
      // 受信データを読み込み、HTTPレスポンスを返す処理を実装
      String data = "<h1>Hello from Arduino Uno!</h1>";
      String cmd = "AT+CIPSEND=0," + String(data.length()) + "\r\n";
      sendData(cmd, 1000);
      sendData(data, 1000);
      sendData("AT+CIPCLOSE=0\r\n", 1000); // 接続を閉じる
    }
  }
}

String sendData(String command, const int timeout) {
  String response = "";
  espSerial.print(command);
  long time = millis();
  while ((time + timeout) > millis()) {
    while (espSerial.available()) {
      char c = espSerial.read();
      response += c;
    }
  }
  Serial.print(response);
  return response;
}

2025年11月16日日曜日

platformIO 約束事 :: esp8266&esp32 webserver example

 #include <Arduino.h>は必須 terminal softはmicrosftのをextension install

関数プロトタイプは非有効 setup,loopで使用する関数は事前定義必須

-----------------------------------------------------------------

https://iot.keicode.com/esp8266/esp8266-webserver.php がうごいた

localipに/led/on,/led/offなどをつけてbrowseするとled on offにつかえる

ーーーーーーーーーーーーーーーーーーーーーーー

esp32には上記のライブラリがないとのことで自作してる人がいた softapなので注意

https://okiraku-camera.tokyo/blog/?p=6008

SimpleWebServer.h
----------------------------------------------------------------
// Get request のみ受け付ける マイコンなら十分です
#include <WiFi.h>
//line.indexOf(" ", 5)インデックス5以降から最初に現れるスペース(" ")の位置(インデックス)を
//検索し、その位置を返すメソッド呼び出し
//例えば、line の内容が "GET /path/to/file.html HTTP/1.1" だった場合を考えます。
//インデックス: 0123456789...
//文字列: "GET /path/to/file.html HTTP/1.1"
//line.indexOf(" ", 5); を実行すると:
//インデックス 5 は / の位置です。
//検索は /path/to/file.html HTTP/1.1 の部分から始まります。
//この範囲内で最初に見つかるスペースは、html の直後のスペースです。
//そのスペースのインデックス番号が戻り値として返されます。
//このメソッドは、文字列を解析して特定の部分を抽出する際によく利用されます。
#include <Arduino.h>
#include <WiFiServer.h>
#include <map>
using namespace std;
typedef void (*Handler_t)(void);
typedef void (*DefaultHandler_t)(String);
typedef struct {
  int status;
  const char* cpDesc;
} response_t;

const response_t responses[] = {
  {200,"200 OK"},
  {404,"404 Not Found"},
  {50, "500 Server Error"},
  {0,0}
};

class SimpleWebServer : public WiFiServer {
  IPAddress ap_addr;
  IPAddress ap_netmask;
  String ssid;
  String password;
  std::map<String, Handler_t>request_handlers; // request_handlersはmap
  DefaultHandler_t default_handler = 0;
  WiFiClient* client_connected; // connectしてきたclient

 public: // constructor ここ重要、引数の一部であるportはWiFiServerモジュールに丸投げ
 SimpleWebServer(const char* ssid,const char* password, \
 const IPAddress ap_addr, const IPAddress ap_netmask, int port = 80) \
 : WiFiServer(port) {
  this->ap_addr = ap_addr;
  this->ap_netmask = ap_netmask;
  this->ssid = ssid;
  this->password = password;
  client_connected = NULL; // 最初はだれもコネクトしていないので
 }

 void begin(){
  WiFi.softAP(ssid.c_str(),password.c_str());// 外部からの侵入口
  WiFi.softAPConfig(ap_addr,ap_addr, ap_netmask);// address is fixed
  Serial.print("SoftAp: ");
  Serial.print(WiFi.softAPIP());
  Serial.print(" ");
  Serial.print(ssid+String(" starts."));
  WiFiServer::begin(); // ここ重要、beginの仕事の大部分をWiFiServerモジュールへ丸投げ
  Serial.println("SimpleWebServer begin()");
 }

 void add_handler(String uri, Handler_t func){
  request_handlers[uri]=func;
 }

 void add_default_handler(DefaultHandler_t func){
  default_handler=func;//上と切り分けておくとdefault挙動をカスタムできる
 }

 void send_response(const char* cp) // clientへのpay?
 {
    if (client_connected)
      client_connected->print(cp);
 }

 void send_status(int status, const char* cp=NULL)
 {
   if (!client_connected)
     return;
   const response_t* p  = responses;
   while(p->status != 0){
     if (p->status == status){
       String s="HTTP/1.1"+String(status)+String(" ")+\
       String(p->cpDesc)+String("\r\n\r\n");
       const char* cpDesc = cp ? cp : p->cpDesc;
       s=s+String("<HTML><BODY>")+\
       String(cpDesc)+String("</BODY></HTML>\r\n");
       client_connected->print(s);
       return;
     }
     p++;
   } // 50,404の処理と以下で再帰で200処理?
   send_status(200);
  }

void handle_request(){
  WiFiClient client = available();
  if (!client)
    return;
  String request_line = "";
  while (client){
    client_connected = &client;
    while(client.available()){
      String line = client.readStringUntil('\r');
      line.trim();
      if (line.startsWith("GET")){ // Get onley built
        int index = line.indexOf(" ",5);
        if (index > 0)
           request_line = line.substring(4,index); // Req only?
        else
           request_line = line.substring(4); // Get only?
        request_line.trim();
        continue; // jump to while?
      }
      if (line.length()==0){ // end of request headers.
         Serial.println("request_line="+request_line);
         Handler_t f = request_handlers[request_line];
         if (!f) {
          if (default_handler)
           default_handler(request_line);
          else
           send_status(404);
         } else
            f();
         client.flush();
       }
    }
    client_connected=NULL;
    client.stop();
  }
 }
};
**************************************************************
main.cpp
-------------------------------------------------------------
#include <Arduino.h>
#include "SimpleWebServer.h"

// クライアントから/ledonをもらったら点灯し、ledoffなら消灯
// GPIO13にLEDを接続。

#define LED 13
SimpleWebServer server("ESP32AP", "password", IPAddress(192,168,4,1), IPAddress(255,255,255,0), 80);
void led_menu() {
  const char* cur = digitalRead(LED) ? "ON" : "OFF";
  String s =  "HTTP/1.1 200 OK\r\nContent-type:text/html\r\n\r\n"
              "<HTML><BODY style='font-size:48px;'>ESP32_HTTPD_LED1<br/>"
              "<br/><a href=/ledon>ON</a><br/><a href=/ledoff>OFF</a><br/><br/>"
              "Current Status = ";
  s = s + String(cur) + "</BODY></HTML>\r\n";
  server.send_response(s.c_str());
}

void led_on()
{
  digitalWrite(LED, 1);
  led_menu();
}

void led_off()
{
  digitalWrite(LED, 0);
  led_menu();
}

void led_500()
{
  server.send_status(500, "Internal Server Error");
}

void default_handler(String request_line)
{
  Serial.println("default_handler : " + request_line);  
  String s = request_line + " is not found";
  server.send_status(404, s.c_str());
}

void setup() {
  Serial.begin(9600);
  delay(10);
  Serial.println("");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);

  server.add_handler("/", led_menu);
  server.add_handler("/ledon", led_on);
  server.add_handler("/ledoff", led_off);
  server.add_handler("/led500", led_500);

  server.add_default_handler(default_handler);
  server.begin();
}

void loop() {
  server.handle_request();
  delay(10);
}