Продолжаю издеваться над 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; }