Руководства · 13 мин чтения

Код для Arduino с помощью ИИ: хорошие промпты, проверка и исправление ошибок

Как писать код для Arduino с помощью ИИ вроде ChatGPT: шаблон промпта, проверки перед загрузкой, выдуманные функции, неверные пины, зависания из-за delay() и безопасность при работе с сетью 220 V.

Писать код для Arduino с помощью ИИ — значит описать свой проект чат-ассистенту вроде ChatGPT, Gemini, Claude или Copilot и попросить у него рабочий код для Arduino, ESP32 или Raspberry Pi Pico. При правильном подходе часы работы превращаются в минуты: вместо пустой страницы появляется черновик, готовый к компиляции. Но ИИ не видит твою схему, не знает, какая плата лежит у тебя на столе, и может с полной уверенностью заявить что-то неверное. Он может придумать несуществующую функцию библиотеки, выбрать не тот пин или написать циклы с delay(), которые всё замораживают. Поэтому настоящий навык не в том, чтобы попросить код, а в том, чтобы правильно попросить и проверить то, что пришло в ответ.

В этом руководстве разберём, как ИИ-ассистент создаёт код для Arduino и почему ошибается, как написать хороший промпт (запрос к ИИ) с платой, пинами, библиотеками и ожидаемым поведением и какие шаги помогут проверить код до загрузки в плату. Пройдём три самые частые ошибки с настоящими сообщениями компилятора и исправленным кодом. Затем поговорим о том, как правильно вставить ошибку компиляции и получить исправление, почему нельзя доверять ИИ при работе с сетевым напряжением 220 V и как пользоваться этими инструментами, не бросая учёбу.

Плата Arduino Uno R3
ИИ умеет писать код, но не видит твою плату, провода и модули; эти сведения нужно дать ему в промпте.

Как ИИ пишет код для Arduino и почему ошибается?

Большие языковые модели (LLM) вроде ChatGPT пишут код не так, как компилятор, который его выполняет: они предсказывают самое вероятное продолжение на основе миллионов примеров, увиденных при обучении. Для тем, по которым в интернете полно примеров (мигание светодиодом, чтение DHT11, поворот сервопривода), это работает очень хорошо. Но знания модели заморожены на определённой дате, поэтому она может не знать о функциях, изменившихся в новых версиях библиотек. Она может перепутать функции двух разных библиотек с одинаковым названием. А главное, вместо «не знаю» она может выдумать правдоподобный ответ; это называется галлюцинацией. Схему модель не видит, поэтому номера пинов, уровни напряжения и версии модулей она берёт либо из твоего описания, либо из собственных догадок.

ЗадачаНасколько хорошо справляется ИИ?Почему?
Простой пример (светодиод, кнопка, чтение датчика)Очень хорошоВ интернете тысячи похожих примеров
Построчное объяснение готового кодаОчень хорошоЧтобы прочитать и объяснить код, гадать не нужно
Поиск причины ошибки компиляцииХорошоСообщения об ошибках строятся по шаблонам, которые модели узнают
Код под последнюю версию библиотекиСлабоЗнания заморожены на определённой дате; новых функций модель может не знать
Выбор пинов под твою схемуСлабоМодель не видит плату и подключение, поэтому делает предположения
Тайминг и несколько дел одновременноСреднеБольшинство примеров написано с delay(), поэтому получается блокирующий код
Сетевое напряжение, аккумуляторы и сильноточные схемыНенадёжноЦена ошибки — ожог, пожар или удар током; модель не может отвечать за результат

Как написать хороший промпт?

Код от ИИ не может быть лучше информации, которую ты ему даёшь. В запросе из одной строки вроде «напиши код для Arduino, который измеряет температуру» модель сама выбирает плату, датчик, пин и библиотеку. Если её выбор не совпадает с тем, что есть у тебя, код либо не скомпилируется, либо скомпилируется и не заработает. Хороший промпт пишется так, будто объясняешь проект по телефону другу, который слышит о нём впервые: плата, компоненты, подключения, библиотеки, ожидаемое поведение и ограничения называются по очереди. В таблице ниже собрано, что должно быть в промпте для Arduino:

Что должно быть в промпте?Почему это важноПример
Точное название платыУ Uno, ESP32 и Pico разные пины, напряжения и командыArduino Uno R3 (ATmega328P)
Версия IDE и ядраУ ESP32 функции изменились между ядрами 2.x и 3.xArduino IDE 2.3, ядро esp32 3.x
Модели компонентовDHT11 и DHT22, как и SG90 и MG996R, — не одно и то жеDHT22, LCD 16x2 с I2C (PCF8574, адрес 0x27)
Подключение пиновМодель следует твоей схеме, а не выдумывает пиныDHT22 DATA → D2, кнопка между D3 и GND
Название и автор библиотекиУ разных библиотек с одним названием разные функцииAdafruit DHT sensor library, LiquidCrystal I2C от Frank de Brabander
Ожидаемое поведение в числах«Пищать, когда жарко» — расплывчато, «выше 30 °C» — измеримоИзмерять каждые 2 секунды, выше 30 °C пищать зуммером 3 раза
ОграниченияС самого начала пресекает вредные привычки моделиНе используй delay(), используй millis()
Формат ответаКод и сведения для настройки приходят вместеОдин файл .ino, комментарии на русском, список нужных библиотек

Например, такой промпт даёт куда лучший результат, чем просьба в одну строку: «Использую Arduino Uno R3 и Arduino IDE 2.3. Пин DATA датчика DHT22 подключён к D2, активный зуммер — к D8, у LCD 16x2 с I2C (PCF8574, адрес 0x27) SDA на A4, SCL на A5. Установлены Adafruit DHT sensor library и библиотека LiquidCrystal I2C от Frank de Brabander. Каждые 2 секунды выводи температуру и влажность на LCD, а если температура выше 30 °C, коротко пищи зуммером. Используй millis() вместо delay() и добавь к строкам комментарии на русском. В начале перечисли библиотеки, которые нужно установить, а в конце — какие допущения были сделаны.» С таким промптом модели почти нечего угадывать.

Прежде чем просить код, добавь: «Не хватает ли информации, чтобы написать этот проект? Сначала задай мне вопросы». Хорошая модель спросит о напряжении питания, о том, голый ли датчик или на модуле, или об адресе LCD. Никогда не вставляй в промпт пароль от Wi-Fi, API-ключ или токен бота; используй вместо них заглушки вроде «YOUR_PASSWORD», а настоящие значения впиши в код вручную в самом конце.

Как проверить код, написанный ИИ

Каким бы аккуратным ни выглядел код, перед загрузкой в плату прогони его по чек-листу. Большинство шагов занимает пару минут и обходится гораздо дешевле, чем модуль, сгоревший из-за неправильно подключённого пина:

  1. Сначала просто скомпилируй: нажми «Проверить» (Verify, кнопка с галочкой), не подключая плату. Если появилась ошибка, исправь её способом, описанным ниже; что означают сообщения, смотри в статье Ошибки компиляции Arduino.
  2. Проверь библиотеки по одной: найди каждую строку #include в «Менеджере библиотек» (Library Manager) и установи ту библиотеку, у которой название, автор и примеры совпадают с кодом. Если непонятно, как это сделать, руководство как добавить библиотеку в Arduino проведёт по шагам.
  3. Сверь пины: сравни каждый номер пина в коде со своим подключением и распиновкой платы. Пины с PWM и пины, которых лучше избегать, удобно смотреть в утилите распиновки.
  4. Посчитай электрические величины: проверь предложенный номинал резистора в калькуляторе резистора для светодиода. Если датчик с выходом 5 V идёт к ESP32 или Pico на 3,3 V, поставь между ними делитель напряжения.
  5. Попробуй в симуляторе: запусти код в Wokwi или Tinkercad до подключения настоящего железа; логические ошибки найдутся без риска для деталей.
  6. Тестируй по частям: не загружай весь проект за один раз. Сначала попробуй маленький скетч, который только читает датчик и выводит данные в монитор порта, потом добавь дисплей, а зуммер или реле — в последнюю очередь.
  7. Следи за монитором порта: добавь Serial.println() в ключевых местах, чтобы видеть, принимают ли переменные ожидаемые значения, и убедись, что скорость совпадает с Serial.begin() в коде. Подробнее в статье Монитор порта Arduino.
  8. Попроси объяснить код: про каждую непонятную строку спроси: «Что делает эта строка и что будет, если её удалить?» Никогда не загружай код, который не можешь объяснить.

Частая ошибка 1: несуществующие функции библиотек

Самая коварная ошибка ИИ — функции, которых на самом деле нет, но с очень правдоподобными названиями. Например, в стандартной библиотеке Servo есть attach(), write(), writeMicroseconds(), read() и detach(), но нет функции setSpeed(); модель может выдумать её, если попросить сервопривод, который поворачивается медленно. Иногда функция действительно существует, но на другой плате: Serial.printf() работает на ESP32, а на Arduino Uno не компилируется. А иногда функция осталась в старой версии: ledcSetup() и ledcAttachPin() убрали в версии 3.x ядра ESP32 для Arduino, вышедшей в 2024 году, но большинство моделей до сих пор пишут код с ними. Бывают и разные библиотеки с одинаковым заголовочным файлом: в одной библиотеке под названием LiquidCrystal_I2C.h дисплей запускается через lcd.init(), а в другой с тем же названием — через lcd.begin(). Если в выводе компилятора есть предупреждение «Multiple libraries were found» (найдено несколько библиотек), подозревай именно такую путаницу.

Что написал ИИСообщение компилятора или симптомНастоящее решение
Serial.printf("%d", x) на Uno'class HardwareSerial' has no member named 'printf'; did you mean 'print'? (у класса нет члена printf)Выводи по частям через Serial.print() или сначала собери текст с помощью snprintf()
sprintf(buf, "%.1f", t) на UnoКомпилируется, но вместо числа выводит ?На AVR семейство printf не поддерживает дробные числа; используй dtostrf(t, 4, 1, buf)
servo.setSpeed(10) (скорость сервопривода)'class Servo' has no member named 'setSpeed' (нет такой функции)Меняй угол маленькими шагами в цикле
ledcSetup(0, 5000, 8) на ядре ESP32 3.x'ledcSetup' was not declared in this scope (функция не объявлена)Используй ledcAttach(пин, частота, разрешение) и ledcWrite(пин, значение)
Установлена только библиотека DHTfatal error: Adafruit_Sensor.h: No such file or directory (файл не найден)Установи ещё и библиотеку Adafruit Unified Sensor
lcd.begin(), который не подходит к установленной библиотекеno matching function for call to 'LiquidCrystal_I2C::begin()' (нет подходящей функции)Открой пример из самой установленной библиотеки и используй её команду запуска (например, lcd.init())
analogReadResolution(12) на Uno'analogReadResolution' was not declared in this scope (функция не объявлена)АЦП у Uno 10-битный; удали строку, значения идут от 0 до 1023

Ловушка старых функций на ESP32: ledcAttach вместо ledcSetup

Если попросить код для ESP32, который регулирует яркость светодиода или скорость мотора, ИИ, скорее всего, напишет тройку ledcSetup(канал, частота, разрешение), ledcAttachPin(пин, канал) и ledcWrite(канал, значение). Такой код работает на ядре версии 2.x. А в версии 3.x каналы назначаются автоматически: ledcAttach(пин, частота, разрешение) настраивает пин за один вызов, а ledcWrite(пин, значение) теперь принимает номер пина вместо канала. Какая версия установлена, видно рядом с пакетом esp32 в «Менеджере плат» (Boards Manager). Код ниже проверяет версию при компиляции, поэтому работает на обоих ядрах:

C++ (Arduino IDE)
1// ESP32 PWM: çekirdek 2.x ve 3.x ile uyumlu LED soldurma / LED fade for both core 2.x and 3.x
2#include <esp_arduino_version.h>   // ESP_ARDUINO_VERSION_MAJOR için / for ESP_ARDUINO_VERSION_MAJOR
3
4const int LED_PIN = 2;             // çoğu DevKit'te dahili LED / onboard LED on most DevKits
5const uint32_t FREKANS = 5000;     // PWM frekansı, Hz / PWM frequency, Hz
6const uint8_t COZUNURLUK = 8;      // 8 bit: 0-255 / 8-bit: 0-255
7
8#if ESP_ARDUINO_VERSION_MAJOR >= 3
9// Çekirdek 3.x: kanal otomatik seçilir, fonksiyonlar pin alır / Core 3.x: channel is automatic, functions take the pin
10void pwmBaslat() { ledcAttach(LED_PIN, FREKANS, COZUNURLUK); }
11void pwmYaz(uint32_t deger) { ledcWrite(LED_PIN, deger); }
12#else
13// Çekirdek 2.x: önce kanal kurulur, sonra pine bağlanır / Core 2.x: set up a channel, then attach the pin
14const uint8_t KANAL = 0;
15void pwmBaslat() { ledcSetup(KANAL, FREKANS, COZUNURLUK); ledcAttachPin(LED_PIN, KANAL); }
16void pwmYaz(uint32_t deger) { ledcWrite(KANAL, deger); }
17#endif
18
19void setup() {
20  Serial.begin(115200);
21  Serial.print("ESP32 Arduino cekirdegi / core: ");
22  Serial.println(ESP_ARDUINO_VERSION_MAJOR);
23  pwmBaslat();
24}
25
26void loop() {
27  // Tek iş yaptığı için burada delay() sorun değil / delay() is fine here: only one task
28  for (int d = 0; d <= 255; d++) { pwmYaz(d); delay(4); }   // yavaşça yan / fade in
29  for (int d = 255; d >= 0; d--) { pwmYaz(d); delay(4); }   // yavaşça sön / fade out
30}

Урок здесь касается не только ESP32: если указать в промпте версии ядра и библиотек, у модели появляется шанс выбрать правильные функции. Если версия указана, а модель всё равно использует старые функции, открой один из официальных примеров библиотеки в меню «Файл › Примеры» (File › Examples) и вставь его в промпт с просьбой «перепиши с функциями из этого примера». Официальные примеры всегда соответствуют установленной версии. Если интересно, как работает ШИМ, загляни в статью Что такое PWM?

Частая ошибка 2: не тот пин

Даже если код скомпилировался и загрузился, неверный пин означает схему, которая молча ничего не делает, или сгоревший модуль. Компилятор такое не поймает: для него номер пина — просто число. Вот какие ошибки с пинами ИИ делает чаще всего, по платам:

ПлатаЧастая ошибка ИИЧто происходит?Как правильно
Arduino UnoПин без PWM для analogWrite() (например, D7)Светодиод не меняет яркость: ниже 128 он не горит, от 128 и выше горит в полную силуПины с PWM: 3, 5, 6, 9, 10, 11
Arduino UnoМодуль подключён к D0 или D1Загрузка может не проходить, а в мониторе порта может появляться мусорD0 и D1 — это последовательная линия USB; начинай с D2
Arduino NanoA6 и A7 используются как цифровые пиныdigitalRead() и digitalWrite() не работаютA6 и A7 — только аналоговые входы
ESP32Используются GPIO 6–11Плата падает или постоянно перезагружаетсяЭти пины связаны с флеш-памятью; выбирай безопасные пины, например GPIO 4, 5, 16–19, 21–23
ESP32GPIO 34–39 используются как выходыСветодиод не загорается; кнопка без подтяжки читается нестабильноЭти пины работают только как входы и не имеют встроенных подтягивающих резисторов
ESP32Чтение аналоговых значений с пинов ADC2 при включённом Wi-FianalogRead() не срабатывает или возвращает бессмысленные значенияПодключай аналоговые датчики к пинам ADC1 (GPIO 32–39)
Raspberry Pi Pico WPin(25) для встроенного светодиодаСветодиод не загораетсяНа Pico W светодиод подключён к беспроводному чипу; используй Pin("LED")
ИИ часто не учитывает уровни напряжения. Пины ESP32 и Raspberry Pi Pico работают от 3,3 V и не выдерживают 5 V; если подключить датчик с выходом 5 V напрямую, пин может выйти из строя навсегда. С одного пина Arduino Uno стоит брать не больше 20 mA длительно (абсолютный максимум 40 mA). Моторы, катушки реле и длинные светодиодные ленты никогда не подключаются к пину напрямую; между ними ставится транзистор или драйвер. Расположение пинов своей платы смотри в статье Распиновка Arduino Uno.

Частая ошибка 3: зависания из-за delay()

Большинство примеров для Arduino в интернете написано с delay(), поэтому и ИИ по умолчанию использует delay(). Пока выполняется delay(1000), процессор целую секунду больше ничего не делает: не читает кнопки, не проверяет датчики и не обновляет дисплей. В коде, который делает одно дело, это нормально. Но стоит попросить два дела сразу, например «мигай светодиодом, а при нажатии кнопки пищи зуммером», и часто получается вот такой код:

C++ (Arduino IDE)
1// Yapay zekanın sık ürettiği, kilitlenen kod / Blocking code that AI often produces
2const int BUTON_PIN = 2;    // buton: D2 ile GND arası / button between D2 and GND
3const int LED_PIN = 13;     // dahili LED / onboard LED
4const int BUZZER_PIN = 8;   // aktif buzzer / active buzzer
5
6void setup() {
7  pinMode(BUTON_PIN, INPUT_PULLUP);
8  pinMode(LED_PIN, OUTPUT);
9  pinMode(BUZZER_PIN, OUTPUT);
10}
11
12void loop() {
13  digitalWrite(LED_PIN, HIGH);
14  delay(1000);                          // 1 sn boyunca buton okunmaz / button is not read for 1 s
15  digitalWrite(LED_PIN, LOW);
16  delay(1000);                          // 1 sn daha kör bekleme / another blind second
17
18  if (digitalRead(BUTON_PIN) == LOW) {  // yalnızca tam bu anda basılıysa / only if pressed right now
19    digitalWrite(BUZZER_PIN, HIGH);
20    delay(200);
21    digitalWrite(BUZZER_PIN, LOW);
22  }
23}

Этот код компилируется без ошибок, но при нажатии кнопки чаще всего ничего не происходит. Около 2 секунд каждого прохода loop() уходит на два вызова delay(), а кнопка читается лишь в течение нескольких микросекунд между ними. Короткое нажатие почти всегда пропускает этот момент; чтобы зуммер точно сработал, кнопку приходится держать дольше 2 секунд. Решение — не ждать, а смотреть на часы: millis() возвращает число миллисекунд с момента запуска платы, каждая задача проверяет, пришло ли её время, а loop() прокручивается тысячи раз в секунду:

C++ (Arduino IDE)
1// millis() ile kilitlenmeyen sürüm / Non-blocking version with millis()
2const int BUTON_PIN = 2;    // buton: D2 ile GND arası / button between D2 and GND
3const int LED_PIN = 13;     // dahili LED / onboard LED
4const int BUZZER_PIN = 8;   // aktif buzzer / active buzzer
5
6const unsigned long LED_ARALIK = 1000;  // LED değişim aralığı, ms / LED toggle interval, ms
7const unsigned long BIP_SURE = 200;     // bip süresi, ms / beep length, ms
8const unsigned long SICRAMA = 30;       // debounce süresi, ms / debounce time, ms
9
10unsigned long ledZaman = 0;     // LED'in son değiştiği an / last LED toggle
11unsigned long bipZaman = 0;     // bipin başladığı an / beep start
12unsigned long butonZaman = 0;   // butonun son değiştiği an / last button change
13bool ledDurum = false;
14bool bipCaliyor = false;
15int oncekiButon = HIGH;         // önceki buton seviyesi / previous button level
16
17void setup() {
18  pinMode(BUTON_PIN, INPUT_PULLUP);
19  pinMode(LED_PIN, OUTPUT);
20  pinMode(BUZZER_PIN, OUTPUT);
21}
22
23void loop() {
24  unsigned long simdi = millis();
25
26  // 1) LED: zamanı geldiyse durum değiştir / toggle the LED when its time has come
27  if (simdi - ledZaman >= LED_ARALIK) {
28    ledZaman = simdi;
29    ledDurum = !ledDurum;
30    digitalWrite(LED_PIN, ledDurum ? HIGH : LOW);
31  }
32
33  // 2) Buton: yalnızca basıldığı anı yakala / catch only the moment of the press
34  int buton = digitalRead(BUTON_PIN);
35  if (buton != oncekiButon && simdi - butonZaman >= SICRAMA) {
36    butonZaman = simdi;
37    oncekiButon = buton;
38    if (buton == LOW && !bipCaliyor) {  // HIGH -> LOW: yeni basış / new press
39      bipCaliyor = true;
40      bipZaman = simdi;
41      digitalWrite(BUZZER_PIN, HIGH);
42    }
43  }
44
45  // 3) Buzzer: süre dolunca sustur / silence it when the time is up
46  if (bipCaliyor && simdi - bipZaman >= BIP_SURE) {
47    bipCaliyor = false;
48    digitalWrite(BUZZER_PIN, LOW);
49  }
50}

В этой версии светодиод, кнопка и зуммер работают, не дожидаясь друг друга. Вычитание вида simdi - ledZaman >= LED_ARALIK даёт правильный результат даже тогда, когда millis() примерно раз в 49,7 дня переполняется и начинает с нуля, а сравнение millis() > targetTime, которое ИИ иногда пишет, на этом переполнении ломается. Если ловить момент перехода кнопки из HIGH в LOW, зуммер не будет пищать снова и снова, пока кнопка зажата, а пауза 30 мс отсекает дребезг контактов (антидребезг). Вся тема подробно разобрана в руководстве millis() и delay() в Arduino, а подключение кнопки — в статье как подключить кнопку к Arduino.

Если с самого начала написать в промпте «не используй delay(), каждую задачу засекай через millis()», этой проблемы не будет вовсе. Стоит проверить ещё два шаблона зависаний: на платах со встроенным USB, таких как Leonardo и Micro, строка while (!Serial); заставляет программу ждать вечно, если плата не подключена к компьютеру. А delay() внутри обработчика прерывания (ISR) может намертво остановить программу, потому что во время прерывания millis() не идёт вперёд.

Как вставить ошибку компиляции и получить исправление

ИИ действительно хорошо объясняет ошибки компиляции, если дать ему ошибку целиком и контекст. Фраза «код не работает» заставляет модель гадать. Действуй в таком порядке:

  1. Когда в Arduino IDE 2 появляется ошибка компиляции, нажми «Копировать сообщения об ошибках» (Copy error messages) в уведомлении справа внизу или выдели и скопируй весь текст в панели вывода. Строка exit status 1 в самом конце сама по себе бесполезна; настоящая причина — в строке error: выше.
  2. В промпте по порядку должны быть: плата и версия ядра, код целиком, сообщение об ошибке целиком, названия и версии установленных библиотек.
  3. Прежде чем просить исправление, напиши: «Сначала объясни причину ошибки, потом покажи только те строки, которые нужно изменить». Так модель не перепишет весь скетч заново с новыми ошибками, а тебе станет понятно, что изменилось и почему.
  4. Внеси предложенное изменение и скомпилируй ещё раз. Если появилась новая ошибка, снова вставь самую верхнюю строку error:; исправляй по одной ошибке за раз.
  5. Если та же ошибка не уходит после двух-трёх кругов, разорви этот цикл и скомпилируй официальный пример библиотеки. Если и пример не компилируется, проблема не в коде, а в настройке: выбрана не та плата, не хватает библиотеки или конфликтуют две библиотеки с одинаковым названием.

Если ошибка возникает не при компиляции, а при загрузке (например, «avrdude: stk500_recv(): programmer is not responding» (программатор не отвечает) или «Failed to connect to ESP32» на ESP32), менять код бесполезно; нужно проверить порт, кабель, драйвер и выбор платы. Руководство код не загружается в Arduino разбирает эти случаи по шагам. Спрашивая ИИ об ошибке загрузки, укажи сообщение целиком и свою операционную систему.

Код для Raspberry Pi Pico и MicroPython с помощью ИИ

Когда просишь код на MicroPython, действуют те же правила, но здесь ИИ может ещё и перепутать платформы. Код для компьютеров Raspberry Pi с RPi.GPIO или gpiozero на Pico не запустится; на Pico используется модуль machine из MicroPython. Модулей board и digitalio из CircuitPython в MicroPython тоже нет. Поэтому пиши в промпте чёткие сведения вроде «Raspberry Pi Pico W, MicroPython, Thonny». Код ниже работает и на Pico, и на Pico W и отсчитывает время через ticks_ms() вместо ожидания:

MicroPython
1# Pico ve Pico W: bekletmeden LED + buton / Pico and Pico W: LED + button without blocking
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT)             # Pico W'da Pin(25) çalışmaz / Pin(25) does not work on Pico W
6buton = Pin(14, Pin.IN, Pin.PULL_UP)  # buton: GP14 ile GND arası / button between GP14 and GND
7
8ARALIK = 500                          # LED değişim aralığı, ms / LED toggle interval, ms
9SICRAMA = 30                          # debounce süresi, ms / debounce time, ms
10son = time.ticks_ms()                 # LED'in son değiştiği an / last LED toggle
11degisim = time.ticks_ms()             # butonun son değiştiği an / last button change
12onceki = 1                            # önceki buton seviyesi / previous button level
13sayac = 0
14
15while True:
16    simdi = time.ticks_ms()
17    if time.ticks_diff(simdi, son) >= ARALIK:      # taşmada da doğru / correct even on overflow
18        son = simdi
19        led.toggle()
20    deger = buton.value()
21    if deger != onceki and time.ticks_diff(simdi, degisim) >= SICRAMA:
22        degisim = simdi
23        onceki = deger
24        if deger == 0:                # basıldığı an / moment of the press
25            sayac += 1
26            print("Basma / press:", sayac)

Если запустить код в Thonny, встроенный светодиод мигает каждые полсекунды, а при каждом нажатии кнопки в окне Shell появляется растущее число. time.ticks_diff() даёт правильную разницу даже тогда, когда счётчик тиков начинает сначала, а простое вычитание time.ticks_ms() - son, которое часто пишет ИИ, в долго работающем коде может дать неверный результат. Если Pico для тебя в новинку, начни со статьи Что такое Raspberry Pi Pico?

Сетевое напряжение 220 V: не доверяй ИИ

ИИ за секунды напишет код для реле, которое включает сетевую лампу, розетку или обогреватель, и с полной уверенностью опишет подключение. Но сетевое напряжение может убить; неправильное соединение или плохо закреплённый провод могут привести к удару током и пожару. Модель не может измерить подключение, которое описывает, не видит твою схему и не может отвечать за результат. Никогда не делай подключений к сети 220 V только по инструкциям ИИ; если тебе нет 18 лет, такую работу всегда нужно выполнять вместе со взрослым или с тем, кто разбирается в электрике.

Если проект будет работать от сети, сначала проверь его на низком напряжении: светодиод вместо лампы и светодиодная лента на 12 V вместо розетки. Если системе действительно нужно коммутировать сеть, некоторые правила не обсуждаются. Перед работой со схемой вынь вилку из розетки. Реле должно разрывать фазный провод (L), а не нулевой. Не превышай ток и напряжение, указанные на модуле реле (у большинства модулей 10 A 250 VAC), и убери высоковольтную часть в закрытый изолированный корпус. В дешёвых модулях реле расстояние между низковольтной и высоковольтной частью часто недостаточное; по возможности выбирай готовую сертифицированную умную розетку или блок реле. Подключение модуля реле подробно описано в статье Что такое модуль реле?

Как пользоваться ИИ и не бросать учёбу

Если ИИ пишет за тебя каждый скетч, то в первый же день, когда код не заработает, будет непонятно, что делать. Если цель — научиться электронике и программированию, используй ИИ не как автомат для кода, а как терпеливого учителя:

  • Сначала пиши без помощи: попробуй справиться своими силами, а потом попроси ИИ проверить код фразой «покажи ошибки, но не давай исправленный код».
  • Проси подсказку, а не ответ: когда не получается, скажи: «дай мне только подсказку для следующего шага».
  • Проси объяснить построчно: после объяснения попробуй пересказать ту же логику своими словами; то, что не получается объяснить, ещё не выучено.
  • Набирай, а не копируй: если набирать код руками, а не вставлять, синтаксис и названия функций запоминаются гораздо быстрее.
  • Предскажи, потом проверь: прежде чем менять значение, предскажи, что произойдёт (например, если LED_ARALIK станет 200), а затем загрузи код в плату и проверь.
  • Устрой себе проверку: попроси ИИ задать пять вопросов по только что изученной теме; чтобы освежить основы, загляни в статью Основы программирования Arduino.
  • Соблюдай правила: в школьных заданиях, на научных выставках и конкурсах соблюдай правила использования ИИ и честно указывай, если ИИ помогал.

Первые проекты, которые стоит попробовать с ИИ

  • Термометр с дисплеем: выводи значения, измеренные DHT11, на I2C LCD; укажи в промпте адрес LCD и автора библиотеки.
  • Парктроник: измеряй расстояние с помощью HC-SR04 и пищи всё чаще по мере приближения препятствия; попроси тайминг на millis().
  • Ночник: включай светодиод, когда темнеет, с помощью LDR; сначала узнай пороговое значение по монитору порта и укажи его в промпте числом.
  • Управление светодиодом по Wi-Fi: включай и выключай светодиод со страницы, открытой на телефоне, с помощью ESP32; укажи в промпте версию ядра.
  • Своя идея: выбери проект из списка идей проектов на Arduino и опиши его ИИ по шаблону промпта из этого руководства.

ИИ может стать самым быстрым помощником под рукой, пока изучаешь Arduino, если давать ему точные сведения, компилировать то, что пришло, проверять пины, тестировать по частям и никогда не загружать строку, которую не понимаешь. Если нужны надёжные примеры, с которыми можно сравнить код от ИИ, в приложении BlueGrays есть проекты со светодиодом, кнопкой, DHT11, PWM на ESP32 и Pico, с пошаговыми схемами подключения и проверенным кодом.

Частые вопросы

Может ли ИИ написать код для Arduino?

Да. Ассистенты вроде ChatGPT, Gemini, Claude и Copilot способны выдать рабочий код для большинства простых проектов на Arduino, ESP32 и Raspberry Pi Pico. Но перед загрузкой код нужно скомпилировать и вручную проверить пины, библиотеки и уровни напряжения: ИИ не видит твою схему и может ошибаться.

Какой ИИ лучше всего пишет код для Arduino?

Единственно верного ответа нет: современные большие модели дают похожие результаты на простом коде для Arduino. Разница обычно зависит не от модели, а от промпта: если в нём чётко указаны плата, подключение пинов, библиотеки и ожидаемое поведение, код получается лучше, какой бы ассистент ни использовался.

Почему не работает код для Arduino от ChatGPT?

Самые частые причины — функции, которых не существует или которые относятся к другой плате, код под другую версию библиотеки, неверные пины и вызовы delay(), которые всё блокируют. Сначала скомпилируй код; если есть ошибка, вставь сообщение целиком вместе с данными о плате и версиях. Если код компилируется, но не работает, выводи промежуточные значения в монитор порта, чтобы найти, где проблема.

Как попросить ИИ исправить ошибку компиляции Arduino?

Дай в одном сообщении название платы, версии ядра и библиотек, код целиком и сообщение об ошибке целиком из панели вывода. Если добавить «сначала объясни причину, потом покажи только изменённые строки», получится и правильное исправление, и понимание, почему возникла ошибка.

Можно ли доверять схеме подключения реле к сети 220 V от ИИ?

Нет, одной только ей — нельзя. Код обычно в порядке, но опасность кроется в подключении: ИИ не видит твою схему и не может гарантировать, что его инструкции верны. Подключай сетевую часть только вместе с человеком, который в этом разбирается, при вынутой из розетки вилке, с реле, которое разрывает фазный провод и стоит в закрытом корпусе; по возможности используй готовую сертифицированную умную розетку.

Мешает ли ИИ учиться Arduino?

Если копировать код, не понимая его, — да: при первой же ошибке будет непонятно, что делать. Если сначала писать код без подсказок, а ИИ просить проверить его, объяснить построчно и давать подсказки вместо ответов, учёба идёт быстрее. Правило простое: никогда не загружай строку, которую не можешь объяснить.

Все проекты
Мигающий светодиод
#1Новичок

Мигающий светодиод

Самое первое «привет» в электронике: включение и выключение одного светодиода. Arduino включает и выключает светодиод через короткие промежутки, поэтому свет быстро мигает. Ты самым простым способом в

4.6(188)
1127
Управление светодиодом кнопкой (удержание)
#9Новичок

Управление светодиодом кнопкой (удержание)

Как дверной звонок: свет горит, пока ты нажимаешь, и гаснет, когда отпускаешь. Arduino всё время слушает кнопку; пока она нажата, светодиод горит, а как только ты убираешь палец, он гаснет. Эта просте

4.8(113)
229
Температура и влажность с DHT11
#55Средний

Температура и влажность с DHT11

Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

4.7(47)
73
Мигающий светодиод на ESP32
#103Новичок

Мигающий светодиод на ESP32

Учит базовой работе с выходами GPIO на ESP32. Эффект мигания получается включением и выключением светодиода с цифрового пина. Это ESP32-версия классического проекта мигания на Arduino UNO; базовые команды мигания в среде Arduino те же, но расположение пинов ESP32 и уровни GPIO 3,3 V отличаются от Arduino UNO.

4.7(37)
99
Мигание встроенным светодиодом Raspberry Pi Pico (Pico и Pico W)
#147Новичок

Мигание встроенным светодиодом Raspberry Pi Pico (Pico и Pico W)

Первый проект серии Raspberry Pi Pico! Мигаем зелёным встроенным светодиодом, чтобы проверить, что плата работает, — классический первый опыт «Hello World». НИКАКИХ внешних компонентов, только Pico и USB-кабель. Код написан на MicroPython (официальном языке, поддерживаемом Raspberry Pi Foundation). Изучи в Thonny IDE класс machine.Pin, режим Pin.OUT, методы led.on()/off() и time.sleep(). Каждое переключение видно в выводе (REPL).

5.0(1)
10
Плавное затухание светодиода с PWM на ESP32
#110Новичок

Плавное затухание светодиода с PWM на ESP32

Плавное изменение яркости светодиода от 0 до максимума и от максимума до 0. PWM управляется через analogWrite(), как в Arduino, — тот же синтаксис без проблем работает в ESP32 Arduino Core 3.0+. Достаточно определения пина, pinMode и analogWrite.

4.8(36)
54
Плавное затухание светодиода с PWM на Pico (эффект дыхания)
#160Новичок

Плавное затухание светодиода с PWM на Pico (эффект дыхания)

Светодиод больше не просто мигает — он дышит! С помощью PWM (широтно-импульсной модуляции) Raspberry Pi Pico яркость светодиода медленно растёт и медленно падает, как огонёк спящего MacBook. Изучи класс machine.PWM, duty_u16() (16-битная яркость 0–65535), частоту PWM (freq(1000) — 1000 циклов вкл/выкл в секунду, мерцания не видно), циклы range() с шагом (вверх и вниз) и почти аналоговый выход с цифрового пина.

0.0(0)
4
LCD-экран с I2C
#32Новичок
Premium

LCD-экран с I2C

Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо

4.8(53)
70