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

Данные Arduino в Excel: Data Streamer, PLX-DAQ, CSV и Python

Четыре способа передать данные Arduino в Excel: из монитора порта в CSV, Data Streamer, PLX-DAQ и запись через Python, а также метки времени, графики и таблица для отчёта об эксперименте.

Передать данные Arduino в Excel — значит отправить значения, которые Arduino считывает с датчиков, по USB-кабелю на компьютер и собрать их строка за строкой в таблице. Arduino выводит каждое измерение в последовательный порт одной строкой со значениями через запятую; на компьютере есть четыре распространённых способа перенести эти строки в Excel: сохранение вывода монитора порта в CSV-файл, надстройка Microsoft Data Streamer, макрос PLX-DAQ и автоматическая запись с помощью Python. Принцип везде одинаковый: каждая строка от Arduino становится строкой в Excel, а каждая запятая начинает новый столбец.

В этом руководстве для примера используются датчик температуры и влажности DHT11 и датчик освещённости на фоторезисторе (LDR). Сначала сравним четыре способа, чтобы было проще выбрать подходящий, а затем настроим каждый шаг за шагом. После этого разберём, как добавить к измерениям метки времени, как выбрать правильный тип графика в Excel и как подготовить таблицу измерений для отчёта об эксперименте, которая пригодится в школе или на научной выставке. В последних разделах — то же самое на ESP32 и Raspberry Pi Pico и решения самых частых ошибок.

Плата Arduino Uno и USB-разъём
Arduino Uno: показания идут на компьютер через виртуальный последовательный порт по USB-кабелю; чтобы отправить их в Excel, никакой дополнительный модуль не нужен.

Как работает передача данных из Arduino в Excel?

Arduino не умеет писать в Excel напрямую: она только отправляет текст в последовательный порт с помощью Serial.print(). Компьютер видит этот порт под именем вроде COM3 в Windows, /dev/cu.usbmodem… в macOS или /dev/ttyACM0 в Linux. Общий язык Excel и Arduino — CSV (Comma Separated Values, значения через запятую): строка вроде 12.0,23.0,45,78 разбивается на четыре столбца. Поэтому в скетче достаточно соблюдать два правила: всегда ставить между значениями один и тот же разделитель и завершать каждое измерение вызовом Serial.println(). Основы работы с последовательным портом подробно описаны в руководстве «Монитор порта Arduino».

СпособПлатформаПередача в реальном времениВремя измеренияЛучше всего подходит
Монитор порта + CSVWindows, macOS, LinuxНет, данные копируются после измеренийОпция меток времени в IDEКороткие эксперименты, быстрая проверка
Excel Data StreamerWindows, настольный Excel из Microsoft 365Даmillis(), которое отправляет ArduinoГрафики в реальном времени на уроке
PLX-DAQ v2Windows, настольный Excel (макрос)ДаКоманды DATE, TIME и TIMERДолгая запись в готовую таблицу
Python (pyserial + openpyxl)Windows, macOS, LinuxДа, в файлЧасы компьютераАвтоматические отчёты, запись часами
Модуль SD-картыКомпьютер не нуженНет, карта читается потомМодуль RTCИзмерения в полевых условиях от батареи

Пример схемы: подключение DHT11 и фоторезистора

В примере два датчика. DHT11 измеряет температуру с разрешением 1 °C, а влажность — 1%; его точность — около ±2 °C и ±5% относительной влажности, и ему хватает одного пина данных. LDR — это фоторезистор, сопротивление которого падает с ростом освещённости; вместе с резистором 10 kΩ из него получается делитель напряжения, а средняя точка подключается к аналоговому пину. При подключении, как в таблице ниже, аналоговое значение растёт, когда становится светлее. Число, которое даёт фоторезистор, — не люксы, а относительный уровень освещённости, поэтому в отчёте честнее подписать его «освещённость (%)». Если нужны настоящие люксы, используй откалиброванный датчик освещённости, например BH1750.

ПодключениеArduino UnoESP32Raspberry Pi Pico
DHT11 VCC (+)5V3V3Используется встроенный датчик
DHT11 DATA (OUT)D2GPIO 4Встроенный датчик (ADC4)
DHT11 GND (-)GNDGND-
Ножка 1 фоторезистора5V3V33V3(OUT), пин 36
Ножка 2 фоторезистора + 10 kΩA0GPIO 34GP26 (ADC0), пин 31
Другой конец резистора 10 kΩGNDGNDAGND, пин 33
На трёхпиновых модулях DHT11 подтягивающий резистор для линии данных уже стоит на плате; если используется голый датчик с четырьмя ножками, между DATA и VCC нужно вручную добавить резистор 4,7–10 kΩ, иначе скетч всё время будет читать nan. На ESP32 и Pico всегда питай делитель с фоторезистором от 3,3 V: если подключить его к 5 V, на аналоговый пин попадёт напряжение выше допустимого для платы.
Модуль датчика температуры и влажности DHT11
DHT11: передаёт и температуру, и влажность по одному пину данных; между двумя измерениями нужно ждать не меньше 1 секунды.

Код для Arduino: отправляем измерения строками CSV

C++ (Arduino IDE)
1// DHT11 + LDR ölçümlerini CSV satırı olarak gönderir / Sends DHT11 + LDR readings as CSV lines
2#include <DHT.h>
3
4const int DHT_PIN = 2;                 // DHT11 veri pini / DHT11 data pin
5const int LDR_PIN = A0;                // LDR + 10k gerilim bölücü / LDR + 10k voltage divider
6const unsigned long ARALIK = 2000;     // ölçüm aralığı, ms (DHT11 için en az 1000) / interval in ms (at least 1000 for DHT11)
7
8DHT dht(DHT_PIN, DHT11);               // DHT22 kullanıyorsan DHT22 yaz / write DHT22 if you use one
9unsigned long sonOlcum = 0;
10
11void setup() {
12  Serial.begin(9600);                  // Data Streamer ve PLX-DAQ varsayılanı / default of Data Streamer and PLX-DAQ
13  dht.begin();
14  Serial.println("zaman_s,sicaklik_C,nem_yuzde,isik_yuzde");   // başlık satırı / header row
15}
16
17void loop() {
18  if (millis() - sonOlcum < ARALIK) return;   // zamanı gelmediyse çık / not time yet
19  sonOlcum = millis();
20
21  float sicaklik = dht.readTemperature();     // santigrat derece / degrees Celsius
22  float nem = dht.readHumidity();             // bağıl nem, % / relative humidity, %
23  int isik = map(analogRead(LDR_PIN), 0, 1023, 0, 100);   // göreli ışık, % / relative light, %
24
25  if (isnan(sicaklik) || isnan(nem)) {
26    Serial.println("HATA,DHT okunamadi");     // sayı olmadığı için kolay ayıklanır / easy to filter out, not a number
27    return;
28  }
29
30  Serial.print(sonOlcum / 1000.0, 1);         // açılıştan beri geçen saniye / seconds since power-up
31  Serial.print(',');                          // sütun ayırıcı / column separator
32  Serial.print(sicaklik, 1);
33  Serial.print(',');
34  Serial.print(nem, 0);
35  Serial.print(',');
36  Serial.println(isik);                       // satır sonu = yeni Excel satırı / line end = new Excel row
37}

Скетч использует библиотеку Adafruit DHT sensor library; при установке из «Менеджера библиотек» (Library Manager) согласись установить и её зависимость, Adafruit Unified Sensor. Измерения выполняются каждые 2 секунды, а время отсчитывается через millis(), а не delay(), поэтому loop() никогда не блокируется (подробнее — в руководстве о millis и delay). Каждая строка содержит столбцы время, температура, влажность и освещённость именно в этом порядке. Serial.print(sicaklik, 1) выводит число с одним знаком после запятой и всегда с точкой. Если датчик не удаётся прочитать, вместо числа скетч выводит «HATA» (ошибка), так что неудачную строку в таблице сразу видно и легко отфильтровать. Строка заголовков в setup() пригодится для способов с монитором порта и Python; при работе с Data Streamer её можно удалить. Для медленно меняющихся величин, например температуры в комнате, поставь ARALIK (интервал) равным 60000 — будет одно измерение в минуту.

Способ 1: сохраняем вывод монитора порта в CSV

  1. Загрузи скетч, открой «Инструменты › Монитор порта» (Tools › Serial Monitor) и выбери в меню скорости 9600 бод.
  2. При желании включи метки времени: в Arduino IDE 2 нажми значок часов в правом верхнем углу окна, в IDE 1.8 — флажок отметок времени внизу. В начало каждой строки добавится время компьютера в виде 14:03:21.512 ->.
  3. Когда эксперимент закончится, выдели строки мышью и скопируй их сочетанием Ctrl+C (Cmd+C в macOS). Если хочется сохранить сырые данные, вставь их в «Блокнот» и сохрани как olcum.csv, выбрав тип файла «Все файлы».
  4. В Excel щёлкни по ячейке A1 пустого листа и вставь данные сочетанием Ctrl+V; все строки окажутся в столбце A.
  5. Выдели столбец A, открой «Данные › Текст по столбцам» (Data › Text to Columns), выбери формат «с разделителями» (Delimited) и отметь разделитель «запятая» (Comma). Если включены метки времени, отметь ещё и «пробел» (Space): время попадёт в первый столбец, а знаки «->» — во второй, который потом удаляется.
  6. На последнем шаге нажми «Подробнее...» (Advanced) и поставь десятичный разделитель «точка»; так значения вроде 23.5 распознаются как числа, даже если в твоём Excel (например, с русскими региональными настройками) десятичный разделитель — запятая. Нажми «Готово» (Finish) и сохрани файл в формате .xlsx.

Этот способ очень удобен, пока строк не больше нескольких сотен; на тысячах строк выделять неудобно, да и окно IDE начинает тормозить. Для записей на несколько часов терминальные программы вроде PuTTY (Session › Logging › All session output) или CoolTerm, которая работает в Windows, macOS и Linux (Connection › Capture to Text/Binary File), пишут каждую входящую строку прямо в файл. Этот файл переносится в Excel теми же шагами. Помни: пока порт занят терминальной программой или монитором порта, надстройки Excel и Python не могут к нему подключиться.

Если в Windows выбран региональный формат, принятый в России и большинстве стран континентальной Европы (например, русский, немецкий, французский, испанский, итальянский или турецкий), Excel ждёт в CSV-файлах точку с запятой как разделитель столбцов и запятую как десятичный разделитель. Поэтому при двойном щелчке по CSV с запятыми всё может оказаться в одном столбце, а значение вроде 23.5 превратиться в дату (23 мая). Решение — не открывать файл двойным щелчком, а разбить данные через «Текст по столбцам», как показано выше, или сразу создавать файл с точкой с запятой и десятичной запятой; именно так делает скрипт на Python ниже.

Способ 2: данные в реальном времени через Excel Data Streamer

Data Streamer — бесплатная надстройка, которую Microsoft сделала для образования; она передаёт строки CSV из последовательного порта прямо на рабочий лист. Надстройка входит в настольный Excel из Microsoft 365 (версия 1902 и новее), так что её нужно только включить. Поскольку это надстройка COM, она работает только в Windows; в Excel для macOS и в веб-версии Excel её нет. На стороне Arduino ничего менять не нужно: скетч выше работает как есть на 9600 бод — это скорость надстройки по умолчанию.

  1. В Excel открой «Файл › Параметры › Надстройки» (File › Options › Add-ins), в списке «Управление» (Manage) внизу выбери «Надстройки COM» (COM Add-ins) и нажми «Перейти» (Go).
  2. Отметь Microsoft Data Streamer for Excel и нажми «ОК»; на ленте появится вкладка Data Streamer.
  3. Закрой монитор порта в Arduino IDE: последовательный порт может одновременно открыть только одна программа.
  4. Кнопкой Connect a Device («Подключить устройство») выбери COM-порт Arduino, затем нажми Start Data («Начать передачу данных»). В зависимости от языка Excel названия кнопок могут быть переведены.
  5. Excel создаст три листа: Data In (входящие данные), Data Out (данные для отправки в Arduino) и Settings (настройки). На листе Settings поставь Data Channels равным 4 и увеличь Data Rows, чтобы видеть в таблице больше истории.
  6. Чтобы сохранить постоянную запись, начни её кнопкой Record Data; после остановки кнопкой Stop Recording измерения сохранятся в CSV-файл. Позже этот файл можно воспроизвести снова через Import Data File.

Вверху листа Data In показываются последние значения (Current Data), а под ними — таблица, по которой прокручиваются прошлые измерения (Historical Data). Если выделить эту таблицу и добавить график или точечную диаграмму через «Вставка › Рекомендуемые диаграммы» (Insert › Recommended Charts), диаграмма будет сама обновляться с каждым новым измерением; это идеально, чтобы показать классу, как кривая освещённости мгновенно падает, когда датчик закрывают рукой. На листе Settings параметр Data Interval (ms) задаёт, как часто обновляется лист, а Data Orientation — где появляются новые данные: вверху или внизу таблицы. Значения, введённые на листе Data Out, тоже отправляются в Arduino строкой CSV; Arduino может прочитать их через Serial.parseInt() и, например, получить из Excel порог срабатывания сигнализации.

Если вкладка Data Streamer вообще не появляется, скорее всего, используется версия Office, отличная от Microsoft 365, или macOS; в этом случае переходи на способ с PLX-DAQ или Python. Если в скетче скорость не 9600, выставь ту же скорость в бодах в настройках окна Advanced, иначе таблица заполнится мусорными символами.

Способ 3: построчная запись в Excel с макросом PLX-DAQ

PLX-DAQ (Parallax Data Acquisition) — это макрос VBA, который работает внутри Excel и превращает специальные команды из последовательного порта в ячейки Excel. Оригинальная версия от Parallax работает только в 32-битном Excel, поэтому сегодня пользуются PLX-DAQ v2, которую разработало сообщество Arduino: она поддерживает 64-битный Excel и поставляется одним файлом .xlsm. Макрос опирается на Windows API, поэтому тоже работает только в Windows. Отличие от Data Streamer в том, что здесь Arduino управляет Excel: она сама пишет заголовки, очищает лист и заставляет Excel добавить дату и время.

C++ (Arduino IDE)
1// PLX-DAQ v2: Excel'e tarih, saat ve ölçüm satırı yazar / PLX-DAQ v2: writes date, time and readings into Excel
2#include <DHT.h>
3
4DHT dht(2, DHT11);                     // DHT11 veri pini D2 / DHT11 data pin D2
5const int LDR_PIN = A0;
6
7void setup() {
8  Serial.begin(9600);                  // PLX-DAQ'ta da 9600 seç / choose 9600 in PLX-DAQ too
9  dht.begin();
10  Serial.println("CLEARDATA");         // eski ölçümleri sil / clear old readings
11  Serial.println("LABEL,Tarih,Saat,Sure (s),Sicaklik (C),Nem (%),Isik (%)");   // 1. satır başlıkları / row 1 headers
12  Serial.println("RESETTIMER");        // TIMER sayacını sıfırla / reset the TIMER counter
13}
14
15void loop() {
16  float sicaklik = dht.readTemperature();
17  float nem = dht.readHumidity();
18  int isik = map(analogRead(LDR_PIN), 0, 1023, 0, 100);
19
20  if (!isnan(sicaklik) && !isnan(nem)) {
21    Serial.print("DATA,DATE,TIME,TIMER,");   // DATE, TIME, TIMER'ı Excel doldurur / Excel fills in DATE, TIME, TIMER
22    Serial.print(sicaklik, 1);
23    Serial.print(',');
24    Serial.print(nem, 0);
25    Serial.print(',');
26    Serial.println(isik);
27  }
28  delay(2000);                         // DHT11 saniyede en fazla 1 ölçüm verir / DHT11 gives at most 1 reading per second
29}
КомандаЧто делает
CLEARDATAУдаляет старые измерения с листа
LABEL,Tarih,Saat,... (заголовки: дата, время, …)Записывает заголовки столбцов в строку 1
DATA,...Записывает новое измерение в следующую пустую строку
DATE и TIMEВ строке DATA заменяются датой и временем компьютера
TIMERСекунды с начала записи или с команды RESETTIMER
RESETTIMERОбнуляет счётчик TIMER
ROW,SET,2Задаёт строку, в которую будут записаны следующие данные
CELL,SET,G2,25 / CELL,GET,G2Записывает значение в ячейку или отправляет значение ячейки обратно в Arduino
SAVEWORKBOOKСохраняет файл Excel
  1. Скачай файл PLX-DAQ v2 и распакуй его из zip-архива. Щёлкни правой кнопкой по файлу .xlsm и в «Свойствах» (Properties) отметь «Разблокировать» (Unblock): по умолчанию Office блокирует макросы в файлах из интернета.
  2. Открой файл и нажми «Включить содержимое» (Enable Content) на жёлтой панели вверху.
  3. Закрой монитор порта в Arduino IDE и нажми на листе кнопку Open PLX DAQ UI.
  4. В открывшемся окне введи в поле Port только номер COM-порта (5 для COM5), выбери скорость Baud 9600 и нажми Connect («Подключить»).
  5. Если заголовки не появились, нажми кнопку сброса на Arduino: setup() выполнится заново, команды CLEARDATA и LABEL дойдут до Excel, и строки начнут поступать.
  6. По окончании записи нажми Disconnect («Отключить») и при желании сохрани данные в отдельный файл .xlsx.

Способ 4: автоматические файлы CSV и Excel с помощью Python

Если работа идёт на Mac или Linux, запись планируется на несколько часов или надоело каждый раз собирать отчёт вручную, Python — самый гибкий вариант. Сначала установи два пакета в терминале командой python -m pip install pyserial openpyxl. Первый скрипт ниже слушает Arduino и записывает каждое измерение вместе со временем компьютера в файл deney_olcumleri.csv. Такие темы, как поиск порта, автосброс и график в реальном времени, подробно разобраны в руководстве «Последовательная связь Arduino и Python».

Python
1import csv
2import time
3from datetime import datetime
4
5import serial
6
7PORT = "COM3"               # macOS: /dev/cu.usbmodem…, Linux: /dev/ttyACM0
8BAUD = 9600                 # Arduino'daki Serial.begin ile aynı / same as Serial.begin on the Arduino
9DOSYA = "deney_olcumleri.csv"
10AYIRICI = ";"               # Türkçe Excel ; bekler, İngilizce Excel , / Turkish Excel expects ;, English Excel ,
11ONDALIK = ","               # Türkçe Excel ondalık virgül, İngilizce nokta / decimal comma in Turkish Excel, dot in English
12
13
14def sayi(x):
15    return f"{x:.1f}".replace(".", ONDALIK)   # 23.5 -> "23,5"
16
17
18with serial.Serial(PORT, BAUD, timeout=3) as ser, \
19        open(DOSYA, "w", newline="", encoding="utf-8-sig") as f:   # BOM: Excel Türkçe harfleri doğru gösterir / BOM keeps accents readable
20    time.sleep(2)                       # Uno port açılınca resetlenir / the Uno resets when the port opens
21    ser.reset_input_buffer()            # yarım kalmış satırları at / drop partial lines
22    yazici = csv.writer(f, delimiter=AYIRICI)
23    yazici.writerow(["Zaman", "Süre (s)", "Sıcaklık (°C)", "Nem (%)", "Işık (%)"])
24    print("Kayıt başladı, durdurmak için Ctrl+C / logging, press Ctrl+C to stop")
25    try:
26        while True:
27            satir = ser.readline().decode("utf-8", errors="ignore").strip()
28            parca = satir.split(",")
29            if len(parca) != 4:
30                continue                # boş, hata ya da başlık satırı / empty, error or header line
31            try:
32                sure, sicaklik, nem, isik = (float(p) for p in parca)
33            except ValueError:
34                continue                # sayı olmayan satır / non-numeric line
35            simdi = datetime.now()
36            yazici.writerow([simdi.strftime("%Y-%m-%d %H:%M:%S"),   # bilgisayar saati / PC clock
37                             sayi(sure), sayi(sicaklik), sayi(nem), sayi(isik)])   # süre Arduino'dan gelir / elapsed time comes from the Arduino
38            f.flush()                   # satırı hemen diske yaz / write the row to disk now
39            print(simdi.strftime("%H:%M:%S"), sicaklik, nem, isik)
40    except KeyboardInterrupt:
41        print("Kayıt bitti / logging stopped:", DOSYA)

Три детали в скрипте обеспечивают совместимость с Excel. Кодировка utf-8-sig добавляет в начало файла невидимую метку BOM; без неё Excel показывает символы вроде «°C» или кириллицу кракозябрами. Константы AYIRICI (разделитель) и ONDALIK (десятичный знак) заданы как точка с запятой и десятичная запятая — этого формата Excel ждёт при русских и большинстве европейских региональных настроек; при американских или британских настройках просто поменяй их на запятую и точку. f.flush() сразу записывает каждую строку на диск, так что если компьютер выключится или отойдёт кабель, потеряется максимум последнее измерение. После остановки скрипта сочетанием Ctrl+C достаточно дважды щёлкнуть по файлу — столбцы откроются правильно разделёнными. Если нужно посмотреть файл, пока запись ещё идёт, открывай копию: Excel может блокировать открытые им файлы.

Python
1import csv
2from datetime import datetime
3
4from openpyxl import Workbook
5from openpyxl.chart import Reference, ScatterChart, Series
6
7GIRIS = "deney_olcumleri.csv"
8CIKIS = "deney_raporu.xlsx"
9
10wb = Workbook()
11ws = wb.active
12ws.title = "Olcumler"
13
14with open(GIRIS, encoding="utf-8-sig", newline="") as f:
15    okuyucu = csv.reader(f, delimiter=";")
16    ws.append(next(okuyucu))                               # başlık satırı / header row
17    for satir in okuyucu:
18        zaman = datetime.strptime(satir[0], "%Y-%m-%d %H:%M:%S")
19        degerler = [float(x.replace(",", ".")) for x in satir[1:]]   # "23,5" -> 23.5
20        ws.append([zaman] + degerler)                      # .xlsx sayıyı sayı olarak saklar / .xlsx stores real numbers
21
22son = ws.max_row
23for hucre in ws["A"][1:]:
24    hucre.number_format = "hh:mm:ss"                       # zaman sütunu biçimi / time column format
25ws.column_dimensions["A"].width = 12
26
27# Özet tablo: formüller İngilizce yazılır, Excel kendi diline çevirir
28# Summary: formulas are written in English, Excel shows them in its own language
29ws["G1"], ws["H1"], ws["I1"], ws["J1"] = "Özet", "Sıcaklık (°C)", "Nem (%)", "Işık (%)"
30for i, (ad, fonk) in enumerate([("Ortalama", "AVERAGE"), ("En düşük", "MIN"),
31                                ("En yüksek", "MAX"), ("Std. sapma", "STDEV")], start=2):
32    ws.cell(row=i, column=7, value=ad)
33    for sutun, harf in ((8, "C"), (9, "D"), (10, "E")):
34        ws.cell(row=i, column=sutun, value=f"={fonk}({harf}2:{harf}{son})")
35
36# Her ölçüm için süre-değer (XY dağılım) grafiği / one time-value (XY scatter) chart per reading
37x = Reference(ws, min_col=2, min_row=2, max_row=son)       # Süre (s) sütunu / elapsed time column
38for sutun, baslik, konum in ((3, "Sıcaklık (°C)", "G8"), (5, "Işık (%)", "G24")):
39    grafik = ScatterChart()
40    grafik.title = baslik + " - süre"
41    grafik.x_axis.title = "Süre (s)"
42    grafik.y_axis.title = baslik
43    grafik.x_axis.delete = False                           # yeni Excel'de eksenler görünsün / keep axes visible
44    grafik.y_axis.delete = False
45    y = Reference(ws, min_col=sutun, min_row=1, max_row=son)
46    grafik.series.append(Series(y, x, title_from_data=True))
47    grafik.width, grafik.height = 18, 8                    # cm
48    ws.add_chart(grafik, konum)
49
50wb.save(CIKIS)
51print(son - 1, "ölçüm yazıldı / readings written:", CIKIS)

Второй скрипт превращает CSV в настоящий файл .xlsx. Внутри .xlsx числа хранятся как числа, а не как текст, поэтому проблема разделителей и десятичного знака полностью исчезает: файл одинаково открывается в русском, английском или немецком Excel. Скрипт также добавляет сводную таблицу со средним, минимумом, максимумом и стандартным отклонением, а ещё две точечные диаграммы для температуры и освещённости. Формулы записываются в файл с английскими названиями (AVERAGE, MIN, MAX, STDEV), а Excel при открытии переводит их на свой язык: в русском Excel это СРЗНАЧ, МИН, МАКС и СТАНДОТКЛОН. Строки delete = False устраняют проблему, из-за которой в диаграммах, созданных новыми версиями openpyxl, не видны подписи осей.

Добавляем метки времени: millis(), часы компьютера или RTC

ИсточникКак получитьПлюсыМинусы
millis()millis() / 1000.0 в скетче ArduinoНе нужно дополнительное железо, точность до миллисекундыОбнуляется при каждом сбросе, это не реальная дата, переполняется через 49,7 дня
Часы компьютераdatetime в Python, DATE и TIME в PLX-DAQ, метки времени в мониторе портаРеальные дата и время, настройка не нужнаКомпьютер должен оставаться подключённым
Модуль RTC (DS3231, DS1307)rtc.now() с библиотекой RTClibРаботает без компьютера, батарейка поддерживает ход часовНужен дополнительный модуль; DS1307 может уходить на несколько секунд в день
Время из интернета (NTP)configTime() на ESP32Точное до секунды время без настройкиНужно подключение к Wi-Fi

Для экспериментов с подключённым компьютером проще всего брать часы компьютера, и наш скрипт на Python записывает их в каждую строку. Хорошая привычка — сохранять и время, которое отправляет Arduino: оно показывает реальный интервал между измерениями, и пропавшая строка сразу заметна. Если Arduino отправляет «сырое» значение millis(), в Excel его можно перевести в секунды формулой =B2/1000, а в минуты — формулой =B2/60000. Если Arduino будет работать без компьютера, например записывать данные на SD-карту, дату и время стоит брать с модуля часов реального времени (RTC); подробности записи CSV на SD-карту — в руководстве о модуле SD-карты. На ESP32 время можно получить и из интернета: время по NTP на ESP32.

Строим диаграмму в Excel

  1. Выдели столбцы времени и температуры вместе с заголовками; если столбцы не стоят рядом, второй выделяй с зажатой клавишей Ctrl.
  2. Выбери точечную диаграмму с линиями в меню «Вставка › Диаграммы › Точечная» (Insert › Charts › Scatter (X, Y)).
  3. Кнопкой + рядом с диаграммой включи «Названия осей» (Axis Titles) и подпиши оси с единицами: «Время (с)» и «Температура (°C)».
  4. Чтобы добавить ряд освещённости, щёлкни по диаграмме правой кнопкой и добавь столбец освещённости через «Выбрать данные › Добавить» (Select Data › Add); масштабы сильно отличаются, поэтому щёлкни по ряду правой кнопкой и выбери «Формат ряда данных › По вспомогательной оси» (Format Data Series › Secondary Axis).
  5. Щёлкни правой кнопкой по вертикальной оси и в «Формате оси» (Format Axis) зафиксируй минимум и максимум, чтобы изменение на 1 °C не выглядело огромным скачком.

Почему точечная диаграмма, а не график? Диаграмма Excel «График» (Line) воспринимает значения по горизонтальной оси как равномерно расставленные подписи; если одно измерение пропало или интервал изменился, ось времени незаметно искажается. Точечная (X, Y) диаграмма ставит каждую точку в её реальный момент времени, а именно этого и ждут от научного графика. Если сравниваются лишь несколько фиксированных значений, например средняя температура в трёх разных комнатах, гистограмма читается легче. Если датчик шумит, щёлкни по ряду правой кнопкой и сгладь кривую через «Добавить линию тренда › Линейная фильтрация» (Add Trendline › Moving Average).

Пример для отчёта об эксперименте: таблица измерений

Допустим, вопрос эксперимента звучит так: «Как меняются температура, влажность и освещённость воздуха рядом с настольной лампой, когда её включают?» Мы поставили датчики примерно в 15 см от лампы и задали в скетче ARALIK равным 60000, то есть одно измерение в минуту. На 1-й минуте лампу включили, на 6-й выключили. Значения ниже — типичные примеры того, что можно получить на такой установке; две последние строки — итоги, посчитанные формулами Excel:

Время (мин)Температура (°C)Влажность (%)Освещённость (%)Состояние
0234614Лампа выключена
1234681Лампу включили
2244582Лампа включена
3254482Лампа включена
4264383Лампа включена
5264283Лампа включена
6264215Лампу выключили
7254314Лампа выключена
8244514Лампа выключена
Среднее24,744,052,0-
Минимум / максимум23 / 2642 / 4614 / 83-

Итоговые строки считаются в Excel формулами =СРЗНАЧ(B2:B10), =МИН(B2:B10) и =МАКС(B2:B10) (в английском Excel — AVERAGE, MIN, MAX); чтобы показать разброс измерений, можно добавить и =СТАНДОТКЛОН(B2:B10) (STDEV). При разборе результатов опиши закономерность в таблице: освещённость подскочила с 14% до 81% в тот же момент, как включилась лампа, а температура медленно выросла на 3 °C примерно за 3 минуты — это называется тепловой инерцией. Когда лампа погасла, освещённость сразу упала, но температура ещё несколько минут оставалась высокой. Относительная влажность снижалась по мере роста температуры, потому что тёплый воздух может удерживать больше влаги, даже если количество воды в нём не меняется. Лампа накаливания или галогенная лампа хорошо показывает этот эффект; у светодиодной лампы рост температуры гораздо меньше.

  • Цель: исследовательский вопрос и гипотеза в одном предложении.
  • Материалы: модель платы, датчики, резисторы и использованные программы (Arduino IDE, Excel).
  • Методика: где стояли датчики, интервал измерений (например, 60 с), сколько длился эксперимент и каким способом данные попали в Excel.
  • Таблица измерений: в заголовке каждого столбца должна быть единица измерения; в тексте используй сводную таблицу, а все сырые данные приложи отдельным приложением.
  • График: точечная диаграмма с названиями осей, единицами и отмеченными событиями (лампу включили, выключили).
  • Вывод и источники погрешностей: сравнение результатов с гипотезой и ограничения, например точность DHT11 ±2 °C, неоткалиброванный фоторезистор и расстояние от датчика до лампы.

Передача данных ESP32 в Excel

На ESP32 все способы работают точно так же; для Data Streamer и PLX-DAQ ESP32 — просто ещё один последовательный порт. Меняются три вещи: аналоговые измерения 12-битные (0–4095), делитель с фоторезистором питается от 3,3 V, а в качестве аналогового входа стоит выбрать один из пинов ADC1 (GPIO 32–39), потому что они продолжают работать при включённом Wi-Fi. С платами ESP32 обычно работают на 115200 бод, поэтому поменяй скорость в скрипте на Python, в Data Streamer и в PLX-DAQ. Сообщения загрузчика, которые появляются в последовательном порту при старте, не являются числами, так что скрипт на Python их и так пропускает. Если хочется отправлять измерения в облако вообще без компьютера, загляни в руководство «Запись данных ESP32 в Google Таблицы».

C++ (Arduino IDE)
1// ESP32: aynı CSV çıktısı, 12 bit ADC ve 3,3 V / ESP32: same CSV output, 12-bit ADC and 3.3 V
2#include <DHT.h>
3
4const int DHT_PIN = 4;                 // güvenli bir GPIO / a safe GPIO
5const int LDR_PIN = 34;                // ADC1 pini, Wi-Fi açıkken de okur / ADC1 pin, still reads with Wi-Fi on
6DHT dht(DHT_PIN, DHT11);
7
8void setup() {
9  Serial.begin(115200);                // Python'da ve Data Streamer'da da 115200 / 115200 in Python and Data Streamer too
10  dht.begin();
11  analogReadResolution(12);            // 0-4095
12}
13
14void loop() {
15  float sicaklik = dht.readTemperature();
16  float nem = dht.readHumidity();
17  int isik = map(analogRead(LDR_PIN), 0, 4095, 0, 100);   // göreli ışık, % / relative light, %
18
19  if (!isnan(sicaklik) && !isnan(nem)) {
20    // zaman_s,sicaklik,nem,isik biçimi, Uno koduyla aynı / same zaman_s,temp,hum,light format as the Uno sketch
21    Serial.printf("%.1f,%.1f,%.0f,%d\n", millis() / 1000.0, sicaklik, nem, isik);
22  }
23  delay(2000);
24}

Запись CSV на Raspberry Pi Pico (MicroPython)

Если на Raspberry Pi Pico используется MicroPython, измерения можно не отправлять на компьютер, а записывать в CSV-файл во флеш-памяти самой платы; тогда компьютер вообще не нужен, и Pico с питанием от пауэрбанка можно оставить там, где нужно измерять. Код ниже использует встроенный датчик температуры (ADC4), которому не нужно дополнительное железо, и фоторезистор на GP26, а файл пишет с точкой с запятой и десятичной запятой, чтобы он подходил для Excel с русскими или европейскими региональными настройками. Встроенный датчик измеряет температуру чипа, поэтому может показывать на несколько градусов больше, чем в комнате; для точных измерений используй внешний датчик. Если MicroPython в новинку, начни с руководства «Что такое Raspberry Pi Pico».

Плата микроконтроллера Raspberry Pi Pico
Raspberry Pi Pico: с MicroPython записывает измерения в CSV-файл в собственной флеш-памяти; файл скачивается на компьютер через Thonny.
MicroPython
1import os
2import time
3
4import machine
5
6ldr = machine.ADC(26)                 # GP26 = ADC0, LDR + 10k bölücü / LDR + 10k divider
7ic_sensor = machine.ADC(4)            # yongadaki sıcaklık sensörü / on-chip temperature sensor
8DOSYA = "olcum.csv"
9ARALIK_S = 10                         # ölçüm aralığı, saniye / interval in seconds
10
11
12def tr(x):
13    return "{:.1f}".format(x).replace(".", ",")   # Türkçe Excel için ondalık virgül / decimal comma for Turkish Excel
14
15
16try:
17    os.stat(DOSYA)                    # dosya varsa silme, sonuna ekle / keep an existing file, append to it
18except OSError:
19    with open(DOSYA, "w") as f:
20        f.write("Sure (s);Sicaklik (C);Isik (%)\n")   # ASCII başlık / ASCII header
21
22baslangic = time.ticks_ms()
23while True:
24    volt = ic_sensor.read_u16() * 3.3 / 65535
25    sicaklik = 27 - (volt - 0.706) / 0.001721       # RP2040 veri sayfası formülü / RP2040 datasheet formula
26    isik = ldr.read_u16() * 100 / 65535             # göreli ışık, % / relative light, %
27    sure = time.ticks_diff(time.ticks_ms(), baslangic) / 1000
28    satir = "{};{};{}".format(tr(sure), tr(sicaklik), tr(isik))
29    print(satir)                                    # Thonny kabuğunda da görünür / also shown in the Thonny shell
30    with open(DOSYA, "a") as f:                     # her satırda aç-kapat / open and close for every line
31        f.write(satir + "\n")                       # elektrik kesilse de veri kalır / data survives a power cut
32    time.sleep(ARALIK_S)

Если сохранить код на Pico в Thonny под именем main.py, плата будет сама начинать запись при каждом включении; если файл уже есть, он не удаляется, а новые строки дописываются в конец. Когда измерения закончатся, подключи Pico к компьютеру, нажми «Стоп» (Stop) в Thonny, в панели «Вид › Файлы» (View › Files) щёлкни правой кнопкой по olcum.csv, скачай файл на компьютер и открой в Excel. Одна строка примерно по 20 байт каждые 10 секунд даёт около 170 КБ в день; в файловой системе Pico этого с запасом хватает на несколько дней записи. Если в твоём Excel десятичный разделитель — точка, просто убери вызов replace() в функции tr().

Частые ошибки и как их исправить

СимптомПричинаРешение
Порт не открывается: «Access is denied» (отказано в доступе)Порт занят монитором порта, плоттером или другой программойЗакрой все окна, которые используют порт: его может одновременно открыть только одна программа
Все значения оказались в одном столбцеРазделитель в CSV не совпадает с региональными настройками ExcelРазбей данные по запятым через «Данные › Текст по столбцам» или поставь в Python разделитель ;
23.5 превратилось в дату (23 мая) или осталось текстомExcel с русским или европейским региональным форматом ждёт десятичную запятуюПоставь десятичный разделитель «точка» в «Текст по столбцам › Подробнее...» или сними флажок «Использовать системные разделители» в «Файл › Параметры › Дополнительно»
Кириллица и знак ° отображаются кракозябрамиCSV сохранён в UTF-8 без BOMИспользуй в Python encoding="utf-8-sig" или не используй кириллицу и спецсимволы в заголовках
Таблица заполняется мусорными символамиНе совпадает скорость в бодахСделай скорость в Serial.begin() такой же, как в Data Streamer, PLX-DAQ или Python
Нет вкладки Data StreamerНадстройка не включена, или версия Excel её не поддерживаетВключи её в «Надстройках COM»; в Excel для macOS и в веб-версии этой надстройки нет
Кнопки PLX-DAQ не работаютМакросы заблокированыОтметь «Разблокировать» в свойствах файла, затем нажми «Включить содержимое»
PLX-DAQ не может подключиться к портуНеверный или слишком большой номер COM-портаВ «Диспетчере устройств» в свойствах порта («Параметры порта › Дополнительно») смени номер COM на небольшой (например, COM4)
HATA или nan вместо температуры и влажностиПодключение DHT11, нет подтягивающего резистора или слишком частое чтениеПроверь провода и жди не меньше 1 секунды между двумя измерениями
Выбирай интервал измерений по задаче: для медленно меняющихся величин, например температуры в комнате, одного измерения в минуту более чем достаточно, и запись за целые сутки уложится в 1440 строк. На листе Excel помещается не больше 1 048 576 строк; при 10 измерениях в секунду этот предел наступит примерно через 29 часов. С шумными датчиками стоит усреднять несколько измерений прямо на Arduino и отправлять одну строку: так и файл меньше, и график глаже.

Идеи проектов с записью данных в Excel

  • Кривая остывания: измерь, как остывает стакан горячей воды, с помощью водонепроницаемого DS18B20, добавь в Excel экспоненциальную линию тренда и изучи закон охлаждения Ньютона.
  • Мини-метеостанция: записывай температуру, влажность и давление с BME280 в течение недели и покажи на графике разницу между днём и ночью.
  • Дневник полива растений: записывай показания датчика влажности почвы до и после полива и выясни, за сколько времени почва высыхает.
  • Анализ движения: составь таблицу «расстояние — время» с HC-SR04 и посчитай в Excel скорость и ускорение по разности соседних строк.
  • Кривая разряда батарейки: измеряй напряжение батарейки через делитель напряжения, записывай его часами и изучи, как напряжение падает со временем.
  • Проект для научной выставки: сравни, насколько нагреваются на солнце коробки разных цветов; больше идей — в руководстве «Идеи проектов на Arduino для научной выставки».

Какой бы способ ни выбрать, основа одна: на Arduino формировать чистые и единообразные строки CSV, а на компьютере переносить их в Excel с правильным разделителем. Для быстрой проверки лучше всего подходит монитор порта, для живой демонстрации на уроке — Data Streamer, для управления Excel со стороны Arduino — PLX-DAQ, а для долгой автоматической записи — Python. В приложении BlueGrays есть пошаговые проекты со схемами и кодом, например «Температура и влажность с DHT11», «Измерение освещённости с LDR» и «Регистратор температуры на ESP32», а измеренные данные можно перенести в Excel описанными способами.

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

Как перенести данные Arduino в Excel?

Проще всего отправлять измерения с Arduino строками через запятую с помощью Serial.println() и переносить эти строки в Excel. В Windows с Microsoft 365 надстройка Data Streamer передаёт данные в реальном времени, а похожую работу делает макрос PLX-DAQ. На Mac или Linux удобнее всего записывать CSV-файл с помощью Python и pyserial.

Работает ли Excel Data Streamer на Mac?

Нет. Data Streamer — надстройка COM, и она есть только в настольном Excel из Microsoft 365 для Windows; в Excel для macOS и в веб-версии её нет. На Mac можно создать файл CSV или .xlsx с помощью Python или сохранить последовательный вывод в файл через терминальную программу вроде CoolTerm.

Работает ли PLX-DAQ в 64-битном Excel?

Оригинальный PLX-DAQ от Parallax работает только в 32-битном Excel. PLX-DAQ v2, которую разработало сообщество Arduino, поддерживает также 64-битный Excel и использует те же команды CLEARDATA, LABEL и DATA. Обе версии — макросы VBA, поэтому работают только в Windows и требуют включённых макросов.

Как сохранить данные из монитора порта Arduino?

Кнопки сохранения в мониторе порта нет: строки выделяются мышью, копируются сочетанием Ctrl+C и вставляются в текстовый файл или сразу в Excel. Если включить опцию меток времени, к каждой строке добавится время компьютера. Для долгих записей надёжнее функция записи в файл в PuTTY или CoolTerm либо скрипт на Python.

Почему CSV-файл открывается в Excel одним столбцом?

При русских и многих европейских региональных настройках Excel ждёт точку с запятой в качестве разделителя столбцов, поэтому при двойном щелчке по файлу с запятыми все значения остаются в столбце A. Данные можно разбить по запятым через «Данные › Текст по столбцам» или импортировать файл через «Данные › Из текстового/CSV-файла» и выбрать разделитель вручную. Если файл создаётся скриптом на Python, самое надёжное решение — сразу использовать тот разделитель, которого ждёт твой Excel.

Как записывать данные Arduino без компьютера?

Без компьютера измерения можно записывать в CSV-файл на модуль SD-карты, а дату и время брать с модуля RTC; потом карта вставляется в компьютер, и файл открывается в Excel. С ESP32, у которой есть Wi-Fi, данные можно отправлять прямо в Google Таблицы. А Raspberry Pi Pico с MicroPython может записывать CSV-файл в собственную флеш-память.

Все проекты
Температура и влажность с DHT11
#55Средний

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

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

4.7(47)
73
Измерение освещённости с LDR
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
139
Измерение расстояния HC-SR04 (вывод в порт)
#27Новичок

Измерение расстояния HC-SR04 (вывод в порт)

Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

4.6(46)
71
Измерение освещённости модулем LDR на ESP32
#113Новичок

Измерение освещённости модулем LDR на ESP32

Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

4.6(36)
55
Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Продвинутый
Premium

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Собери на ESP32 регистратор температуры с отметками времени! Каждую минуту читай температуру и влажность с DHT22, бери реальное время из DS1307 RTC и записывай всё на карту microSD в формате CSV. OLED показывает текущую температуру (крупным шрифтом), влажность в процентах, время и счётчик записей. Файл /temp_log.csv на SD-карте открывается в Excel, Google Sheets или Python pandas — идеально для теплиц, комнат, лабораторий и хранения продуктов.

4.7(7)
12
Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
#117Средний

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)

Этот проект измеряет температуру и влажность воздуха датчиком DHT22 и в реальном времени показывает данные на I2C LCD 16x2. Данные читаются с датчика по однопроводному протоколу через библиотеку Adafruit DHT. Проект служит основой для IoT-метеостанций, умного дома или систем мониторинга среды в теплицах. Связь с DHT22 идёт через пин GPIO 4 у ESP32.

4.8(38)
56
Измерение температуры с NTC и LCD-дисплеем 2x16
#44Новичок
Premium

Измерение температуры с NTC и LCD-дисплеем 2x16

Измерь температуру вокруг с помощью датчика, похожего на крошечную бусинку. Эта деталь, NTC, при нагреве легче пропускает электричество; Arduino читает это изменение, по формуле переводит его в градус

4.5(33)
44
Цифровые часы на ESP32 и DS1307 RTC (I2C + LCD)
#120Средний
Premium

Цифровые часы на ESP32 и DS1307 RTC (I2C + LCD)

В этом проекте время и дата из модуля часов реального времени (RTC) DS1307 выводятся на I2C LCD-экран 16x2. DS1307 — RTC с резервной батарейкой, который хранит время даже при выключенной ESP32. Оба модуля делят одну шину I2C (SDA/SCL), и ты узнаёшь, как управлять несколькими устройствами всего по двум сигнальным проводам. Проект даёт практические знания о протоколе I2C, работе модуля RTC и динамическом выводе данных на LCD-экран.

4.6(26)
40