ATtiny13A + DHT11 + Потенциометр + LED

Nov 24, 2017 15:03

Продолжаю издеваться над attiny13a.
Удалось затолкать снятие показаний потенциометра, датчик DHT-11 и вывод на LED.
Это всё понадобится, когда дойдёт от китайцев ультразвуковой увлажнитель воздуха.
Код скомбинирован из найденных примеров в инете, сам я такой бы не написал.

[Код]

// Источники кода:
// По analogRead https://adnbr.co.uk/articles/adc-and-pwm-basics
// По DHT11 http://monitor.net.ru/forum/attiny13-dht11-tm1637-info-603797.html
#define F_CPU 1200000LU
#include
#include

unsigned char word_dht = 0x00;
unsigned char time_bit[40];
unsigned char data_dht[5];
unsigned char bit_dht;
#define luft 100
int adc_in;

#define PIN_DHT PB3 //Пин датчика DHT
#define DispPort PORTB // обзываем порт
#define ledPin PB4 // LED pin

//---------------------------------------------------------------------
//Здесь код для датчика DHT11. Автор Krendelyok.

void start_tmr_us()
{
TCNT0 = 0x00;
TCCR0B = 0x01; //Запускаем таймер0 с частотой 1,2 Мгц
}

void start_dht() //Отправляем приветствие датчику
{
DDRB |= (1 << PIN_DHT);
DispPort |= (1 << PIN_DHT);
DispPort &= ~(1 << PIN_DHT);
_delay_ms(18);
DDRB &= ~(1 << PIN_DHT);
DispPort |= (1 << PIN_DHT);
while(PINB & (1 << PIN_DHT)){}
while(~PINB & (1 << PIN_DHT)){}
while(PINB & (1 << PIN_DHT)){}
}

void get_data() //Получаем 40 бит от датчика и записываем в массив
{
for(bit_dht = 0; bit_dht < 40; bit_dht++)
{
while(~PINB & (1 << PIN_DHT)){}
start_tmr_us();
while(PINB & (1 << PIN_DHT)){}
time_bit[bit_dht] = TCNT0;
}
}

void decoder_bit(){
unsigned char bit_number = 1;
unsigned char word_number = 0;
for (bit_dht = 0; bit_dht < 40; bit_dht++){ //дербаним наш массив из 40 бит (5 байтов), в котором записана длительность каждого полученного бита

if (time_bit[bit_dht] > 50) //Если длительность бита больше 28 мкс,
{
word_dht = word_dht << 1; //сдвигаем байт влево и записываем в младший разряд 1
word_dht |= (1 << 0);
} else {
word_dht = word_dht << 1; //Если меньше 28 мкс, сдвигаем влево байт и записываем 0
word_dht &= ~(1 << 0);
}

if(bit_number == 8){ //Если имеем дело с восьмым битом, записываем полученный байт в массив
data_dht[word_number] = word_dht;
word_number += 1;
bit_number = 0;
}
bit_number +=1;
}
}

int main(void)
{
DDRB |= (1< while(1)
{
adc_in = analogRead_C(A1); //снимаем показания потенциометра
start_dht(); //DHT
get_data(); //DHT
decoder_bit(); //DHT
if ((data_dht[0] + data_dht[1] + data_dht[2] + data_dht[3]) == data_dht[4]) //если сходится контрольная сумма
{
if (adc_in>10+data_dht[0]*10) { //сравниваем потенциометр с влажностью для включения
PORTB |= (1< }
if (adc_in<(10+data_dht[0]*10-luft)) { //сравниваем потенциометр с влажностью для выключения, + типа гистерезис
PORTB &= ~(1< }
}
_delay_ms(2000);//пауза
}
}

unsigned int analogRead_C(byte channel){
ADMUX = channel; // ADC pin
ADCSRA |= 1< ADCSRA |= 1< while(!(ADCSRA & (1< ADCSRA |= 1< byte low = ADCL;
byte high = ADCH;
ADCSRA &= ~(1 << ADEN); // отключаем АЦП, для уменьшения энергопотребления
return (high << 8) | low;
}

техническое, attiny, #include, #define

Previous post Next post
Up