我是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 Library处理(Firmata),我可以轻松地与其他模拟(例如LDR)或I²C传感器进行通信(只需遵循Web上可用的数千个教程!),但我不知道如何将Arduino + SHT75与Processing IDE接口。 SHT75传感器具有类似I²C的通信协议。这是数据表。我已尝试使用“serial.Arduino”命令(已使用import processing.serial
和import cc.arduino
),但没有。我该如何解决这个问题?
答案 0 :(得分:0)
根据数据表:
SHT7x的串行接口针对传感器进行了优化 读数和有效功耗。传感器 但是,传感器无法通过I²C协议进行寻址 可以连接到I²C总线而不会受到干扰 连接到总线的其他设备。微控制器必须 在协议之间切换。“
这意味着物理层(电压,时序和总线类型)与I²C兼容。但该芯片不使用标准的I²C数据包。因此,您可以使用Arduino中嵌入的I²C总线,但不能使用I²C库。你必须自己处理芯片的低级I²C模块。
幸运的是,这并不是那么困难,因为I²C并不那么微妙,您甚至可以使用直接GPIO控制而不是嵌入式I²C模块来执行有效的I²C数据包。这需要一些时间,但如果没有对微控制器或电子设备的广泛了解,这是可行的。
答案 1 :(得分:0)
如果您收到Arduino串行监视器中的值,则表示一切正常,您只需从Processing中的串行端口读取该值。
以下是您在处理sketch时需要执行的操作的示例:
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);
}
}
这取自here。这很容易:)请记住,要使一切正常工作,您必须关闭Arduino中的串行监视器。