2022年2月10日木曜日

obniz memo①

https://morizyun.github.io/javascript/node-js-npm-library-node-fetch.html node.js   でfetchをつかえるようにする
import fetch from 'node-fetch';
var APIKEY = '518c255d266e82b0f903e3ba905c437c';
var location = "Tokyo,jp";
fetch( `http://api.openweathermap.org/data/2.5/weather?q=${location}&appid=${APIKEY}`)
        .then(res => res.json())
        .then(json => console.log(json));
をindex.mjs(jsでなく)としてnode.mjsでOk                                                                          
518c255d266e82b0f903e3ba905c437c  my weather api

-----------------ポータル----------------

https://iot-gym.com/category/obniz/ オブニズ ポータル very instructable

https://iot-gym.com/ws2811-obniz/ ws2811 短いのから0,1、2とつける長いのはフリ

このかたのサイトは参考になる! たとえばarducm mini などは

https://iot-gym.com/arducammini-obniz/ とくわしい

ーーーーーーー uart  between microbit and obniz ーーーーー

^^^^^^

serial.redirect(   to-obniz.js

SerialPin.P0,

SerialPin.P1,

BaudRate.BaudRate115200

)

serial.writeString("from microbit")

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

serial.redirect(      from-obniz.js

SerialPin.P0,

SerialPin.P1,

BaudRate.BaudRate115200

)

basic.forever(function () {

    basic.showString(serial.readUntil(serial.delimiters(Delimiters.NewLine)))

})

^^^^^^^^^^^^^^^^^^^^^^

<textarea id="data" cols="32" rows="12"></textarea>   from-microbit.html

 <div id="obniz-debug"></div>

<script>

var obniz = new Obniz("5312-1232");

var result="";

obniz.onconnect = async function () {

  obniz.io0.output(false); // GND

  obniz.uart0.start({tx: 1, rx: 2 });

  obniz.uart0.onreceive = function(data, text){

  result += text;

  $("#data").val(result);

}

}

^^^^^^^^^^^^^^^^^^^^^^^^^

</script><html lang="ja"> to-microbit.html

  <head>

    <meta charset="utf-8" />

    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

    <script

      src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"

      integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"

      integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"

      crossorigin="anonymous"

    ></script>


    <link

      rel="stylesheet"

      href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"

    />

  </head>

  <body>

    <h3 id="bploading" style="text-align:center;">ロード中...</h3>

    <div id="OBNIZ_OUTPUT"></div>

    <br />

    

    <script

      src="https://unpkg.com/obniz@latest/obniz.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/iothome/index.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/airobot/index.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ui/index.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/howler2.1.2/howler.js"

      crossorigin="anonymous"

    ></script>

    

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/opencv3.4/opencv.js"

      crossorigin="anonymous"

    ></script>

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.3.0"></script>

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@2.1.0"></script>

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/posenet@2.2.2"></script>

    

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/clmtrackr.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/emotion_classifier.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/emotionmodel.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/model_pca_20_svm.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/index.js"

      crossorigin="anonymous"

    ></script>

    <script

      src="https://unpkg.com/obniz-parts-kits@0.16.0/storage/index.js"

      crossorigin="anonymous"

    ></script>


 <textarea id="data" cols="32" rows="12"></textarea>

 <button id="send">send</button>

 <div id="obniz-debug"></div>


<script>

var obniz = new Obniz("5312-1232");

var result="";

obniz.onconnect = async function () {

  obniz.io0.output(false); // GND

  obniz.uart0.start({tx: 1, rx: 2 });

  

 $("#send").click(function(){

  var text=$("#data").val();

  obniz.uart0.send(text+'\n');

}

</script> </body>

</html>

-----solenoid  and bme280 -----

https://iot-gym.com/bme280-obniz/ の通りで成功  6pinでもOKだった

ソレノイドは、あっさり成功

-------------------------- エアコン操作 -----------------------------------------------------

https://www.kodomonokagaku.com/experience/programming/9416/ 読み取り

https://www.kodomonokagaku.com/experience/programming/9769/ 書き込み

注: アプリはいかに詳しい

https://www.kodomonokagaku.com/experience/programming/3251/

ーーーーーーーーーーーいわゆるLチカーーーーーーーーーー 

https://qiita.com/azumabashi/items/77e923574d32a641d60f  

<!-- HTML Example -->

<html>

<head>

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <script src="https://obniz.com/js/jquery-3.2.1.min.js"></script>

  <script src="https://unpkg.com/obniz@3.3.0/obniz.js"></script>

</head>

<body>


<div id="obniz-debug"></div>

<h1>LED</h1>

<button id="on">on</button>

<button id="off">off</button>

<button id="tikatika">チカチカ</button>



<script>

 var obniz = new Obniz("5312-1232");

obniz.onconnect = async function () {


  var led = obniz.wired("LED", { anode:0, cathode:1 } );


  obniz.display.clear();

  obniz.display.print("Hello World");


  obniz.switch.onchange = function(state) {

    $('#print').text(state);

    obniz.display.clear();

    obniz.display.print(state);

  }  


  $('#on').click(function () {

      led.on();

      obniz.display.clear();

      obniz.display.print("ON");

  });

  $('#off').click(function () {

      led.off();

      obniz.display.clear();

      obniz.display.print("OFF");

  });

  $('#tikatika').click(function () {

    for(var i = 1; i < 10; i++){

      led.off();

      obniz.display.clear();

      obniz.display.print("OFF");

      led.on();

      obniz.display.clear();

      obniz.display.print("ON");

    }

  });

}

</script>

</body>

</html>

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


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

https://obniz.com/ja/sdk/parts/Keyestudio_Buzzer/README.md 

passive buzzer sound!

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

https://laboratory.kazuuu.net/use-a-buzzer-connected-to-the-obniz-board/ 

active buzze play sound!

<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.8.0/obniz.js"></script>
</head>
<body>
<h1>ブザー音が発生する</h1>
<button id="on">ON</button>
<button id="off">OFF</button>
<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function() {
var speaker = obniz.wired("Keyestudio_Buzzer", {signal:0, vcc:1, gnd:2});
$("#on").on("click",function(){
speaker.play(1000);
});
$("#off").on("click",function(){
speaker.stop();
});
};
</script>
</body>
</html>

ーーーーーーーサーボモーターーーー

https://qiita.com/Google_Homer/items/ed3be30e6e559d0395b9 ?

ーーーーーー dual motor driver 不要! dc motor ーーーーーーーーー

https://obniz.com/ja/sdk/parts/DCMotor/README.md

://qiita.com/getapojim/items/857025e1898fd12f6382

                                                を参考に以下のコードで

両輪をスムーズに起動することができた 

<html>

<head>

  <meta charset="utf-8">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>

  <script src="https://unpkg.com/obniz@1.9.4/obniz.js" crossorigin="anonymous"></script>

</head>

<body>


<div id="obniz-debug"></div>

<h1>obniz instant html</h1>

<button id="forward">forward</button>

<button id="reverse">reverse</button>

<div id="print"></div>


<script>

var obniz = new Obniz("5312-1232");

obniz.onconnect = async function () {

var motor1 = obniz.wired("DCMotor", {forward:1, back:0});

var motor2 = obniz.wired("DCMotor", {forward:3, back:2});

//モーターを回転する

$('#forward').click(function () {

  motor1.forward();

  motor2.forward();

  setTimeout(function(){

    motor1.stop();

    motor2.stop();

  }, 1000);

});


//モーターを逆回転する

$('#reverse').click(function () {

  motor1.reverse();

  motor2.reverse();

  setTimeout(function(){

    motor1.stop();

    motor2.stop();

  }, 1000);

});


}


</script>

</body>

</html>

----------------------------------------------------------------- for lm35dz of micro----
https://laboratory.kazuuu.net/use-a-temperature-sensor-connected-to-the-obniz-board/
を参考に以下のコードで成功
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.8.0/obniz.js"></script>
</head>
<body>
<h1>温度センター</h1>
<script>
var obniz = new Obniz("5312-1232");
obniz.onconnect = async function() {
var tempsens = obniz.wired("Keyestudio_TemperatureSensor", {signal:0, vcc:1, gnd:2});
tempsens.onchange = function(temp){
console.log(temp);
};
};
</script>
</body>
</htmel>


2022年2月5日土曜日

ラズパイ400① ラズピコ連携超簡単 附:ウブンツ、デビアン

https://misoji-engineer.com/archives/raspberrypi-ad-pico.htmlよりクジラが簡明だった


for raspico::

import machine,time

adc0 = machine.ADC(0)

f=100/65535

while True:

    v = adc0.read_u16()*f

    print(v)

    time.sleep(0.5)


for raspi400::

import serial

# pico に接続する

ser = serial.Serial('/dev/ttyACM0', 115200, timeout=1)

try:

    while True:

    # pico からデータを読む

     data = ser.readline()

    # データを文字列に変換

     s = data.decode()

    # 結果を表示

     print("read:", s.strip())

except:

    # picoとの接続を閉じる

    ser.close()

--------------------------- spi adt7310 -----

http://independence-sys.net/main/?p=383 に詳しい ブルーバックスのは

i2c adt7410 である なんでか、手持ちしていた

------------------------- graphic display ss1306 ------------------------------

https://dev.classmethod.jp/articles/raspberry-pi-4-ssd1306-oled-display/ 

ーーーーーーーーーーーーーーーdht11ーーー

https://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-the-raspberry-pi/ クジラ本のものが秋月になかったので、このサイトを参考にした

緑がシグナル、赤が電源3.3v、黒がグランドにした なんとか動いたようだが

10秒以上のインタバルをとらんといかんようだ(動作不安定となる)

-------------------------------- printer----------------------- 

https://deviceplus.jp/hobby/raspberrypi_entry_011/ プリンタインストに成功

共有仕様にせずSambaもいれず cannon ip110のドライバで成功した

ーーーーーーーーーーーad convertorーーーーーーーーーーーーー

https://101010.fun/iot/raspberry-pi-adc-mcp3008.html 型番は違うがADコンバータ説明

きわめてわかりやすいので収載した for mcp3208

https://denkisekkeijin.com/raspberrypi/pi-spi-volume-rd/ mcp3002 こっちのほうが簡便

得た値はビッグエンディアンつまり0,1でならんでいる 最初から10だけほしい

 resp = spi.xfer2([0x68, 0x00]) 16ビットで2バイトくれる

        # 読んだ値を10ビットの数値に変換 --- (*3)

        value = ((resp[0] << 8) + resp[1]) & 0x3FF これで最初の10ビットだけもらう

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

ラズベリーパイ4をSSD化で高速起動│FABSHOP.JP -デジタルでものづくり! ファブショップ !  環境をそのまま移行できる優れものサイト

https://qiita.com/mimimi-no-sesese/items/b67f61c3158a1d4cd359を参考に

wiringpi 26設置 GPIO動き出した! piwizで日本語もつかえるようになった!

https://qiita.com/tamamori/items/7d40bfb73b3a5766ce29 でarduinoIDEもいれた!

教科書を参考にnode.js,node-redも入れた

ラズベリーパイ4をSSD化で高速起動│FABSHOP.JP -デジタルでものづくり! ファブショップ ! で、まず32GのSDカードから32GのUSBメモリに移行をトライして成功

【ラズパイ高速化】HDD/SSDからOSを起動させる【USBブート】 | メタエレ実験室 (hellobreak.net) 未実施

Install Raspberry Pi Imager on Ubuntu using the Snap Store | Snapcraft 

ubuntuにRaspiImagerをいれた ラズパイ400では未実施

----------------------ubuntu ----------------------------------

-----------------   debian---------------------------------

 | 社内SEのITメモブログ (notepad-blog.com) fseigojp ALL=(ALL:ALL)  ALLとして  sudoerになれた

https://forums.ubuntulinux.jp/viewtopic.php?id=6964 にある処理してsudo apt-get upate できるようになった

「アプリケーション」->「アクセサリ」->「端末」から

コード:

sudo gedit /etc/apt/sources.list

としてsources.listを開いて、多分先頭くらいにある「cdrom://Ubuntu 9.04 _Jaunty Jackalope・・・」の部分に「#」(半角のシャープ)を付けて保存し、apt-get updateしてみてください。


2022年2月3日木曜日

espr2➃ sdc! rtc! dht11!, i2c-bme280/lcd,Portal, IDEsetting/SoftAp

ーーーーーーーsdc−−−−−−−−−−−

ESP8266でSPI通信する - Qiita? のピン配置でvccはvout(5V仕様にて) uno用の

サンプルスケッチ sd/readwrite.inoのSD.begin(4)をbegin(15)に変えて成功

CLKIO14defaultesp8266
MISOIO12defaultesp8266
MOSIIO13defaultesp8266
CSIO15defaultesp8266

--------rtc---------------------------------------------------------

ESPr Developerを使って、温度を測定し、サーバー上のSQLiteファイルに記録してみる | KatsEye (kats-eye.net) を参考に vccはvoutよりもらう(5V駆動にて)

esp32のRTC用のスケッチに Wire.begin(12,14) // SDA,SCL を加えて成功

------------dht11-----------------------------

ESP8266とDHT11とAmbientを使って部屋の温度と湿度をグラフ化 - Qiita

ambientのつかいかたまで載っている 良品サイト

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

ESP8266 with BME280 using Arduino IDE (Pressure, Temperature, Humidity) | Random Nerd Tutorials sda4,scl5をカスケードしてbme は3v、

lcdはVoutでとり(あとで3V3にしておいた、安全のため、字はうすくなるが)

Gndは共通として以下のコードで成功

#include <Wire.h> 

#include <LiquidCrystal_I2C.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

LiquidCrystal_I2C lcd(0x27,20,4); // 手持ちの20文字4行のディスプレイの設定

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C

unsigned long delayTime;

void setup()

{   Serial.begin(9600);

  Serial.println(F("BME280 test"));

  bool status;

  // default settings

  // (you can also pass in a Wire library object like &Wire2)

  status = bme.begin(0x76);  

  if (!status) {

    Serial.println("Could not find a valid BME280 sensor, check wiring!");

    while (1);

  }

  Serial.println("-- Default Test --");

  delayTime = 1000;             

  // initialize the lcd 

  lcd.init(); // Print a message to the LCD.

  lcd.backlight();

  lcd.setCursor(3,0);

  lcd.print("Hello, world!");

  lcd.setCursor(2,1);

  lcd.print("Ywrobot Arduino!");

   lcd.setCursor(1,2);

  lcd.print("Arduino LCM IIC 2004");

   lcd.setCursor(0,3);

  lcd.print("Power By Ec-yuan!");

 Serial.println();

  }

void loop()

  printValues();

  delay(delayTime);

  lcd.clear();

  lcd.setCursor(0,0);

  lcd.print("Temp *C= ");

  lcd.print(bme.readTemperature());

  lcd.setCursor(0,1);

  lcd.print("Press\ KhPa= ");

  lcd.print(bme.readPressure() / 100000.0F);

  lcd.setCursor(0,2);

  lcd.print("Humid %= ");

  lcd.print(bme.readHumidity());

  lcd.setCursor(0,3);

  lcd.print("Alti m= ");

  lcdf.print(bme.readAltitude(SEALEVELPRESSURE_HPA));

  }

void printValues() {

  Serial.print("Temperature = ");

  Serial.print(bme.readTemperature());

  Serial.println(" *C");

  

  // Convert temperature to Fahrenheit

    /*Serial.print("Temperature = ");

  Serial.print(1.8 * bme.readTemperature() + 32);

  Serial.println(" *F");*/

  

  Serial.print("Pressure = ");

  Serial.print(bme.readPressure() / 100.0F);

  Serial.println(" hPa");


  Serial.print("Approx. Altitude = ");

  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));

  Serial.println(" m");


  Serial.print("Humidity = ");

  Serial.print(bme.readHumidity());

  Serial.println(" %");


  Serial.println();

}

------------------portal site--------------------------------------------------

https://kats-eye.net/info/category/espr-developer/page/15/

--------------softAp of esp8266 ----------------------------

 https://www.mgo-tec.com/esp8266-board-install01-htmlを参考にした

(「Arduino実用入門」の設定でも動いたが)


以下が一番実用的かも ただしIPアドレスが後付けなのでシリアルモニタ必須
#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>

/* ESPR 自身をAP(アクセスポイント)とする接続 */
const char *ssid = "ESPR";                    // APモード:自身のSSID
const char *password = "ESPR0001";            // APモード:自身のパスワード

ESP8266WebServer server(80);               // WEBサーバーポート(80番)
const int led = 13;                           // LED用出力端子番号

/* ブラウザに表示するボタンなど html でString form = に続いて表記  */
// LEDオフ時のHTML
String form_off ="<html><head><meta name=viewport content=width=100></head>"
"<p>SW OFF</p>"
"<form action=ON><input type='submit' value='ON' style='background-color:khaki; color:white;'></form>"
"<form action=OF><input type='submit' value='OFF' style='background-color:blue; color:white;'></form>"
"</html>";

// LEDオン時のHTML
String form_on ="<html><head><meta name=viewport content=width=200></head>"
"<p>SW ON</p>"
"<form action=ON><input type='submit' value='ON' style='background-color:red; color:yellow;'></form>"
"<form action=OF><input type='submit' value='OFF' style='background-color:lightgray; color:gray;'></form>"
"</html>";

// 初回送信(LEDオフ時のHTML送信)
void handleRoot() {
    digitalWrite(led, 0);
    server.send(200, "text/html",form_off);
    Serial.println("OFF");
}

// LEDオン時のHTML送信
void LedOn(){
    digitalWrite(led, 1);
    server.send(200, "text/html", form_on);
    Serial.println("ON");
}

// LEDオフ時のHTML送信
void LedOff(){
    digitalWrite(led, 0);
    server.send(200, "text/html", form_off);
    Serial.println("OFF");
}

// 初回設定
void setup() {
    pinMode(led,OUTPUT);
    digitalWrite(led, 0);
    delay(1000);
    
    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");

    WiFi.softAP(ssid, password);             // APモード SSID/パスワード設定
    delay(1000);
    IPAddress myIP = WiFi.softAPIP();      // IPアドレス取得
    
    Serial.print("AP IP address: ");
    Serial.println(myIP);
    
    server.on("/", handleRoot);
    server.on("/ON", LedOn);
    server.on("/OF", LedOff);
    server.begin();
    
    Serial.println("HTTP server started");
}

// 連続処理
void loop() {
    server.handleClient();
}

https://iot.keicode.com/esp8266/esp8266-ap.phpでソフトアクセスポイントの記載あり

この方式の利点は、最初にIPアドレスを固定できることだ

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define WIFI_SSID "適当でいい"
#define WIFI_PWD "適当でいい"

ESP8266WebServer server( 80 );
IPAddress ip( 192, 168, 10, 1 );
IPAddress subnet( 255, 255, 255, 0 );

void setup() {

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(ip, ip, subnet);  
  WiFi.softAP(WIFI_SSID, WIFI_PWD);

  server.on("/", [](){
    server.send(
      200, 
      "text/html", 
      "<h1>Hello! Web Server!</h1>");
  });

  server.begin();
}

void loop() {
  server.handleClient();
}
ーーーーーーーーーー両者をあわせるとーーーーーーーーーーーー決定版ーーーー
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

/* ESPR 自身をAP(アクセスポイント)とする接続 */
const char *ssid = "ESPR";                    // APモード:自身のSSID
const char *password = "ESPR0001";            // APモード:自身のパスワード
IPAddress ip(192,168,10,1); //added code
IPAddress subnet(255,255,255,0); // added code
ESP8266WebServer server(80);               // WEBサーバーポート(80番)
const int led = 13;                           // LED用出力端子番号

/* ブラウザに表示するボタンなど html でString form = に続いて表記  */
// LEDオフ時のHTML
String form_off ="<html><head><meta name=viewport content=width=100></head>"
"<p>SW OFF</p>"
"<form action=ON><input type='submit' value='ON' style='background-color:khaki; color:white;'></form>"
"<form action=OF><input type='submit' value='OFF' style='background-color:blue; color:white;'></form>"
"</html>";

// LEDオン時のHTML
String form_on ="<html><head><meta name=viewport content=width=200></head>"
"<p>SW ON</p>"
"<form action=ON><input type='submit' value='ON' style='background-color:red; color:yellow;'></form>"
"<form action=OF><input type='submit' value='OFF' style='background-color:lightgray; color:gray;'></form>"
"</html>";

// 初回送信(LEDオフ時のHTML送信)
void handleRoot() {
    digitalWrite(led, 0);
    server.send(200, "text/html",form_off);
    Serial.println("OFF");
}

// LEDオン時のHTML送信
void LedOn(){
    digitalWrite(led, 1);
    server.send(200, "text/html", form_on);
    Serial.println("ON");
}

// LEDオフ時のHTML送信
void LedOff(){
    digitalWrite(led, 0);
    server.send(200, "text/html", form_off);
    Serial.println("OFF");
}

// 初回設定
void setup() {
    pinMode(led,OUTPUT);
    digitalWrite(led, 0);
    delay(1000);
   
    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");

    WiFi.mode(WIFI_AP);  // added code
    WiFi.softAPConfig(ip,ip,subnet); // added code
    WiFi.softAP(ssid, password);             // APモード SSID/パスワード設定
    delay(1000);
   // IPAddress myIP = WiFi.softAPIP();      // added codeにてIPアドレス取得は不要となる
    //Serial.print("AP IP address: ");
    //Serial.println(myIP);
   
    server.on("/", handleRoot);
    server.on("/ON", LedOn);
    server.on("/OF", LedOff);
    server.begin();
   
    Serial.println("HTTP server started");
}

// 連続処理
void loop() {
    server.handleClient();
}

------------  soft access あれこれ ----------------------------------
ESPr Developerをアクセスポイントにして接続する | KatsEye (kats-eye.net)
これが一番実用的だった
Raspberry Pi Pico MicroPython シリアル通信(UART) テスト - JH7UBCブログ (goo.ne.jp)
これをつかうとラズピコにWifi機能がつけられる
Raspberry Pi Picoに無線機能を付けてみました - 自由に工作中 (hatenablog.com)
これが上の発展形で最終形 ソフトアクセスポイントのipを自由に設定できるノウハウ込み
ちなみに、単体使用のためのバッテリはVINをつかう
http://kujiraiken.sit.ac.jp/blog/2019/06/esp-wroom-02-with-battery/ に詳しい
DCモータ作動であれば単三x3は欲しい