Данные 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 в 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».
| Способ | Платформа | Передача в реальном времени | Время измерения | Лучше всего подходит |
|---|---|---|---|---|
| Монитор порта + CSV | Windows, macOS, Linux | Нет, данные копируются после измерений | Опция меток времени в IDE | Короткие эксперименты, быстрая проверка |
| Excel Data Streamer | Windows, настольный Excel из Microsoft 365 | Да | millis(), которое отправляет Arduino | Графики в реальном времени на уроке |
| PLX-DAQ v2 | Windows, настольный 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 Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| DHT11 VCC (+) | 5V | 3V3 | Используется встроенный датчик |
| DHT11 DATA (OUT) | D2 | GPIO 4 | Встроенный датчик (ADC4) |
| DHT11 GND (-) | GND | GND | - |
| Ножка 1 фоторезистора | 5V | 3V3 | 3V3(OUT), пин 36 |
| Ножка 2 фоторезистора + 10 kΩ | A0 | GPIO 34 | GP26 (ADC0), пин 31 |
| Другой конец резистора 10 kΩ | GND | GND | AGND, пин 33 |

Код для Arduino: отправляем измерения строками CSV
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
- Загрузи скетч, открой «Инструменты › Монитор порта» (Tools › Serial Monitor) и выбери в меню скорости 9600 бод.
- При желании включи метки времени: в Arduino IDE 2 нажми значок часов в правом верхнем углу окна, в IDE 1.8 — флажок отметок времени внизу. В начало каждой строки добавится время компьютера в виде 14:03:21.512 ->.
- Когда эксперимент закончится, выдели строки мышью и скопируй их сочетанием Ctrl+C (Cmd+C в macOS). Если хочется сохранить сырые данные, вставь их в «Блокнот» и сохрани как olcum.csv, выбрав тип файла «Все файлы».
- В Excel щёлкни по ячейке A1 пустого листа и вставь данные сочетанием Ctrl+V; все строки окажутся в столбце A.
- Выдели столбец A, открой «Данные › Текст по столбцам» (Data › Text to Columns), выбери формат «с разделителями» (Delimited) и отметь разделитель «запятая» (Comma). Если включены метки времени, отметь ещё и «пробел» (Space): время попадёт в первый столбец, а знаки «->» — во второй, который потом удаляется.
- На последнем шаге нажми «Подробнее...» (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 не могут к нему подключиться.
Способ 2: данные в реальном времени через Excel Data Streamer
Data Streamer — бесплатная надстройка, которую Microsoft сделала для образования; она передаёт строки CSV из последовательного порта прямо на рабочий лист. Надстройка входит в настольный Excel из Microsoft 365 (версия 1902 и новее), так что её нужно только включить. Поскольку это надстройка COM, она работает только в Windows; в Excel для macOS и в веб-версии Excel её нет. На стороне Arduino ничего менять не нужно: скетч выше работает как есть на 9600 бод — это скорость надстройки по умолчанию.
- В Excel открой «Файл › Параметры › Надстройки» (File › Options › Add-ins), в списке «Управление» (Manage) внизу выбери «Надстройки COM» (COM Add-ins) и нажми «Перейти» (Go).
- Отметь Microsoft Data Streamer for Excel и нажми «ОК»; на ленте появится вкладка Data Streamer.
- Закрой монитор порта в Arduino IDE: последовательный порт может одновременно открыть только одна программа.
- Кнопкой Connect a Device («Подключить устройство») выбери COM-порт Arduino, затем нажми Start Data («Начать передачу данных»). В зависимости от языка Excel названия кнопок могут быть переведены.
- Excel создаст три листа: Data In (входящие данные), Data Out (данные для отправки в Arduino) и Settings (настройки). На листе Settings поставь Data Channels равным 4 и увеличь Data Rows, чтобы видеть в таблице больше истории.
- Чтобы сохранить постоянную запись, начни её кнопкой 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 порог срабатывания сигнализации.
Способ 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 добавить дату и время.
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 |
- Скачай файл PLX-DAQ v2 и распакуй его из zip-архива. Щёлкни правой кнопкой по файлу .xlsm и в «Свойствах» (Properties) отметь «Разблокировать» (Unblock): по умолчанию Office блокирует макросы в файлах из интернета.
- Открой файл и нажми «Включить содержимое» (Enable Content) на жёлтой панели вверху.
- Закрой монитор порта в Arduino IDE и нажми на листе кнопку Open PLX DAQ UI.
- В открывшемся окне введи в поле Port только номер COM-порта (5 для COM5), выбери скорость Baud 9600 и нажми Connect («Подключить»).
- Если заголовки не появились, нажми кнопку сброса на Arduino: setup() выполнится заново, команды CLEARDATA и LABEL дойдут до Excel, и строки начнут поступать.
- По окончании записи нажми Disconnect («Отключить») и при желании сохрани данные в отдельный файл .xlsx.
Способ 4: автоматические файлы CSV и Excel с помощью Python
Если работа идёт на Mac или Linux, запись планируется на несколько часов или надоело каждый раз собирать отчёт вручную, Python — самый гибкий вариант. Сначала установи два пакета в терминале командой python -m pip install pyserial openpyxl. Первый скрипт ниже слушает Arduino и записывает каждое измерение вместе со временем компьютера в файл deney_olcumleri.csv. Такие темы, как поиск порта, автосброс и график в реальном времени, подробно разобраны в руководстве «Последовательная связь Arduino и 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 может блокировать открытые им файлы.
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
- Выдели столбцы времени и температуры вместе с заголовками; если столбцы не стоят рядом, второй выделяй с зажатой клавишей Ctrl.
- Выбери точечную диаграмму с линиями в меню «Вставка › Диаграммы › Точечная» (Insert › Charts › Scatter (X, Y)).
- Кнопкой + рядом с диаграммой включи «Названия осей» (Axis Titles) и подпиши оси с единицами: «Время (с)» и «Температура (°C)».
- Чтобы добавить ряд освещённости, щёлкни по диаграмме правой кнопкой и добавь столбец освещённости через «Выбрать данные › Добавить» (Select Data › Add); масштабы сильно отличаются, поэтому щёлкни по ряду правой кнопкой и выбери «Формат ряда данных › По вспомогательной оси» (Format Data Series › Secondary Axis).
- Щёлкни правой кнопкой по вертикальной оси и в «Формате оси» (Format Axis) зафиксируй минимум и максимум, чтобы изменение на 1 °C не выглядело огромным скачком.
Почему точечная диаграмма, а не график? Диаграмма Excel «График» (Line) воспринимает значения по горизонтальной оси как равномерно расставленные подписи; если одно измерение пропало или интервал изменился, ось времени незаметно искажается. Точечная (X, Y) диаграмма ставит каждую точку в её реальный момент времени, а именно этого и ждут от научного графика. Если сравниваются лишь несколько фиксированных значений, например средняя температура в трёх разных комнатах, гистограмма читается легче. Если датчик шумит, щёлкни по ряду правой кнопкой и сгладь кривую через «Добавить линию тренда › Линейная фильтрация» (Add Trendline › Moving Average).
Пример для отчёта об эксперименте: таблица измерений
Допустим, вопрос эксперимента звучит так: «Как меняются температура, влажность и освещённость воздуха рядом с настольной лампой, когда её включают?» Мы поставили датчики примерно в 15 см от лампы и задали в скетче ARALIK равным 60000, то есть одно измерение в минуту. На 1-й минуте лампу включили, на 6-й выключили. Значения ниже — типичные примеры того, что можно получить на такой установке; две последние строки — итоги, посчитанные формулами Excel:
| Время (мин) | Температура (°C) | Влажность (%) | Освещённость (%) | Состояние |
|---|---|---|---|---|
| 0 | 23 | 46 | 14 | Лампа выключена |
| 1 | 23 | 46 | 81 | Лампу включили |
| 2 | 24 | 45 | 82 | Лампа включена |
| 3 | 25 | 44 | 82 | Лампа включена |
| 4 | 26 | 43 | 83 | Лампа включена |
| 5 | 26 | 42 | 83 | Лампа включена |
| 6 | 26 | 42 | 15 | Лампу выключили |
| 7 | 25 | 43 | 14 | Лампа выключена |
| 8 | 24 | 45 | 14 | Лампа выключена |
| Среднее | 24,7 | 44,0 | 52,0 | - |
| Минимум / максимум | 23 / 26 | 42 / 46 | 14 / 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 Таблицы».
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».

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 секунды между двумя измерениями |
Идеи проектов с записью данных в 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
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

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

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

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

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

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

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

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

