2026年10月23日金曜日

kalumajs esp8266httpclient OK, but http-client-raspicow Drafted

--------------以下は最初は動くがだんだんremote errorとなる。。。。tethering revenge

kill -9 $(lsof -t -i:3000)でいちいちportを閉じるのが重要だった

//$ mkdir thermo-server

// $ cd thermo-server

//$ npm init -y

//$ npm install express ip --save

-----------原著どうり-----wifi環境よわく、tetheringで動かしてOKだった----------------------------

const express = require('express');

const ip = require('ip');

const app = express();

const addr = ip.address();

const port = 3000;

let temperature = '0.0';

let humidity = '0';

app.get('/update', (req, res) => {

   if (req.query.t) temperature = req.query.t;

   if (req.query.h) humidity = req.query.h;

res.status(200).send('OK');

});

app.get('/', (req, res) => {

  res.setHeader('Content-Type', 'text/html');

  res.send(`

<html>

  <body>

   <h1>${temperature}</h1>

   <h1>${humidity}</h1>

  </body>

</html>

  `);

});

--- index.js------------これも原著どうりだ、ATベタ書きはパスした--------

const {DHT} = require('dht');
const {ESP8266HTTPClient} = require('esp8266-http-client');
const dht = new DHT(15,DHT.DHT11);
const esp = new ESP8266HTTPClient();

// ここでコンストラクタのくだりを読むとssid,passwordが設定される仕組み
// よってesp.wifi()でコネクトできる

storage.setItem('WIFI_SSID', 'HUAWEI@nova@lite@3+');
storage.setItem('WIFI_PASSWORD', '99991111');
storage.setItem('ADDRESS', '192.168.43.140'); // nodejsで決定されるIP
storage.setItem('PORT', '3000');
const addr = storage.getItem('ADDRESS');
const port = storage.getItem('PORT');

function start(){
 setInterval(() => {
  dht.read();
  let t = dht.temperature.toFixed(1);
  let h = dht.humidity.toFixed(0);
  esp.http(`http:://${addr}:${port}/update?t=${t}&h=${h}`)
   .then(() => {
     console.log(`/update?${t}&h=${h}`);
   });
  },10000);
}

esp.wifi().then(() => {
  console.log('wifi connected');
  start();
}).catch(err => {
  console.log('wifi connect failed');
  console.log(err);
});


-----------------------------------
以下がモタモタコード....

const { DHT } = require('dht');
const { WiFi } = require('wifi');
const http = require('http');

// Wi-Fi設定
const WIFI_SSID = 'HUAWEI@nova@lite@3+';
const WIFI_PASSWORD = '99991111';

// Node.jsサーバー
const SERVER_ADDRESS = '192.168.43.140';
const SERVER_PORT = 3000;

// DHT11:GP15
const dht = new DHT(15, DHT.DHT11);
const wifi = new WiFi();

let sending = false;
let timerStarted = false;

// HTTP送信
function sendData() {
  if (sending) {
    console.log('Previous request is running');
    return;
  }

  let temperature;
  let humidity;

  try {
    dht.read();

    temperature = dht.temperature;
    humidity = dht.humidity;

    if (
      typeof temperature !== 'number' ||
      typeof humidity !== 'number' ||
      !Number.isFinite(temperature) ||
      !Number.isFinite(humidity)
    ) {
      console.log('Invalid DHT11 data:',
        temperature, humidity);
      return;
    }

    temperature = temperature.toFixed(1);
    humidity = humidity.toFixed(0);
  } catch (err) {
    console.log('DHT11 read error:', err);
    return;
  }

  const path =
    '/update?t=' + encodeURIComponent(temperature) +
    '&h=' + encodeURIComponent(humidity);

  sending = true;

  console.log('HTTP GET:', path);

  let req;

  try {
    req = http.get({
      host: SERVER_ADDRESS,
      port: SERVER_PORT,
      path: path
    }, function (res) {
      console.log('HTTP status:', res.statusCode);

      res.on('data', function (chunk) {
        console.log('HTTP body:', chunk);
      });

      res.on('end', function () {
        console.log('HTTP response complete');
        sending = false;
      });

      res.on('error', function (err) {
        console.log('HTTP response error:', err);
        sending = false;
      });

      res.on('close', function () {
        // endイベントが発生しない場合にも送信状態を解除
        sending = false;
      });
    });

    req.on('error', function (err) {
      console.log('HTTP request error:', err);
      sending = false;
    });
  } catch (err) {
    console.log('HTTP start error:', err);
    sending = false;
  }
}

// Wi-Fi接続成功後に開始
function start() {
  if (timerStarted) return;
  timerStarted = true;

  console.log('Wi-Fi connected');

  sendData();

  setInterval(function () {
    sendData();
  }, 10000);
}

// 起動
console.log('Connecting to Wi-Fi...');

wifi.connect({
  ssid: WIFI_SSID,
  password: WIFI_PASSWORD
}, function (err) {
  if (err) {
    console.log('Wi-Fi connect failed:', err);
    return;
  }

  start();
});

2026年10月19日月曜日

tinygo on pico with sht35(sh3xシリーズ)

// go get tinygo.org/x/drivers

// tinygo flash -target pico . after set boot mode at pico

package main

import (

"fmt"

"machine"

"time"

"tinygo.org/x/drivers/sht3x"

)


func main() {

// シリアル通信(USB)の準備を待つためのディレイ

time.Sleep(2 * time.Second)

fmt.Println("--- SHT3x 温湿度センサー 開始 ---")


// 1. I2Cの初期化 (Picoの標準ピン GPIO4/GPIO5 を使用)

err := machine.I2C0.Configure(machine.I2CConfig{

Frequency: machine.TWI_FREQ_400KHZ, // 400kHz

SDA:       machine.GP4,             // Pin 6

SCL:       machine.GP5,             // Pin 7

})

if err != nil {

println("I2Cの初期化に失敗しました:", err.Error())

return

}


// 2. SHT3x ドライバーの初期化

// ※ アドレスはモジュールによって 0x44 (デフォルト) または 0x45 です。

// ※ 動かない場合は sht3x.AddressB (0x45) に変更してみてください。

sensor := sht3x.New(machine.I2C0)

sensor.Address = sht3x.AddressA // 0x44


// 3. 2秒ごとにデータを読み取って表示するループ

for {

// センサーから温度と湿度を読み取る

//(内部でSHT3xのコマンド送信、データ取得、CRCチェックが行われます)

temp, humi, err := sensor.ReadTemperatureHumidity()

if err != nil {

fmt.Println("データの読み取りに失敗しました:", err.Error())

} else {

// tinygoのドライバーは、温度を「ミリ度(1/1000℃)」、湿度を「1/100 %」で返します

// 例: 25000ミリ度 = 25.00℃

tCelsius := float64(temp) / 1000.0

hPercent := float64(humi) / 100.0

// シリアルモニターに出力

fmt.Printf("温度: %.2f °C | 湿度: %.2f %%\n", tCelsius, hPercent)

}

time.Sleep(2 * time.Second)

}

}

2026年10月12日月曜日

MMBasic ファイル操作(picocom最終版)

picocom -b 115200 --omap delbs -s "sz --xmodem" /dev/ttyACM0 で転送可能となる 

ctl-a,ctl-xで終了

https://qiita.com/ksakabe/items/2ecfcfd346ef7f857b34 も参考になる

mmbasic picocomでpcからpicoへmmbasicを贈りたいPicoMite (MMBasic) 

を実行中のRaspberry Pi PicoへPCからファイルを転送するには、Pico側のXMODEM RECEIVEコマンドと、picocom のXMODEM送信機能(Ctrl-A 続いて Ctrl-S) を組み合わせて使用します。あらかじめホストPC側に lrzsz(sxコマンド)をインストール。

1.転送の手順PicoMite側で受信待機picocomでPicoに接続します。MMBasicのプロンプトで次のように入力してEnterキーを押します。

XMODEM RECEIVE 

コードは注意してご使用ください。(※画面が止まった/待機状態になったようになります)

picocomからファイルを送信キーボードの

Ctrl-A を押し、続けて Ctrl-Sを押します。画面下部に送信する、そのPCディレクトリのファイルのパス(ファイル名)を尋ねられるので、PC側のファイル名を入力してEnterキーを押すと転送が始まります。

cf 保存されたファイルの一覧を見る

(FILES)SDカードや内蔵フラッシュドライブに保存されているファイル名の一覧を表示します。basic FILES

2. ファイルの中身を画面に表示する

(TYPE)転送されたプログラムの内容が正しいか、テキストとして画面に表示して確認します。basic TYPE "try.bas"

3. プログラムをメモリに読み込んで実行する 

(LOAD RUN)ファイルをメモリにロードして実行します。basic LOAD "try.bas" RUN

4.プログラムをメモリからセーブしてマイコンでfilesできるようにする

(SAVE) basic SAVE "filename.bas"

5.プログラムをその場で編集・確認する

(EDIT)PicoMite内蔵のフルスクリーンエディタでファイルを開きます。basic EDIT "try.bas"

F1 キー(またはCtrl+Q)を押すとメニューが出るので、保存して終了、または保存せずに終了を選べます。

6.メモリ上のプログラムを消去するにはbasic new,

フラッシュ上のプログラムを消去するにはbasic kill  "filename.bas"

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



mmbasic pcのファイルをraspicoとやりとりしたい!!

 sudo picocom -b 115200 --omap delbs /dev/ttyACM0と,もう一つxterminalを立ち上げる

1. MMBasic 側で受信待機にする

MMBasic のプロンプトで以下のいずれかを実行します(保存先に応じて選んでください)。
  • プログラムメモリ(RAM)に直接読み込む場合:
    basic
    XMODEM RECEIVE
    
    コードは注意してご使用ください。
  • SDカードやフラッシュ内のファイルとして保存する場合:
    basic
    XMODEM RECEIVE "foo.bas"
    
    コードは注意してご使用ください。
2. Linux(PC)側から XMODEM で送信する
使用しているシリアル通信環境に合わせて、sx コマンドを使ってファイルを送信します。 [1, 2]
GNU screen を使用している場合:
シリアルセッション中に Ctrl+A を押した後、:exec !! sx foo.bas と入力するか、一度端末をバックグラウンドにして以下のようにリダイレクトします。 [1]
bash
sx foo.bas < /dev/ttyACM0 > /dev/ttyACM0
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
まずエディタからもどってRAM内容をsave "foo.bas"とする
成功しているかfilesで確認する
1. MMBasic(マイコン)側で送信コマンドを実行する
MMBasicのプロンプトで、送信したいファイル名を指定して XMODEM SEND(または省略形の XMODEM S)を実行します。 [1, 2]
  • SDカードやフラッシュ内のファイルを送信する場合:
    basic
    XMODEM SEND "foo.bas"
    
    コードは注意してご使用ください。
  • 現在メモリ(RAM)にあるプログラムをそのまま送信する場合:
    basic
    XMODEM SEND
    
    コードは注意してご使用ください。
コマンドを実行すると、マイコンはPC側からの受信開始合図(NAK文字など)を待つ状態(待機状態)になります。 [1, 2]
2. PC(Linux)側で XMODEM 受信を実行する
マイコンが待機状態になったら、60秒以内にPC側で受信コマンドを実行してください。Linuxでは rx コマンド(XMODEM受信ツール)を使用します。 [1]
一般的なシリアルポート(例: /dev/ttyACM0)で直接やり取りする場合:
端末(ターミナル)を開き、以下のコマンドを実行してファイルを受け取ります。
bash
rx foo.bas < /dev/ttyACM0 > /dev/ttyACM0
コードは注意してご使用ください。