#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Влажность: ");
Serial.print(h);
Serial.print("% Температура: ");
Serial.print(t);
Serial.println("°C");
delay(2000);
}
Для работы с библиотеками скачайте DHT-sensor-library через менеджер в среде разработки. Убедитесь, что выбрана правильная версия платы и порт в Инструменты → Плата → Arduino AVR Boards.
При отладке ошибок проверьте соединения: датчик требует подтягивающего резистора 10 кОм между VCC и DATA. Если значения NaN, замените экземпляр DHT11 – дешёвые модули часто бракуются.
Для сложных задач используйте PlatformIO вместо стандартной IDE. Поддержка отладки через JTAG и встроенный менеджер зависимостей ускоряют разработку. Пример конфигурации для ESP8266 в platformio.ini:
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
lib_deps = dhtlib
Сборка первой схемы: шаги от подключения до кода
Возьмите плату Uno, светодиод, резистор 220 Ом и макетную плату. Подключите анод светодиода (длинная ножка) к цифровому пину 13 через резистор, катод – к GND.
Загрузите в IDE стандартный скетч Blink. Убедитесь, что в коде выбран корректный порт (Tools → Port). Нажмите Upload. Светодиод должен мигать с интервалом 1 секунда.
Если схема не работает, проверьте:
— Полярность светодиода (переверните, если не горит)
— Целостность соединений (переподключите провода)
Для модификации скетча измените параметры delay(). Например, delay(500) сократит интервал до 0.5 секунд. Экспериментируйте с другими пинами – подключите светодиод к D7 и поменяйте номер в digitalWrite().
Оптимизация кода и работа с памятью: техники для опытных
Замените String
на статические буферы: динамическое выделение памяти фрагментирует ОЗУ. Используйте char[]
фиксированного размера с проверкой длины через snprintf()
.
Отключайте неиспользуемые модули: регистры PRR
(Power Reduction Register) снижают энергопотребление. Например, PRR0 |= (1 << PRTIM2)
выключает таймер 2.
Оптимизируйте математику: заменяйте float
на int
с фиксированной точкой. Умножение на 100 вместо деления ускоряет вычисления в 4-6 раз.
Используйте битовые операции: PORTD |= (1 << PD3)
работает быстрее, чем digitalWrite(3, HIGH)
. Маскирование регистров сокращает код на 15-20%.
Кэшируйте частые вызовы: сохраняйте результаты millis()
или analogRead()
в переменных вместо повторных запросов.
Сжимайте данные: для хранения констант применяйте PROGMEM
. Например, const uint8_t table[] PROGMEM = {…}
освобождает ОЗУ.
Минимизируйте прерывания: выносите сложную логику из ISR
в основной цикл. Оставляйте в обработчике только флаги и критичные операции.
Пишите компактные циклы: for (uint8_t i = 10; i--;)
генерирует меньший машинный код, чем for (int i = 0; i < 10; i++)
.