Код для Arduino и ESP32 — инструмент ИИ-чата Аливия для скетчей под конкретную плату и датчики. Нейросеть напишет код с комментариями, подскажет пины, библиотеки и схему подключения, разберёт ошибку компилятора. Укажите плату, модули, питание и что должно происходить, а резистор для светодиода и делитель напряжения посчитает расчёт в браузере.
Работает онлайнРусский и другие языкиТест бесплатно, без регистрацииБез VPNДоступ 24/7Голосовой ввод и файлы
Зарегистрируйтесь и подтвердите почту — начислим ещё 10 000 символов на 7 дней.ЗарегистрироватьсяОнлайн
Программистам · ИИ-инструмент нейросети Аливия
Конструктор скетчей Arduino
Выберите плату, опишите задачу и подключение — бот напишет скетч с комментариями и схемой.
Ещё настройки
Запрос подставится в поле чата — его можно поправить перед отправкой.
Для вашего проекта теплицы с использованием Arduino Uno на основе DHT22, OLED SSD1306 и ёмкостного датчика влажности почвы, вот скетч, который соответствует вашим требованиям.
Подключение:
- DHT22:
- VCC — 5V
- GND — GND
- DATA — пин 2
- Ёмкостный датчик влажности почвы:
- VCC — 5V
- GND — GND
- DATA — пин A0
- OLED SSD1306:
- VCC — 5V
- GND — GND
- SDA — пин A4
- SCL — пин A5
- Реле:
- VCC — 5V
- GND — GND
- IN — пин 3 (управление насосом)
- Насос:
- Подключается через реле на 12V.
- Светодиод:
- Анод — пин 4 через резистор 300 Ом
- Катод — GND
Библиотеки:
- DHT sensor library
- Adafruit SSD1306
Скетч:
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Настройка пинов
#define DHTPIN 2 // Пин для DHT22
#define SOIL_MOISTURE_PIN A0 // Пин для датчика влажности
#define RELAY_PIN 3 // Пин для реле
#define LED_PIN 4 // Пин для светодиода
// Настройка DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Настройка экрана OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Время
unsigned long previousMillis = 0;
const unsigned long interval = 1800000UL; // 30 минут
unsigned long lastWateringTime = 0;
// Порог влажности
const int moistureThreshold = 400; // Примерный порог
void setup() {
Serial.begin(115200);
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Выключаем насос
}
void loop() {
unsigned long currentMillis = millis();
// Считываем влажность и температуру
float h = dht.readHumidity();
float t = dht.readTemperature();
// Проверка на ошибки считывания
if (isnan(h) || isnan(t)) {
Serial.println("Ошибка считывания с DHT22!");
digitalWrite(RELAY_PIN, LOW); // Выключаем насос
return;
}
// Считываем влажность почвы
int soilMoisture = analogRead(SOIL_MOISTURE_PIN);
// Проверяем, нужно ли включить насос
if (soilMoisture < moistureThreshold && (currentMillis - lastWateringTime > interval)) {
digitalWrite(RELAY_PIN, HIGH); // Включаем насос
lastWateringTime = currentMillis;
delay(10000); // Насос работает 10 секунд
digitalWrite(RELAY_PIN, LOW); // Выключаем насос
}
// Выводим данные на Serial
Serial.print("Влажность: ");
Serial.print(h);
Serial.print("%, Температура: ");
Serial.print(t);
Serial.println("°C");
// Обновляем OLED дисплей
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Влажность: ");
display.print(h);
display.println("%");
display.print("Температура: ");
display.print(t);
display.println("°C");
display.display();
// Управляем светодиодом
if (soilMoisture < moistureThreshold) {
digitalWrite(LED_PIN, HIGH); // Включаем светодиод
} else {
digitalWrite(LED_PIN, LOW); // Выключаем светодиод
}
// Ждем перед следующим считыванием
delay(1000); // Задержка для обновления данных
}Пояснения:
- Пины: Все пины в коде соответствуют указанному подключению.
- Отладочный вывод: Результаты читаемости датчиков выводятся в Serial.
- OLED: Используется библиотека Adafruit SSD1306 для отображения данных.
- Без delay() в loop(): Использованы подходящие задержки для управления насосом, но основная логика использует millis() для тайминга.
Проверка:
- Проверьте правильность подключения всех модулей.
- Убедитесь, что все библиотеки установлены.
- Проверьте, что питание для всех модулей соответствует спецификациям.
- Убедитесь, что в Serial Monitor установлена скорость 115200 бод.
- Проверьте работу реального датчика влажности почвы.
Ошибка, которую вы видите: 'ledcSetup' was not declared in this scope, означает, что компилятор не может найти определение функции ledcSetup. Это может произойти из-за того, что вы используете неправильную версию ядра для ESP32 или у вас отсутствует необходимая библиотека.
Для исправления ошибки вы должны убедиться, что вы используете последнюю версию ядра ESP32 (версия 3.x) в Arduino IDE.
Вот исправленный скетч, который учитывает вашу просьбу:
#include <WiFi.h> // Подключаем библиотеку для работы с Wi-Fi
const int LED = 2; // Пин, к которому подключен светодиод
void setup() {
Serial.begin(115200); // Инициализация последовательного порта
ledcSetup(0, 5000, 8); // Настройка канала ШИМ
ledcAttachPin(LED, 0); // Привязка пина к каналу ШИМ
}
void loop() {
ledcWrite(0, 128); // Установка ШИМ сигнала (половина мощности)
delay(1000); // Задержка на 1 секунду
}Пояснения к коду:
- В коде используется
ledcSetupиledcAttachPinдля конфигурации ШИМ. ledcWriteуправляет яркостью светодиода через ШИМ.- Добавлен
Serial.begin(115200);для отладки.
Проверка:
- Убедитесь, что выбрана правильная плата (ESP32) и версия ядра 3.x.
- Проверьте, что библиотека WiFi подключена и настроена.
- Убедитесь, что пин 2 свободен и не используется другими устройствами.
Если у вас есть дополнительные модули или датчики, укажите их, чтобы можно было дополнительно настроить код.
Причины неправильной работы кнопки могут быть следующими:
- Дребезг контактов: Когда кнопка нажата, она может многократно замыкаться и размыкаться, создавая ложные срабатывания.
- Плавающий вход: Если на входе нет подтягивающего резистора, он может принимать произвольные значения, что также приводит к ложным срабатываниям.
- Нехватка питания: Если плата не получает достаточно питания, это может вызвать нестабильное поведение.
- Конфликт пинов: Убедитесь, что на пине D2 нет других подключенных устройств.
Исправленный код
Ниже представлен исправленный скетч, который включает подтягивающий резистор и устранение дребезга кнопки:
#include <Arduino.h>
int cnt = 0;
unsigned long lastDebounceTime = 0; // Время последнего изменения состояния кнопки
unsigned long debounceDelay = 50; // Задержка для устранения дребезга
int buttonState; // Текущее состояние кнопки
int lastButtonState = LOW; // Предыдущее состояние кнопки
void setup() {
pinMode(2, INPUT_PULLUP); // Установка пина D2 как вход с подтягивающим резистором
Serial.begin(115200); // Инициализация последовательного порта
}
void loop() {
int reading = digitalRead(2); // Считывание состояния кнопки
// Проверка изменения состояния кнопки
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Сброс времени дребезга
}
// Проверка состояния кнопки после задержки
if ((millis() - lastDebounceTime) > debounceDelay) {
// Если состояние кнопки изменилось
if (reading == LOW) { // LOW, так как используется INPUT_PULLUP
cnt++; // Увеличение счётчика нажатий
Serial.println(cnt); // Вывод счётчика в Serial
}
}
lastButtonState = reading; // Сохранение состояния для следующей итерации
}Подключение
- Кнопка: между D2 и 5 В
- Используйте встроенный подтягивающий резистор, подключив кнопку к пину D2 и к 5 В.
Проверка
- Убедитесь, что кнопка действительно подключена между D2 и 5 В.
- Наблюдайте за выводом в Serial Monitor на скорости 115200.
- Убедитесь, что у вас установлена последняя версия ядра Arduino для вашей платы (ATmega328P).
- Проверьте питание платы, оно должно быть стабильным.
- Убедитесь, что нет других подключенных устройств на пине D2.
Если после этих изменений проблема сохраняется, проверьте физическое состояние кнопки и соединений.
Для подключения метеостанции с датчиком BME280 к ESP8266, а также для отправки данных на веб-страницу в локальной сети, представлю вам схему подключения, таблицу и скетч.
Схема подключения
Таблица подключения:
| Модуль | Вывод модуля | Пин платы | Примечание |
|---|---|---|---|
| BME280 | VCC | 3V3 | Питание от 3,3 В |
| BME280 | GND | GND | Земля |
| BME280 | SDA | D2 (GPIO 4) | I2C данные |
| BME280 | SCL | D1 (GPIO 5) | I2C тактирование |
Скетч для ESP8266
#include <Wire.h> // Библиотека для I2C
#include <Adafruit_Sensor.h> // Библиотека для работы с датчиками
#include <Adafruit_BME280.h> // Библиотека для BME280
#include <ESP8266WiFi.h> // Библиотека для работы с Wi-Fi
#include <ESP8266WebServer.h> // Библиотека для создания веб-сервера
// Константы для Wi-Fi
const char* ssid = "YOUR_SSID"; // Замените на ваше имя сети
const char* password = "YOUR_PASSWORD"; // Замените на ваш пароль
// Пины
const int BME280_SDA_PIN = D2; // GPIO 4
const int BME280_SCL_PIN = D1; // GPIO 5
// Инициализация датчика
Adafruit_BME280 bme;
ESP8266WebServer server(80);
// Функция для обработки запроса на веб-странице
void handleRoot() {
String html = "<html><body>";
html += "<h1>Данные метеостанции</h1>";
html += "<p>Температура: " + String(bme.readTemperature()) + " °C</p>";
html += "<p>Влажность: " + String(bme.readHumidity()) + " %</p>";
html += "<p>Давление: " + String(bme.readPressure() / 100.0F) + " hPa</p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void setup() {
Serial.begin(115200);
// Подключение к Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Подключение к Wi-Fi...");
}
Serial.println("Подключено к Wi-Fi!");
Serial.println(WiFi.localIP());
// Инициализация BME280
if (!bme.begin(0x76)) { // Адрес 0x76, возможно 0x77, проверьте на вашем модуле
Serial.println("Не удалось найти BME280. Проверьте подключение!");
while (1);
}
// Обработка корневого URL
server.on("/", handleRoot);
server.begin();
}
void loop() {
// Обслуживание запросов к серверу
server.handleClient();
}Пояснения
- Библиотеки:
Wire.h— для работы с I2C.Adafruit_Sensor.hиAdafruit_BME280.h— для работы с датчиком BME280.ESP8266WiFi.hиESP8266WebServer.h— для работы с Wi-Fi и создания веб-сервера.
- Пин подключения:
- Датчик BME280 подключен через I2C на GPIO 4 (SDA) и GPIO 5 (SCL). Питание подается от 3.3 В.
- Отладка:
- Вывод информации о подключении к Wi-Fi и статусе датчика осуществляется через Serial.
- Веб-страница:
- При обращении к корневому URL (
/) отображаются данные о температуре, влажности и давлении.
- При обращении к корневому URL (
- Отсутствие
delay():- Внутри
loop()используетсяserver.handleClient(), что позволяет обрабатывать запросы без задержек.
- Внутри
Проверка
- Убедитесь, что все модули правильно подключены и используется нужное питание.
- Проверьте адрес I2C для BME280 — может быть 0x76 или 0x77.
- Убедитесь, что Wi-Fi данные (имя сети и пароль) указаны правильно.
- Мониторинг последовательного порта для отладки подключения и работы датчика.
- Проверьте, что библиотека BME280 установлена через менеджер библиотек Arduino.
Этот скетч для Arduino Mega 2560 выполняет следующие основные функции:
- Объявление переменной:
volatile unsigned long pulses = 0;— переменнаяpulsesхранит количество импульсов, которые будут отслеживаться. Используетсяvolatile, чтобы гарантировать, что компилятор не оптимизирует код, так как переменная изменяется в прерываниех.
- Функция прерывания:
void count() { pulses++; }— эта функция увеличивает значение переменнойpulsesна 1 каждый раз, когда происходит срабатывание прерывания.
- Настройка (setup):
pinMode(18, INPUT_PULLUP);— устанавливает 18-й пин в режим входа с подтягивающим резистором. Это позволяет отслеживать изменения на этом пине.attachInterrupt(digitalPinToInterrupt(18), count, FALLING);— настраивает прерывание на 18-м пине. Оно срабатывает при переходе сигнала с высокого уровня на низкий (состояние FALLING).Serial.begin(115200);— инициализирует последовательный порт с заданной скоростью передачи данных.
- Основной цикл (loop):
- В переменной
tсохраняется текущее значение времени, а условиеif (millis() - t >= 1000)проверяет, прошло ли 1 секунда с последнего вызова. noInterrupts();— отключает прерывания, чтобы избежать конфликтов при чтении и сбросе переменнойpulses.unsigned long p = pulses; pulses = 0; interrupts();— сохраняет текущее количество импульсов в переменнойp, затем сбрасываетpulsesдо нуля и включает прерывания обратно.Serial.println(p * 60);— выводит на последовательный порт количество импульсов за минуту (умножая на 60).t = millis();— обновляет значениеtдля отслеживания времени.
- В переменной
Что произойдёт после включения:
- При включении Arduino будет настроен 18-й пин как вход с подтягивающим резистором.
- Программа будет ожидать сигнала, который приведёт к срабатыванию прерывания (например, нажатие кнопки или другой сигнал, который опустит уровень на пине 18).
- Каждый раз, когда срабатывает прерывание, увеличивается счётчик импульсов.
- Каждую секунду будет выдаваться значение количества импульсов за минуту на последовательный порт.
Опасные моменты:
- Ток через пин: Если на пине 18 используется внешний источник, нужно убедиться, что ток не превышает допустимые 20 мА для выходных пинов Arduino Mega.
- Блокирующие задержки: Использование
noInterrupts()может заблокировать другие прерывания, что может привести к потере данных, если импульсы приходят слишком быстро. - Переполнение millis(): Функция
millis()переполняется примерно через 50 дней. Если скетч работает непрерывно, это может привести к неправильной работе после переполнения.
Обязательно проверьте подключение и работу внешних компонентов, чтобы избежать повреждения платы.
Вот пример скетча для управления модулем Пельтье с помощью ESP32, используя датчик температуры DS18B20 и MOSFET IRLZ44N. Мы будем управлять температурой с помощью двух кнопок, используя ШИМ-сигнал.
Подключения:
- DS18B20: GPIO 4 (с подтяжкой 4,7 кОм к 3,3 В)
- MOSFET IRLZ44N: GPIO 25
- Кнопка +: GPIO 32
- Кнопка -: GPIO 33
Скетч:
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Пины подключения
#define PIN_DS18B20 4
#define PIN_MOSFET 25
#define PIN_BUTTON_UP 32
#define PIN_BUTTON_DOWN 33
// Настройки
const unsigned long PWM_FREQUENCY = 1000UL; // Частота ШИМ
const unsigned long PWM_RESOLUTION = 8; // Разрешение ШИМ (8 бит)
const unsigned long TEMP_INTERVAL = 500UL; // Интервал проверки температуры
const unsigned long BUTTON_INTERVAL = 100UL; // Интервал проверки состояния кнопок
OneWire oneWire(PIN_DS18B20);
DallasTemperature sensors(&oneWire);
float targetTemperature = 25.0; // Уставка температуры
unsigned long lastTempCheck = 0;
unsigned long lastButtonCheck = 0;
void setup() {
Serial.begin(115200);
sensors.begin();
pinMode(PIN_MOSFET, OUTPUT);
ledcSetup(0, PWM_FREQUENCY, PWM_RESOLUTION);
ledcAttachPin(PIN_MOSFET, 0);
digitalWrite(PIN_MOSFET, LOW); // Выключаем нагрузку
}
void loop() {
unsigned long currentMillis = millis();
// Проверка температуры
if (currentMillis - lastTempCheck >= TEMP_INTERVAL) {
lastTempCheck = currentMillis;
float currentTemperature = getTemperature();
if (currentTemperature != -127.0) { // Проверка на ошибку датчика
controlHeating(currentTemperature);
} else {
digitalWrite(PIN_MOSFET, LOW); // Выключаем нагрузку при ошибке
Serial.println("Ошибка датчика, отключение нагрузки.");
}
}
// Проверка состояния кнопок
if (currentMillis - lastButtonCheck >= BUTTON_INTERVAL) {
lastButtonCheck = currentMillis;
checkButtons();
}
}
float getTemperature() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}
void controlHeating(float currentTemperature) {
if (currentTemperature < targetTemperature) {
ledcWrite(0, 255); // Включаем ШИМ на максимум
Serial.println("Нагреваем. Текущая температура: " + String(currentTemperature));
} else {
ledcWrite(0, 0); // Отключаем нагрев
Serial.println("Температура достигнута. Текущая температура: " + String(currentTemperature));
}
}
void checkButtons() {
if (digitalRead(PIN_BUTTON_UP) == HIGH) {
targetTemperature += 1.0; // Увеличиваем уставку на 1 градус
Serial.println("Уставка увеличена: " + String(targetTemperature));
delay(200); // Дебаунс
}
if (digitalRead(PIN_BUTTON_DOWN) == HIGH) {
targetTemperature -= 1.0; // Уменьшаем уставку на 1 градус
Serial.println("Уставка уменьшена: " + String(targetTemperature));
delay(200); // Дебаунс
}
}Пояснения:
- Библиотеки: Используются библиотеки
OneWireиDallasTemperatureдля работы с DS18B20. - ШИМ: Используется API
ledcдля управления MOSFET. - Кнопки: Проверка состояния кнопок осуществляется в цикле
loop()без использованияdelay(), что обеспечивает отзывчивость. - Отладочный вывод: Информация о текущей температуре и изменениях уставки выводится в Serial Monitor.
Проверка:
- Убедитесь, что все подключения выполнены корректно.
- Проверьте, что датчик температуры работает и возвращает значения.
- Пожалуйста, протестируйте работу кнопок для изменения уставки температуры.
- Убедитесь, что нагрузка (Пельтье) включается и выключается в зависимости от температуры.
Ответы получены 15.10.2026 в этом чате и приведены без правок. Выделено то, чего не было в запросе.
Что такое код для Arduino и как его пишет нейросеть
Код для Arduino, или скетч, — это программа на языке C++ с двумя обязательными функциями: setup() выполняется один раз после включения, loop() повторяется бесконечно. Нейросеть пишет такой скетч под вашу плату и датчики, указывает, к каким пинам что подключать, и перечисляет нужные библиотеки.
Главная сложность электроники — не синтаксис, а железо. Один и тот же датчик на Arduino Uno и на ESP32 подключается по-разному: другие пины, другое напряжение логики, другие библиотеки. Поэтому нейросеть начинает с вопросов о плате, питании и модулях и только потом пишет код. В ответ вы получаете скетч с комментариями, таблицу подключения «вывод модуля — пин платы» и список того, что проверить перед первым включением.
От обычного генератора программ на C++ этот инструмент отличается тем, что учитывает пины, напряжения, таймеры и ограничения конкретного микроконтроллера.
Arduino Uno или ESP32: в чём разница для кода
Это две самые популярные платформы, и код между ними переносится не один в один. Сравнение по характеристикам из официальной документации:
| Параметр | Arduino Uno R3 | ESP32 |
|---|---|---|
| Напряжение логики | 5 В | Рекомендуемое питание 3,3 В |
| Выводы | 14 цифровых, из них 6 с ШИМ, и 6 аналоговых входов | 34 физических GPIO |
| АЦП (analogRead) | 10 бит, значения 0–1023 | 12 бит по умолчанию, значения 0–4095 |
| Память | 2 КБ SRAM, 32 КБ Flash | Зависит от модуля, обычно с запасом для веб-сервера |
| Wi-Fi и Bluetooth | Нет | Есть — отсюда веб-интерфейсы, MQTT, обновление по воздуху |
| Ток с одного вывода | 20 мА | Задаётся силой выхода, смотрите даташит модуля |
Для уроков робототехники, простых датчиков и всего, что работает с 5-вольтовыми модулями, удобнее Uno или Nano. Для умного дома, отправки данных в интернет и управления со смартфона берут ESP32. Нейросеть подскажет выбор, если описать задачу целиком.
Какие пины что умеют
Ошибка «код правильный, а не работает» чаще всего означает не тот пин. Расчёт в браузере показывает таблицу пинов популярных плат: где ШИМ, где АЦП, где I2C. Ключевые правила из документации:
- ШИМ на Uno и Nano. analogWrite() работает на пинах 3, 5, 6, 9, 10, 11; частота 490 Гц, на пинах 5 и 6 — 980 Гц; значение от 0 до 255.
- I2C на Uno и Nano. SDA — A4, SCL — A5; на Mega 2560 — пины 20 и 21. Для линий SDA и SCL нужны подтягивающие резисторы, на многих готовых модулях они уже стоят.
- ESP32, только вход. GPIO 34–39 работают только как входы и не имеют встроенных подтяжек — кнопку на них без внешнего резистора не повесить.
- ESP32, занятые пины. GPIO 6–11 обычно подключены к SPI-флеш и PSRAM модуля, использовать их не следует.
- ESP32, пины загрузки. GPIO 0, 2, 5, 12 и 15 — strapping-пины: их уровень при старте влияет на режим загрузки, и подключённый модуль может помешать прошивке.
- ESP32 и Wi-Fi. Входы ADC2 нельзя использовать, когда работает Wi-Fi — аналоговые датчики в Wi-Fi-проекте подключайте к ADC1.
ESP32 не рассчитан на 5-вольтовые сигналы. По даташиту Espressif максимальное входное напряжение высокого уровня — VDD + 0,3 В, то есть около 3,6 В при питании 3,3 В. Датчик или модуль с 5-вольтовым выходом подключайте через делитель напряжения или преобразователь уровней, иначе вывод можно повредить.
Как получить скетч: пошагово
- Назовите плату. Точная модель важна: Uno R3, Nano, Mega 2560, ESP32 DevKit, ESP32-S3, STM32 Blue Pill, ATtiny85.
- Перечислите датчики и модули. С маркировкой: DS18B20, BME280, HC-SR04, реле на 5 В, дисплей SSD1306, MAX485 для Modbus.
- Опишите поведение. Что должно происходить и при каких условиях: «если температура выше 28 °C, включить вентилятор и отправить сообщение».
- Укажите питание. От USB, блока питания или аккумулятора — от этого зависят делитель для измерения и режимы сна.
- Соберите запрос. Конструктор под чатом сложит поля в одно задание. Если есть ошибка компиляции, вставьте её текст целиком.
- Посчитайте обвязку. Расчёт в браузере подберёт резистор для светодиода по формуле R = (Uпит − Uсвет) / I и делитель напряжения по формуле Uвых = Uвх × R2 / (R1 + R2).
- Загрузите и проверьте. Скопируйте скетч в Arduino IDE, установите библиотеки из списка, загрузите и откройте монитор порта.
Готовая формулировка запроса: «Плата ESP32 DevKit, питание от USB. Датчик DS18B20 на GPIO 4 с подтяжкой 4,7 кОм, реле 5 В через модуль с оптопарой на GPIO 26. Если температура выше 28 °C — включить реле, ниже 26 °C — выключить. Показания раз в 10 секунд выводить в Serial. Напиши скетч с комментариями, список библиотек и таблицу подключения».
Пример: меандр 300 Гц на пине D2
Такую задачу на Аливии действительно задавали. Для неё не нужны таймеры вручную: функция tone() выдаёт на пин прямоугольный сигнал заданной частоты со скважностью 50 %.
void setup() {
tone(2, 300); // меандр 300 Гц на D2 до вызова noTone(2)
}
void loop() {
}У функции есть ограничения, о которых нейросеть предупредит в ответе: частоту ниже 31 Гц получить нельзя, одновременно звучит только один тон, а на платах кроме Mega tone() мешает ШИМ на пинах 3 и 11. Если нужен точный сигнал высокой частоты или несколько каналов, нейросеть предложит настройку аппаратного таймера.
Как подключить ESP32 к Arduino IDE
Платы ESP32 не входят в Arduino IDE из коробки. В настройках IDE в поле дополнительных ссылок для менеджера плат добавляют адрес https://espressif.github.io/arduino-esp32/package_esp32_index.json, затем в менеджере плат устанавливают пакет esp32. После этого нужная модель выбирается в меню «Инструменты — Плата».
Если после загрузки в мониторе порта нечитаемые символы, проверьте, что скорость монитора совпадает с Serial.begin() в скетче. Если ошибка возникает при компиляции, разобрать сообщение построчно поможет разбор ошибок компилятора — или просто вставьте его в этот чат.
Безопасность: сетевое напряжение и питание
Многие проекты управляют лампой, обогревателем или насосом от розетки. Стандартное напряжение сети в России — 230 В (в быту говорят «220»), и оно опасно для жизни. Несколько правил, которые нейросеть добавит в ответ на любой такой запрос:
- Коммутируйте сеть только готовыми модулями реле или твердотельными реле с гальванической развязкой. Плата и датчики остаются на низковольтной стороне.
- Не собирайте сетевую часть на макетной плате и не работайте с ней под напряжением. Монтаж и проверка — только с выдернутой вилкой.
- Высоковольтную часть закрывайте в корпус, клеммы — подальше от рук и проводов датчиков.
- Мотор, реле без модуля и светодиодную ленту не питайте от вывода платы: нужен отдельный источник и транзистор или драйвер, а общую землю соединяют.
Если опыта работы с сетевым напряжением нет, силовую часть доверьте электрику, а микроконтроллер пусть управляет ею через готовый модуль.
Как проверить скетч до сборки устройства
- Компиляция. Нажмите «Проверить» в Arduino IDE до загрузки — синтаксические ошибки всплывут сразу.
- Пины. Сверьте таблицу подключения с распиновкой вашей платы: копии и ревизии модулей отличаются.
- Напряжение. Убедитесь, что ни один сигнал выше 3,3 В не идёт на вход ESP32, а нагрузка на вывод Uno не превышает допустимый ток.
- Серийный вывод. Попросите нейросеть добавить отладочный вывод в монитор порта — так видно, на каком шаге программа ведёт себя не так.
- По частям. Проверьте каждый датчик отдельным коротким скетчем, затем соберите всё вместе.
Перед большим проектом полезно описать устройство целиком в ТЗ на устройство: режимы, питание, корпус, что делать при обрыве датчика. Аливия работает без регистрации и VPN, понимает русский, принимает фото схемы и скриншоты ошибок. На бесплатном доступе есть дневной лимит запросов, у платных тарифов он больше — длинные проекты с многими уточнениями удобнее вести на них.
Код для Arduino и ESP32: частые вопросы
Может ли нейросеть написать код для Arduino?
На каком языке пишут скетчи для Arduino?
setup() выполняется один раз при старте, loop() повторяется по кругу.Подойдёт ли код для Arduino Uno на ESP32?
Можно ли подключать 5-вольтовые датчики к ESP32?
Какие пины Arduino Uno поддерживают ШИМ?
analogWrite() — от 0 до 255.Как рассчитать резистор для светодиода?
Как подключить датчик к Arduino по I2C?
Что делать, если скетч не компилируется?
Можно ли управлять лампой на 220 В через Arduino?
Пишет ли нейросеть код для STM32 и ATtiny?
Итог
Код для Arduino и ESP32 на Аливии — это скетч под вашу плату и датчики вместе с таблицей подключения, библиотеками и пояснениями. Нейросеть учитывает пины, напряжение логики и ограничения микроконтроллера, а расчёт в браузере подбирает резистор и делитель напряжения. Проверяйте подключение по распиновке своей платы и не работайте с сетевым напряжением без изоляции.