0

我是Processing和 Arduino 的新手。我想将 Arduino 和湿度传感器SHT75与 Processing 连接,以获取湿度和温度数据并将其显示在 GUI 上。安装传感器库后,我可以使用 Arduino IDE 轻松控制 SHT75 传感器并使用串行监视器接收数据(链接)。这是Arduino代码:

#include <Sensirion.h>

const uint8_t dataPin =  9;              // SHT serial data
const uint8_t sclkPin =  8;              // SHT serial clock
const uint8_t ledPin  = 13;              // Arduino built-in LED
const uint32_t TRHSTEP   = 5000UL;       // Sensor query period
const uint32_t BLINKSTEP =  250UL;       // LED blink period

Sensirion sht = Sensirion(dataPin, sclkPin);

uint16_t rawData;
float temperature;
float humidity;
float dewpoint;

byte ledState = 0;
byte measActive = false;
byte measType = TEMP;

unsigned long trhMillis = 0;             // Time interval tracking
unsigned long blinkMillis = 0;

void setup() {
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);
    delay(15);                           // Wait >= 11 ms before first cmd
    // Demonstrate blocking calls
    sht.measTemp(&rawData);              // sht.meas(TEMP, &rawData, BLOCK)
    temperature = sht.calcTemp(rawData);
    sht.measHumi(&rawData);              // sht.meas(HUMI, &rawData, BLOCK)
    humidity = sht.calcHumi(rawData, temperature);
    dewpoint = sht.calcDewpoint(humidity, temperature);
    logData();
}

void loop() {
    unsigned long curMillis = millis();          // Get current time

    // Rapidly blink LED.  Blocking calls take too long to allow this.
    if (curMillis - blinkMillis >= BLINKSTEP) {  // Time to toggle the LED state?
        ledState ^= 1;
        digitalWrite(ledPin, ledState);
        blinkMillis = curMillis;
    }

    // Demonstrate non-blocking calls
    if (curMillis - trhMillis >= TRHSTEP) {      // Time for new measurements?
        measActive = true;
        measType = TEMP;
        sht.meas(TEMP, &rawData, NONBLOCK);      // Start temp measurement
        trhMillis = curMillis;
    }
    if (measActive && sht.measRdy()) {           // Note: no error checking
        if (measType == TEMP) {                  // Process temp or humi?
            measType = HUMI;
            temperature = sht.calcTemp(rawData); // Convert raw sensor data
            sht.meas(HUMI, &rawData, NONBLOCK);  // Start humidity measurement
        }
        else {
            measActive = false;
            humidity = sht.calcHumi(rawData, temperature); // Convert raw sensor data
            dewpoint = sht.calcDewpoint(humidity, temperature);
            logData();
        }
    }
}

void logData() {
    Serial.print("Temperature = ");
    Serial.print(temperature);

    Serial.print(" C, Humidity = ");
    Serial.print(humidity);

    Serial.print(" %, Dewpoint = ");
    Serial.print(dewpoint);
    Serial.println(" C");
}

使用带有 Arduino 库(Firmata)的处理,我可以轻松地与其他模拟(例如LDR)或I²C传感器通信(只需遵循网络上提供的数千个教程!),但我不知道如何连接 Arduino +带有处理 IDE 的 SHT75。SHT75 传感器具有一种类似 I²C 的通信协议。这是数据表。我试过使用“serial.Arduino”命令(两者import processing.serialimport cc.arduino使用过),但没有。我该如何解决这个问题?

4

2 回答 2

0

根据数据表:

SHT7x 的串行接口针对传感器读数和有效功耗进行了优化。传感器无法通过 I²C 协议寻址,但是,传感器可以连接到 I²C 总线,而不会干扰连接到总线的其他设备。微控制器必须在协议之间切换。”

这意味着物理层(电压、时序和总线类型)与 I²C 兼容。但该芯片不使用标准 I²C 数据包。因此,您可以使用 Arduino 中嵌入的 I²C 总线,但不能使用 I²C 库。您必须自己处理芯片的低级 I²C 模块。

幸运的是,这并不难,因为 I²C 并不是那么微妙,您甚至可以使用直接 GPIO 控制而不是嵌入式 I²C 模块来执行有效的 I²C 数据包。这将需要一些时间,但在没有广泛的微控制器或电子知识的情况下也是可行的。

于 2012-09-28T07:15:02.497 回答
0

如果您在 Arduino 的串行监视器中接收到值,这意味着一切都很好,您只需从处理中的串行端口读取该值。

在这里,您有一个示例,说明您必须在处理草图中做什么:

import processing.serial.*;

Serial myPort;

void setup() {
    // List all the available serial ports:
    println(Serial.list());
    // Open the port you are using at the rate you want:
    myPort = new Serial(this, Serial.list()[0], 9600);
}

void draw() {
    while (myPort.available() > 0) {
        int inByte = myPort.read();
        println(inByte);
    }
}

这是取自这里。这很容易:) 请记住,要让一切正常工作,您必须关闭 Arduino 中的串行监视器。

于 2012-10-03T09:25:00.583 回答