Для начала, вам понадобится настроить подключение дисплея LM016L и датчика SHT10 к микроконтроллеру Atmega8.
Подключение дисплея LM016L:
- Подключите контакты RS, RW и E дисплея к порту B микроконтроллера.
- Подключите контакты D0-D7 дисплея к порту C микроконтроллера.
Подключение датчика SHT10:
- Подключите контакт DATA датчика к порту D микроконтроллера.
- Подключите контакты SCK и VCC датчика к питанию 5V.
- Подключите контакты GND и VSS датчика к земле.
Вот код, который вы можете использовать для вывода значений датчика на дисплей:
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h" // заголовочный файл для работы с дисплеем
#define DATA_PORT PORTD // порт для подключения датчика
#define DATA_DDR DDRD
#define DATA_PIN PIND
#define DATA_BIT PD0
void sht10_init() {
// настройка порта для подключения датчика
DATA_DDR |= (1 << DATA_BIT);
DATA_PORT |= (1 << DATA_BIT);
}
void sht10_send_command(uint8_t command) {
// отправляем команду датчику
DATA_DDR |= (1 << DATA_BIT);
DATA_PORT &= ~(1 << DATA_BIT);
_delay_us(2);
DATA_DDR &= ~(1 << DATA_BIT);
_delay_us(20);
DATA_DDR |= (1 << DATA_BIT);
_delay_us(2);
PORTD = command;
_delay_us(20);
PORTD &= ~(1 << DATA_BIT);
}
uint16_t sht10_read_data() {
uint8_t msb, lsb, crc;
DATA_DDR &= ~(1 << DATA_BIT);
_delay_us(2);
DATA_DDR |= (1 << DATA_BIT);
_delay_us(2);
msb = sht10_read_byte();
sht10_send_ack();
lsb = sht10_read_byte();
sht10_send_ack();
crc = sht10_read_byte();
sht10_send_nack();
return (msb << 8) | lsb;
}
void sht10_send_ack() {
DATA_DDR |= (1 << DATA_BIT);
_delay_us(2);
DATA_DDR &= ~(1 << DATA_BIT);
_delay_us(20);
}
void sht10_send_nack() {
DATA_DDR |= (1 << DATA_BIT);
_delay_us(2);
DATA_DDR &= ~(1 << DATA_BIT);
_delay_us(20);
DATA_DDR |= (1 << DATA_BIT);
}
uint8_t sht10_read_byte() {
uint8_t byte = 0;
DATA_DDR &= ~(1 << DATA_BIT);
_delay_us(2);
DATA_DDR |= (1 << DATA_BIT);
_delay_us(2);
for (int i = 7; i >= 0; i--) {
if ((DATA_PIN & (1 << DATA_BIT))) {
byte |= (1 << i);
}
DATA_DDR &= ~(1 << DATA_BIT);
_delay_us(2);
DATA_DDR |= (1 << DATA_BIT);
_delay_us(2);
}
return byte;
}
int main(void) {
lcd_init(LCD_DISP_ON); // инициализация дисплея
sht10_init(); // инициализация датчика
while (1) {
sht10_send_command(0x03); // отправка команды измерения температуры
_delay_ms(10);
uint16_t temperature = sht10_read_data(); // чтение данных температуры
sht10_send_command(0x05); // отправка команды измерения влажности
_delay_ms(10);
uint16_t humidity = sht10_read_data(); // чтение данных влажности
lcd_clrscr(); // очистка экрана дис