Nodejs 各位大神,谁能帮我把这段代码写成nodejs版的啊,谢谢啦

Nodejs 各位大神,谁能帮我把这段代码写成nodejs版的啊,谢谢啦


/*

  • dht11.c:
  • Simple test program to test the wiringPi functions
  • DHT11 test */

#include <wiringPi.h>

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAXTIMINGS 85 #define DHTPIN 7 int dht11_dat[5] = {0,0,0,0,0};

void read_dht11_dat() { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i; float f; // fahrenheit

dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

// pull pin down for 18 milliseconds pinMode(DHTPIN, OUTPUT); digitalWrite(DHTPIN, LOW); delay(18); // then pull it up for 40 microseconds digitalWrite(DHTPIN, HIGH); delayMicroseconds(40); // prepare to read the pin pinMode(DHTPIN, INPUT);

// detect change and read data for ( i=0; i< MAXTIMINGS; i++) { counter = 0; while (digitalRead(DHTPIN) == laststate) { counter++; delayMicroseconds(1); if (counter == 255) { break; } } laststate = digitalRead(DHTPIN);

if (counter == 255) break;

// ignore first 3 transitions
if ((i &gt;= 4) &amp;&amp; (i%2 == 0)) {
  // shove each bit into the storage bytes
  dht11_dat[j/8] &lt;&lt;= 1;
  if (counter &gt; 16)
    dht11_dat[j/8] |= 1;
  j++;
}

}

// check we read 40 bits (8bit x 5 ) + verify checksum in the last byte // print it out if data is good if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF)) ) { f = dht11_dat[2] * 9. / 5. + 32; printf(“Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n”, dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f); } else { printf(“Data not good, skip\n”); } }

int main (void) {

printf (“Raspberry Pi wiringPi DHT11 Temperature test program\n”) ;

if (wiringPiSetup () == -1) exit (1) ;

while (1) { read_dht11_dat(); delay(1000); // wait 1sec to refresh }

return 0 ; }


4 回复

好的,下面是将 C 语言代码转换为 Node.js 版本的示例。我们将使用 onoffgpiod 模块来读取 GPIO 引脚的数据。

示例代码

首先,确保你已经安装了必要的依赖项:

npm install onoff gpiod

然后,你可以创建一个名为 dht11.js 的文件,并添加以下代码:

const Gpio = require('gpiod');
const { Readable } = require('stream');

class DHT11 extends Readable {
  constructor(chip, line) {
    super({ objectMode: true });
    this.chip = new Gpio.Chip(chip);
    this.line = this.chip.getLine(line);
    this.line.request({ direction: Gpio.DIRECTION.INPUT, consumer: 'DHT11' });
  }

  async read() {
    const data = [0, 0, 0, 0, 0];
    const maxTimings = 85;
    let lastState = 1;
    let counter = 0;
    let j = 0;

    // Pull pin down for 18 milliseconds
    this.line.setValue(0);
    await this.sleep(18);
    
    // Then pull it up for 40 microseconds
    this.line.setValue(1);
    await this.sleep(40);
    
    // Prepare to read the pin
    this.line.setValue(1);
    this.line.setInputConfig(Gpio.INPUT_CONFIG_PULL_UP);

    // Detect change and read data
    for (let i = 0; i < maxTimings; i++) {
      counter = 0;
      while (this.line.getValue() === lastState) {
        counter++;
        await this.sleep(1);
        if (counter >= 255) {
          break;
        }
      }
      lastState = this.line.getValue();

      if (counter >= 255) break;

      // Ignore first 3 transitions
      if (i >= 4 && i % 2 === 0) {
        // Shove each bit into the storage bytes
        data[j / 8] <<= 1;
        if (counter > 16) {
          data[j / 8] |= 1;
        }
        j++;
      }
    }

    // Check we read 40 bits (8bit x 5) + verify checksum in the last byte
    // Print it out if data is good
    if (j >= 40 && data[4] === ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
      const temperatureC = data[2];
      const temperatureF = temperatureC * 9 / 5 + 32;
      console.log(`Humidity = ${data[0]}.${data[1]} % Temperature = ${temperatureC}.${data[3]} *C (${temperatureF.toFixed(1)} *F)`);
    } else {
      console.log('Data not good, skip');
    }
  }

  sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  _read() {
    this.read();
  }
}

const dht11 = new DHT11('gpiochip0', 7);

setInterval(() => {
  dht11.read();
}, 1000);

解释

  1. 初始化

    • 使用 gpiod 模块请求 GPIO 引脚。
    • 创建一个 DHT11 类,继承自 Readable 流,以便我们可以轻松地读取数据。
  2. 读取数据

    • 通过设置 GPIO 引脚的值来触发 DHT11 传感器。
    • 读取引脚状态并解析数据。
    • 验证数据的有效性,并计算湿度和温度。
  3. 循环读取

    • 使用 setInterval 每秒调用一次 read 方法以获取新的数据。

这样,你就有了一个基于 Node.js 的 DHT11 温湿度传感器读取程序。


外包?

可以参考,帮忙写就太为难了。。 http://blog.whattoc.com/2013/09/08/nodejs_api_addon_4/

当然可以!以下是将上述 C 语言代码转换为 Node.js 版本的示例。这里我们使用 onoffbcdirect-io 这两个库来读取 GPIO 引脚的状态。

首先,安装必要的依赖库:

npm install onoff bcdirect-io

然后,使用以下代码实现 DHT11 传感器的数据读取:

const Gpio = require('bcdirect-io');
const GpioSensor = require('onoff').Gpio;

const DHT_PIN = 7;

function readDht11Dat() {
  const gpio = new Gpio(DHT_PIN, 'in', 'both');

  let lastState = 1;
  let counter = 0;
  let j = 0;
  const data = [0, 0, 0, 0, 0];

  gpio.writeSync(0); // 拉低引脚18毫秒
  setTimeout(() => {
    gpio.writeSync(1); // 拉高引脚40微秒
    setTimeout(() => {
      gpio.watch((err, value) => {
        if (value !== lastState) {
          counter++;
          if (counter > 255) {
            return;
          }

          if ((j >= 4) && (j % 2 === 0)) {
            data[Math.floor(j / 8)] <<= 1;
            if (counter > 16) {
              data[Math.floor(j / 8)] |= 1;
            }
            j++;
          }
          lastState = value;
        }
      });
    }, 40);
  }, 18);

  setTimeout(() => {
    gpio.unexport();
  }, 85 * 1000);

  setTimeout(() => {
    if (j >= 40 && data[4] === ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
      const temperatureCelsius = data[2];
      const temperatureFahrenheit = temperatureCelsius * 9 / 5 + 32;
      console.log(`Humidity = ${data[0]}.${data[1]}% Temperature = ${temperatureCelsius}.${data[3]}°C (${temperatureFahrenheit.toFixed(1)}°F)`);
    } else {
      console.log('Data not good, skip');
    }
  }, 85 * 1000);
}

setInterval(readDht11Dat, 1000);

这段代码实现了从 DHT11 传感器读取温度和湿度数据,并打印到控制台。每隔一秒执行一次读取操作。

回到顶部