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