Привет всем!
Помогите пожалуйста переделать код, мне необходимо, чтобы МК (Atmega8) каждые 5 сек выводил значение (температуры и влажности) датчика (DHT11) на экран.
Код в таком виде выводит значение датчика только при запуске на экран и все, при изменении показателей датчика ничего не происходит (код и схема в Proteus прилагается)
Заранее благодарю за помощь
компилятор используется AtmelStudio 6.2
файл dht11.c
#define F_CPU 1000000UL
#include <stdio.h>
#include <string.h>
#include <avr/io.h>
#include <util/delay.h>
#include "dht11.h"
#define DHT11_ERROR 255
/*
* get data from dht11-получить данные из DHT11
*/
uint8_t dht11_getdata(uint8_t select)
{
uint8_t bits[5];
uint8_t i,j = 0;
memset(bits, 0, sizeof(bits));
//reset port
DHT11_DDR |= (1<<DHT11_INPUTPIN); //output
DHT11_PORT |= (1<<DHT11_INPUTPIN); //high
_delay_ms(100);
//send request
DHT11_PORT &= ~(1<<DHT11_INPUTPIN); //low - низкая
_delay_ms(18);
DHT11_PORT |= (1<<DHT11_INPUTPIN); //high - высокая
_delay_us(1);
DHT11_DDR &= ~(1<<DHT11_INPUTPIN); //input - вход
_delay_us(39);
//check start condition 1 - начала проверки состояния 1
if((DHT11_PIN & (1<<DHT11_INPUTPIN)))
{
return DHT11_ERROR;
}
_delay_us(80);
//check start condition 2 - начала проверки состояния 2
if(!(DHT11_PIN & (1<<DHT11_INPUTPIN)))
{
return DHT11_ERROR;
}
_delay_us(80);
//read the data
for (j=0; j<5; j++) { //read 5 byte
uint8_t result=0;
for(i=0; i<8; i++) {//read every bit - читать каждый бит
while(!(DHT11_PIN & (1<<DHT11_INPUTPIN))); //wait for an high input _ ждать высокой входной
_delay_us(30);
if(DHT11_PIN & (1<<DHT11_INPUTPIN)) //if input is high after 30 us, get result- если вход имеет высокий уровень после 30-ти нас, получить результат
result |= (1<<(7-i));
while(DHT11_PIN & (1<<DHT11_INPUTPIN)); //wait until input get low
}
bits[j] = result;
}
//reset port
DHT11_DDR |= (1<<DHT11_INPUTPIN); //output
DHT11_PORT |= (1<<DHT11_INPUTPIN); //low
_delay_ms(100);
//check checksum - проверять контрольную сумму
if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) {
if (select == 0) { //return temperature - температура возвращаемого теплоносителя
return(bits[2]);
} else if(select == 1){ //return humidity - возвращение влажности
return(bits[0]);
}
}
return DHT11_ERROR;
}
/*
* get temperature (0..50C) - получить температуру
*/
int8_t dht11_gettemperature()
{
uint8_t ret = dht11_getdata(0);
if(ret == DHT11_ERROR)
return -1;
else
return ret;
}
/*
* get humidity (20..90%) - получить влажность
*/
int8_t dht11_gethumidity()
{
uint8_t ret = dht11_getdata(1);
if(ret == DHT11_ERROR)
return -1;
else
return ret;
}
файл dht11.h
#ifndef DHT11_H_
#define DHT11_H_
#include
#include
//setup parameters
#define DHT11_DDR DDRC
#define DHT11_PORT PORTC
#define DHT11_PIN PINC
#define DHT11_INPUTPIN PC5
extern int8_t dht11_gettemperature();
extern int8_t dht11_gethumidity();
#endif
файл mayn.c
#include
#include
#include "lcd_lib.h"
#include "dht11.h"
#include
char buffer[8];
int main( void )
{
// Инициализация LCD
LCDinit();
// Выключаем курсоор
LCDcursorOFF();
// Очищаем дисплей
LCDclr();
int8_t temperature = 0;
int8_t humidity = 0;
while(1)
{
humidity = dht11_gethumidity();
temperature = dht11_gettemperature();
LCDGotoXY(0,0);
sprintf(buffer, "T=%02d", temperature);
LCDstring(buffer,4);
LCDGotoXY(0,1);
sprintf(buffer, "H=%02d", humidity);
LCDstring(buffer,4);
}
}