赞
踩
设置温度湿度阈值,当温度过高时,打开风扇,蜂鸣器报警
当湿度比较高时,打开LED1灯,蜂鸣器报警
#include"si7006.h" #include"led.h" #include"fan.h" #include"buzzer.h" //风扇 PE9 //蜂鸣器 PB6 int main() { //i2c初始化 i2c_init(); //si7006初始化 si7006_init(); //风扇初始化 fan_init(); //蜂鸣器初始化 buzzer_init(); all_led_init(); short tem; unsigned int short hum; while(1) { //读取温度数据 tem=si7006_read_tem(); //读取湿度数据 hum=si7006_read_hum(); //计算温湿度数据 hum=125*hum/65536-6; tem=175.72*tem/65536-46.85; if(hum>=50) { LED1_ON(); }else{ LED1_OFF(); } if(tem>=20) { fan_on(); buzzer_on(); }else{ fan_off(); buzzer_off(); } delay(1000); printf("hum:%d\n",hum); printf("tem:%d\n",tem); //串口打印 delay(1000); } return 0; }
fan.c
#include "fan.h" //风扇 PE9 void fan_init() { //GPIOE时钟使能 RCC->MP_AHB4ENSETR |= (0x1<<4); //PE9设置为输出 GPIOE->MODER &= (~(0X3<<18)); GPIOE->MODER |= (0X1<<18); //PE9设置为推挽输出 GPIOE->OTYPER &= (~(0X1<<9)); //PE9设置为低速输出 GPIOE->OSPEEDR &= (~(0X3<<9)); //PE9无上拉下拉电阻 GPIOE->PUPDR &= (~(0X3<<18)); //默认输出低电平 GPIOE->ODR &= (~(0X1<<9)); } void fan_on() { GPIOE->ODR |= (0X1<<9); } void fan_off() { GPIOE->ODR &= (~(0X1<<9)); }
buzzer.c
#include "buzzer.h" //蜂鸣器 PB6 void buzzer_init() { //GPIOB时钟使能 RCC->MP_AHB4ENSETR |= (0x1<<1); //PB6设置为输出 GPIOB->MODER &= (~(0X3<<12)); GPIOB->MODER |= (0X1<<12); //PB6设置为推挽输出 GPIOB->OTYPER &= (~(0X1<<6)); //PB6设置为低速输出 GPIOB->OSPEEDR &= (~(0X3<<12)); //PB6无上拉下拉电阻 GPIOB->PUPDR &= (~(0X3<<12)); //默认输出低电平 GPIOB->ODR &= (~(0X1<<6)); } void buzzer_on() { GPIOB->ODR |= (0X1<<6); } void buzzer_off() { GPIOB->ODR &= (~(0X1<<6)); }
si7006.c
#include"si7006.h" //封装延时函数 void delay(int ms) { int i,j; for(i=0;i<ms;i++) { for(j=0;j<2000;j++) {} } } void si7006_init() { //发起起始信号 i2c_start(); //发送从机地址+写标志 i2c_write_byte(0X40<<1|0); //等待从机应答 i2c_wait_ack(); //发送寄存器地址 0XE6 i2c_write_byte(0XE6); //等待从机应答 i2c_wait_ack(); //传输要写入的数据0X3A、 i2c_write_byte(0X3A); //等待从机应答 i2c_wait_ack(); //发送终止信号 i2c_stop(); } short si7006_read_tem() { short tem; char tem_h,tem_l; //发起起始信号 i2c_start(); //发送从机地址+写标志 i2c_write_byte(0x40<<1|0); //等待从机应答 i2c_wait_ack(); //发送寄存器地址 0XE3 i2c_write_byte(0xe3); //等待从机应答 i2c_wait_ack(); //重复起始信号 i2c_start(); //发送从机地址+读标志 i2c_write_byte(0x40<<1|1); //等待从机应答 i2c_wait_ack(); delay(100);//等待从机测量数据 //接收数据高八位 //发送应答信号 tem_h=i2c_read_byte(0); //接收数据低八位 //发送非应答信号 tem_l=i2c_read_byte(1); //将高八位和低八位合成一个数据 高八位<<8|低8位 tem=tem_h<<8|tem_l; return tem; } unsigned short si7006_read_hum() { unsigned short hum; unsigned char hum_h,hum_l; //发起起始信号 i2c_start(); //发送从机地址+写标志 i2c_write_byte(0x40<<1|0); //等待从机应答 i2c_wait_ack(); //发送寄存器地址 0XE3 i2c_write_byte(0xe5); //等待从机应答 i2c_wait_ack(); //重复起始信号 i2c_start(); //发送从机地址+读标志 i2c_write_byte(0x40<<1|1); //等待从机应答 i2c_wait_ack(); delay(100);//等待从机测量数据 //接收数据高八位 //发送应答信号 hum_h=i2c_read_byte(0); //接收数据低八位 //发送非应答信号 hum_l=i2c_read_byte(1); //将高八位和低八位合成一个数据 高八位<<8|低8位 hum=hum_h<<8|hum_l; return hum; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。