Датчик влажности и температуры DHT11 + pic12f675+TM1637
/*
* File: newmain.c
* Author: User
*
* Created on 19 ?????? 2024 ?., 14:20
*/
#include <htc.h>
#pragma config WDTE=OFF, MCLRE=OFF, FOSC=INTRCIO, CP=OFF
#define _XTAL_FREQ 4000000
#define DIO GPIO4 //pin3
#define CLK GPIO5 //pin2
#define DIOio TRISIO4 // input or output
#define Data GPIO2 //sensor pin5
#define DataDir TRISIO2 //sensor input or output
//prototypes
void display( unsigned char addr, unsigned char fig );
void sendData(unsigned char dataB);
void startBit(void);
void stopBit(void);
void clock(void);
void dht11_init(void);
unsigned short find_response();
unsigned short read_dht11();
unsigned int counter = 0, TempC, RH;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
const unsigned char num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0,1,2,3...9
unsigned short TOUT = 0,CheckSum, i, check;
void main(void){
unsigned char i;
GPIO = 0b00000000;
TRISIO = 0b00001100; //
ANSEL = 0; //
CMCON = 7; //
OPTION_REG = 0; //pullup
CLK=1;
DIO=1;
GIE = 1; //Enable global interrupt
PEIE = 1; //Enable peripheral interrupt
// Configure Timer2 module
TMR1IE = 1; // Enable Timer1 interrupt
T1CON = 0; // Prescaler 1:1, and Timer1 is off initially
TMR1IF =0; // Clear TMR INT Flag bit
TMR1H = 0;
TMR1L = 0;
do{
dht11_init();
check = find_response();
if (!check) {
RH = 0;
TempC = 0;
}
else{
RH_Byte1 = read_dht11();
RH_Byte2 = read_dht11();
T_Byte1 = read_dht11();
T_Byte2 = read_dht11();
CheckSum = read_dht11();
// Check for error in Data reception
if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
{
TempC = T_Byte1;
RH = RH_Byte1;
}
else{
TempC = 0;
RH = 0;
}
}
__delay_ms(2000);
display(0,0b01110110);
display(1,0b00011100);
display(2,num[( RH/ 10)%10]);
display(3,num[( RH/ 10)%10]);
__delay_ms(2000);
display(0,num[( TempC / 10) % 10]);
display(1,num[ TempC % 10]);
display(2,0b01100011);
display(3,0b00111001);
}while(1);
}
void sendData(unsigned char dataB)
{
for(unsigned char b=0;b<8;b++){
DIO=(dataB >> b) % 2;
clock();
}
DIOio=1; //make DIO input
clock();
__delay_us(5);
DIOio=0; //make DIO output
}
void clock(void)
{
__delay_us(4);
CLK=1;
__delay_us(5);
CLK=0;
__delay_us(4);
}
void startBit(void)
{
DIO=0;
__delay_us(5);
CLK=0;
}
void stopBit(void)
{
CLK=1;
__delay_us(5);
DIO=1;
}
//includes brightness and point setting.
void display( unsigned char addr, unsigned char fig ){
unsigned char mode=0b01000100;// control=0b10001100; //0b10001010
unsigned char brightness=7; //brightness can be selected 0 to 7
unsigned char control=136+brightness;
// fig=fig+0x80; //0x80 is point
addr +=192;
startBit();
sendData(mode); // command1-data
stopBit();
startBit();
sendData(addr); // command2-address
sendData(fig);
stopBit();
startBit();
sendData(control); // command3-control
stopBit();
}
void dht11_init(){
DataDir = 0; // Data port is output
Data = 0;
__delay_ms(25);
Data = 1;
__delay_us(30);
DataDir = 1; // Data port is input
}
unsigned short find_response(){
TOUT = 0;
TMR1L = 0;
TMR1H = 0;
TMR1ON = 1; // start timer
while(!Data && !TOUT);
if (TOUT) return 0;
else {
TMR1L = 0;
TMR1H = 0;
while(Data && !TOUT);
if (TOUT) return 0;
else {
TMR1ON = 0;
return 1;
}
}
}
unsigned short read_dht11(){
unsigned short num = 0;
DataDir = 1;
for (i=0; i<8; i++){
while(!Data);
TMR1L = 0;
TMR1H = 0;
TMR1ON = 1;
while(Data);
TMR1ON = 0;
if(TMR1L > 40) num |= 1<<(7-i); // If time > 40us, Data is 1
}
return num;
}
void __interrupt() ISR(void){
if(TMR1IF){
TOUT = 1;
TMR1ON = 0; // stop timer
TMR1IF = 0; // Clear TMR1 interrupt flag
}
}
Данный контент доступен только зарегистрированным пользователям.