2026年10月23日金曜日

kalumajs esp8266httpclient OK

--------------以下は最初は動くがだんだん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

----------server--原著どうり-----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>

  `);

});

app.listen(port ,  () =>{

   console.log(`server:${addr}:${port}`);

});

--- 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();
});

0 件のコメント:

コメントを投稿