利用c编写一个利用DS18B0温度传感器检测温度,控制大棚放风机的软件。软件包括自动模式和手动模式,自动模式下,DS18B0检测温度大于额定温度,放风模式开启,小于额定温度,方法模式关闭。按钮包括:额定温度设置、开启、暂停、关闭
时间: 2024-01-19 13:04:46 浏览: 115
以下是一个简单的利用C语言编写的DS18B20温度传感器检测温度、控制大棚放风机的软件,包括手动模式和自动模式,额定温度可手动设置,按钮包括开启、暂停和关闭。
```c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <time.h>
#include <string.h>
#define PIN 7 // DS18B20数据线连接的GPIO
#define MAX_TIME 85
#define DHT11_READY 0
#define DHT11_ERROR -1
#define DHT11_OUT 28
#define LED_PIN 0 // 控制放风机的GPIO
#define TEMP_THRESHOLD 28 // 温度阈值
int dht11_val[5] = { 0, 0, 0, 0, 0 };
int temp = 0;
int humi = 0;
int mode = 0; // 0表示手动模式,1表示自动模式
int running = 0; // 0表示未运行,1表示正在运行
int temp_set = 26; // 额定温度
int read_dht11_dat() {
uint8_t laststate = DHT11_READY;
uint8_t counter = 0;
uint8_t j = 0, i;
float f;
dht11_val[0] = dht11_val[1] = dht11_val[2] = dht11_val[3] = dht11_val[4] = 0;
pinMode(DHT11_OUT, OUTPUT);
digitalWrite(DHT11_OUT, LOW);
delay(18);
digitalWrite(DHT11_OUT, HIGH);
delayMicroseconds(40);
pinMode(DHT11_OUT, INPUT);
for (i = 0; i < MAX_TIME; i++) {
counter = 0;
while (digitalRead(DHT11_OUT) == laststate) {
counter++;
delayMicroseconds(1);
if (counter == 255) {
break;
}
}
laststate = digitalRead(DHT11_OUT);
if (counter == 255) break;
if ((i >= 4) && (i % 2 == 0)) {
dht11_val[j / 8] <<= 1;
if (counter > 16) dht11_val[j / 8] |= 1;
j++;
}
}
if ((j >= 40) &&
(dht11_val[4] == ((dht11_val[0] + dht11_val[1] + dht11_val[2] + dht11_val[3]) & 0xFF))) {
humi = dht11_val[0];
temp = dht11_val[2];
return DHT11_READY;
} else {
return DHT11_ERROR;
}
}
void fan_on() {
digitalWrite(LED_PIN, HIGH);
}
void fan_off() {
digitalWrite(LED_PIN, LOW);
}
void set_temp() {
printf("请输入额定温度:");
scanf("%d", &temp_set);
printf("额定温度已设置为%d°C\n", temp_set);
}
void start() {
if (running) {
printf("已经在运行了!\n");
return;
}
running = 1;
printf("放风机已开启,当前温度:%d°C\n", temp);
fan_on();
}
void pause() {
if (!running) {
printf("还没有开启!\n");
return;
}
running = 0;
printf("放风机已暂停,当前温度:%d°C\n", temp);
fan_off();
}
void stop() {
if (!running) {
printf("还没有开启!\n");
return;
}
running = 0;
printf("放风机已关闭\n");
fan_off();
}
int main() {
if (wiringPiSetup() == -1) {
printf("wiringPi初始化失败!\n");
return 1;
}
pinMode(LED_PIN, OUTPUT);
while (1) {
int ret = read_dht11_dat();
if (ret == DHT11_ERROR) {
printf("读取传感器数据失败!\n");
continue;
}
printf("温度:%d°C\n", temp);
if (mode == 0) {
if (running && temp >= temp_set) {
pause();
} else if (!running && temp < temp_set) {
start();
}
} else {
if (temp >= TEMP_THRESHOLD) {
start();
} else {
pause();
}
}
delay(1000);
}
return 0;
}
```
这个程序使用了wiringPi库来控制GPIO,使用了DS18B20温度传感器来检测温度,使用了一个LED来控制放风机,同时支持手动模式和自动模式。
手动模式下,可以通过额定温度设置按钮手动设置额定温度,然后通过开启、暂停和关闭按钮来控制放风机的开启、暂停和关闭。
自动模式下,当温度大于等于设定的温度阈值时,放风机会自动开启,否则会自动关闭。
阅读全文