0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15

Делаю дистанционное управление кондиционером на wemos d1

01.07.2025, 20:42. Показов 934. Ответов 19

Студворк — интернет-сервис помощи студентам
Я не программист, пытаюсь вайбкодить через ИИ простенький скетч который покажет температуру хотя бы в терменале ардуино. С ардуино знаком на уровне пользователя 3д принтера. Идея сделать локальный сервер который будет управлять кондеем по расписанию и/или в режиме если.. то, не потому что через интернет за мной следят шпионы/инопланетяне, я на данный момент юзаю датчик tuya, а потому что конкретно в этом приложении работы по таймеру нет, и если что-то случиться с интернетом то управление кондиционером будет нарушено, а локальный сервер это локальный сервер.

Плата клон с али esp8266 wemos d1, библиотеки установил и для платы и для датчика AM2320. Питание для датчика 3.3в(с 5в датчик не дружит), но на всякий случай плату подключил к бп 5в через круглый штекер.
Датчик подключил его к пинам SDA SCL и к верхним (D14 D15 и к нижнимD4/5).
Датчик в терминале обнаружен(по крайней мере нет сообщения что его нет как было в ранних скетчах) но температуру не передает.
Т.к. кодить я не умею то и проверить что накодил ИИ не могу. Возможно что ИИ выбрал не самый верный и легкий путь для решения задачи. Вся надежда на форумчан.
Благодарю заранее.

Код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include "Adafruit_AM2320.h"
 
Adafruit_AM2320 am2320 = Adafruit_AM2320();
 
void setup() {
  Serial.begin(115200);
  Wire.begin(D4, D5); // Инициализация I2C
  delay(2000);        // Подождать немного после старта
 
  Serial.println("Инициализация AM2320...");
  //am2320.setAddress(0x5C); // Установка адреса датчика
  if (!am2320.begin()) {
    Serial.println("Ошибка: AM2320 не найден. Проверь подключение.");
  } else {
    Serial.println("Датчик AM2320 успешно инициализирован.");
  }
}
 
void loop() {
  float temp = am2320.readTemperature();
  float hum = am2320.readHumidity();
 
  Serial.print("Температура: ");
  Serial.print(temp);
  Serial.println(" °C");
 
  Serial.print("Влажность: ");
  Serial.print(hum);
  Serial.println(" %");
 
  delay(2000);  // Пауза между измерениями
}
Результат
Температура: nan °C
Влажность: nan %
Температура: nan °C
Влажность: nan %
Миниатюры
Делаю дистанционное управление кондиционером на wemos d1  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.07.2025, 20:42
Ответы с готовыми решениями:

Дистанционное управление питанием роутера
Хочу себе на роутер присобачить ДУ. Пока {включение, выключение, рестарт} по питанию. Что лучше...

Дистанционное управление освещением
помогите найти причину поломки не включается не один канал на свет, в районе VD1, VD2 на плате есть...

ИК дистанционное управление
А можно выложить схему полностью: http://iosyitistromyss.ru/ik-distancion ... lenie.html Просто на...

19
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
01.07.2025, 21:04
А вот если так в 22 строке заменить?

C++
1
int temp = (int) am2320.readTemperature();
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
01.07.2025, 21:17  [ТС]
Такой результат
Инициализация AM2320...
Ошибка: AM2320 не найден. Проверь подключение.
Температура: 2147483647 °C
Влажность: nan %
Температура: 2147483647 °C
Влажность: nan %
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
01.07.2025, 21:21
Цитата Сообщение от Notcoder92 Посмотреть сообщение
по крайней мере нет сообщения
AM2320 не найден
?.....
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
01.07.2025, 21:23  [ТС]
я подключил датчик к D14 D15 и поправил строку
Wire.begin(D14, D15); // Инициализация I2C
и о чудо (не знаю насколько датчик врет по температуре может его еще надо как-то калибровать)
Температура: 29.80 °C
Влажность: nan %
Температура: 29.80 °C
Влажность: nan %
Температура: 29.80 °C
Влажность: nan %
правда не ясно почему нет влажности...
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
01.07.2025, 21:25
Цитата Сообщение от Notcoder92 Посмотреть сообщение
Температура: 29.80 °C
temp в коде float или int?
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
01.07.2025, 21:28  [ТС]
C++
1
2
3
void loop() {
  float temp = am2320.readTemperature();
  float hum = am2320.readHumidity();
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
01.07.2025, 21:32
А если чтение температуры убрать вообще, оставить только чтение влажности?

Добавлено через 1 минуту
А потом заменить на одновременное чтение
C++
1
2
float temp, hum;
am2320.readTemperatureAndHumidity(&temp, &hum);
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
01.07.2025, 21:34  [ТС]
тогда почему-то появится
Температура: °C
Влажность: 49.30 %
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
01.07.2025, 21:35
См. выше
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
01.07.2025, 21:51  [ТС]
если сделать так
C++
1
2
3
4
5
void loop() {
  //float temp = am2320.readTemperature();
  //float hum = am2320.readHumidity();
  float temp, hum;
   am2320.readTemperatureAndHumidity(&temp, &hum);
будет такая ошибка
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Arduino: 1.8.9 (Windows 10), Board: "LOLIN(WeMos) D1 R1, 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 115200"
 
WARNING: Category 'Communication,AsyncWebServer,Async,UDP' in library AsyncUdp_ESP32_ENC is not valid. Setting to 'Uncategorized'
J:\Documents\Arduino\sketch_jul01b\sketch_jul01b.ino: In function 'void loop()':
sketch_jul01b:25:11: error: 'class Adafruit_AM2320' has no member named 'readTemperatureAndHumidity'
   25 |    am2320.readTemperatureAndHumidity(&temp, &hum);
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~
exit status 1
'class Adafruit_AM2320' has no member named 'readTemperatureAndHumidity'
 
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
01.07.2025, 21:57
Тогда попробуйте изменить код так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
bool isReadTemp;
float temp;
float hum;
...
 
void setup() {
  ...
  isReadTemp = false;
  ...
}
 
void loop() {
  if (isReadTemp) {
    temp = am2320.readTemperature();
  } else {
    hum = am2320.readHumidity();
  }
  isReadTemp = !isReadTemp;
 
  ...
}
... писать не надо.
1
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
02.07.2025, 07:28
Цитата Сообщение от Notcoder92 Посмотреть сообщение
'class Adafruit_AM2320' has no member named 'readTemperatureAndHumidity'
В 2022 году стало известно о проблеме чтения nan, но в 2025 код библиотеки всё ещё старый...
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
02.07.2025, 09:06  [ТС]
теперь надо разобраться с ик приемником VS1838B на ноге D8

использовал 2 кода
один взял тут https://arduinointro.com/artic... step-guide

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <IRremote.h>
 
const int RECV_PIN = D8;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup(){
  Serial.begin(115200);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}
 
void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value);
        irrecv.resume();
  }
  delay(100);
}
другой предложил gemini

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <IRremote.h> // Подключаем библиотеку IRremote
 
// Определяем пин, к которому подключен выход (OUT) ИК-приемника
// На WeMos D1 R2 (форм-фактор UNO R3), D8 соответствует GPIO15.
// Это хороший выбор для ИК-приемника.
const int IR_RECEIVE_PIN = D8; // Используем D8 (GPIO15) для ИК-приемника
 
IRrecv irrecv(IR_RECEIVE_PIN); // Создаем объект IRrecv для приема сигналов
decode_results results;        // Структура для хранения результатов декодирования
 
void setup() {
  Serial.begin(115200);
  // Ждем подключения Serial порта
  while (!Serial) {
    delay(10); // Короткая задержка, чтобы дать время Serial порту инициализироваться
  }
 
  Serial.println("--- IR Приемник ---");
  Serial.println("Ожидание ИК-сигналов...");
 
  // Включаем прием ИК-сигналов
  irrecv.enableIRIn();
  // irrecv.blink13(true); // Закомментируем мигание светодиодом D13, если не нужен.
                         // На ESP8266 D13 может быть не тем, что вы ожидаете.
}
 
void loop() {
  // Проверяем, есть ли новый ИК-сигнал
  if (irrecv.decode(&results)) { // Если сигнал получен и декодирован
 
    Serial.print("Получен ИК-сигнал: ");
 
    // Выводим тип протокола
    String protocolName = "Неизвестный";
    switch (results.decode_type) {
      case NEC:           protocolName = "NEC"; break;
      case SONY:          protocolName = "SONY"; break;
      case RC5:           protocolName = "RC5"; break;
      case RC6:           protocolName = "RC6"; break;
      case PANASONIC:     protocolName = "PANASONIC"; break;
      case JVC:           protocolName = "JVC"; break;
      case SAMSUNG:       protocolName = "SAMSUNG"; break;
      case LG:            protocolName = "LG"; break;
      case WHYNTER:       protocolName = "WHYNTER"; break;
      case SHARP:         protocolName = "SHARP"; break;
      case DENON:         protocolName = "DENON"; break;
      case UNKNOWN:       protocolName = "НЕИЗВЕСТНЫЙ (RAW)"; break;
      default:            protocolName = "ПРОЧИЙ"; break;
    }
    Serial.print(protocolName);
    Serial.print(" - ");
 
    // Выводим полученное значение в HEX формате
    Serial.print("Value: 0x");
    Serial.print(results.value, HEX);
 
    // Дополнительная информация о сигнале
    if (results.value == 0xFFFFFFFF) {
      Serial.println(" (Повтор)");
    } else if (results.decode_type == UNKNOWN || results.bits > 32) {
      Serial.print(", Длина (биты): ");
      Serial.print(results.bits);
      Serial.println(" (Длинный или неизвестный протокол, см. RAW)");
 
      // Раскомментируйте, если нужны RAW-данные для сложного протокола кондиционера
      Serial.println("RAW данные (pulses):");
      // irrecv.dumpRaw(&results); // Это функция библиотеки для вывода RAW
                                // (заменит то, что было закомментировано ранее)
      // В новых версиях IRremote, dumpRaw() может быть убрана или работать иначе.
      // Если нужна, попробуйте:
       for (int i = 0; i < results.rawlen; i++) {
         Serial.print(results.rawbuf[i] * USECPERTICK, DEC); // USECPERTICK - константа из IRremote
         if (i % 2 == 0) Serial.print("m, "); else Serial.print("s, "); // Mark/Space
         if (i % 10 == 0 && i != 0) Serial.println(); // Для форматирования вывода
       }
       Serial.println();
 
    } else {
      Serial.print(", Длина (биты): ");
      Serial.println(results.bits);
    }
 
    irrecv.resume(); // Важно: Продолжаем прием следующего сигнала
  }
 
  // Очень важно для ESP8266:
  // yield() позволяет ESP8266 выполнять свои внутренние задачи (например, Wi-Fi стек, Watchdog).
  // Если у вас нет других блокирующих функций или активных циклов, это может быть не нужно,
  // но часто помогает предотвратить WDT reset.
  yield();
  // delay(10); // Короткая неблокирующая задержка, чтобы не опрашивать слишком часто,
             // но не блокирующая WDT. Можно даже убрать, если и так стабильно.
}
есть 3 рабочих пульта-мышки но ни один не подает сигнал на приемник.
Миниатюры
Делаю дистанционное управление кондиционером на wemos d1  
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
02.07.2025, 10:09
Цитата Сообщение от Notcoder92 Посмотреть сообщение
но ни один не подает сигнал на приемник.
Возможно, декодирование просто не удалось.

А подаёт или нет, видно осциллографом на выходе приёмника.
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
02.07.2025, 10:22  [ТС]
может есть другая библиотека для подобных пультов?
0
Эксперт .NET
 Аватар для Rius
12469 / 7423 / 1637
Регистрация: 25.05.2015
Сообщений: 22,511
Записей в блоге: 14
02.07.2025, 17:37
Есть ещё одна подобная. Только рекламировать и разбираться в них нет никакого желания - и у этой, и у той, в репозитории вывешен фашистский флаг.

Можете проекты на этой плате посмотреть:
https://www.instructables.com/... sal-Remot/
https://www.analysir.com/blog/... ed-module/

Можно перейти на чипы ESP32 и среду VSCode с фреймворком ESP-IDF. Там есть специализированный модуль для пультов (remote control): ESP32. Урок 36. RMT. Работа с ИК-пультом
Но это очень далеко от вайб-кодинга.
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13423 / 7518 / 827
Регистрация: 09.09.2009
Сообщений: 29,450
02.07.2025, 22:32
Цитата Сообщение от Notcoder92 Посмотреть сообщение
есть 3 рабочих пульта-мышки
"аэромыши"? так они вроде как по радиоканалу работают...
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
03.07.2025, 06:31  [ТС]
пульты-мыши были ик, и этот этап освоения ардуино я тоже прошел.
raw коды кондиционера сохранил в файлик.
осталось разобраться с ик передатчиком а потом собрать один готовый файл трех этих модулей
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
05.07.2025, 12:35  [ТС]
я захватил raw code от пульта кондиционера, но не знаю верно ли их оформил ИИ. сначала я создал 2 файла AC_RawCodes.cpp и AC_RawCodes.h и код был заточен на эти файлы но т.к. кондей не реагировал на вкыл/выкл решено было вставить код вкыл/выкл прямо в этот скетч. на камеру телефона диод светиться 1-2сек в то время как диод пульта при нажатии вкыл/выкл по ощущениям вспыхивает на пол-секунды. может надо заставить передавать код быстрее?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <Wire.h>          // Для работы с I2C
#include <Adafruit_AM2320.h> // Для датчика AM2320
#include <IRremote.h>      // Для работы с ИК-сигналами
 
// Создаем объект для работы с датчиком AM2320
Adafruit_AM2320 am2320 = Adafruit_AM2320();
 
// Определяем пины I2C для вашей платы WeMos D1 R2
const int SDA_PIN = D14;
const int SCL_PIN = D15;
 
// Переменные для хранения значений температуры и влажности
float temperature_value;
float humidity_value;
 
// Пин для ИК-светодиода
const int IR_LED_PIN = D7; // ИК-светодиод подключен к D7
 
// Создаем объект для отправки ИК-сигналов
IRsend irsend(IR_LED_PIN);
 
// Флаг для чередования чтения температуры и влажности
bool readTemperatureNext = true; // Начинаем с чтения температуры
 
// Переменные для неблокирующей задержки чтения датчика
unsigned long previousMillisSensor = 0;
const long intervalSensor = 15000; // Интервал в 15 секунд для чтения одного параметра
 
// --- RAW-КОДЫ ДЛЯ КОНДИЦИОНЕРА (ВСТРОЕНЫ В ИНО ФАЙЛ) ---
// ВАЖНО: Массивы теперь объявлены как uint16_t
// Это обеспечивает совместимость с функцией irsend.sendRaw()
 
// Выключаю из Холод 30 вентилятор 1, экран без подсветки
const uint16_t C30F1_OFF_CODE_1[] = {
  50, 77150, 39800, 12400, 27300, 12350, 27350, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 26650, 12350, 8100, 13050, 7450, 13050, 26600, 12400, 27300, 12350, 8100, 13000, 26650, 12350, 8100, 13050, 7450, 13050, 26600, 12350, 27300, 12400, 8100, 13050, 26600, 12450, 27250, 12350, 8100, 13050, 7450, 13050, 26600, 12400, 8100, 13050, 7450, 13050, 7450, 13050, 26650, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13100, 7350, 13050, 7450, 13000, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13000, 7450, 13000, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 26600, 12350, 8100, 13050
};
const int C30F1_OFF_CODE_1_LENGTH = sizeof(C30F1_OFF_CODE_1) / sizeof(C30F1_OFF_CODE_1[0]);
 
const uint16_t C30F1_OFF_CODE_2[] = {
  50, 77200, 39800, 12400, 27300, 12400, 27250, 12400, 8100, 13000, 7450, 13050, 7450, 13000, 26600, 12400, 8100, 13050, 7400, 13050, 26600, 12400, 27250, 12350, 8100, 13050, 26600, 12400, 8100, 13000, 7450, 13050, 26600, 12350, 27300, 12350, 8100, 13050, 26650, 12350, 27300, 12400, 8100, 13000, 7450, 13000, 26650, 12350, 8100, 13050, 7450, 13000, 26650, 12400, 8100, 12450, 8000, 13050, 7450, 13050, 7450, 12450, 8000, 13050, 7400, 13050, 7450, 12450, 8000, 13050, 7450, 12450, 8050, 12450, 8000, 12450, 8000, 12450, 8050, 13000, 7450, 12450, 8050, 12400, 8050, 12500, 8000, 12450, 8000, 12450, 8000, 12450, 8050, 12400, 27200, 12350, 8100, 12450, 8050, 12450
};
const int C30F1_OFF_CODE_2_LENGTH = sizeof(C30F1_OFF_CODE_2) / sizeof(C30F1_OFF_CODE_2[0]);
 
// Включаю в Холод 30 вентилятор 1, экран без подсветки
const uint16_t C30F1_ON_CODE_1[] = {
  50, 77150, 39800, 12450, 27250, 12350, 27250, 12400, 8100, 13050, 7400, 13050, 7450, 13050, 26600, 12350, 8100, 13050, 7400, 13050, 26550, 12400, 27300, 12350, 8100, 13050, 26600, 12350, 8100, 13050, 7400, 13050, 26600, 12350, 27300, 12350, 8100, 13050, 26600, 12400, 27300, 12350, 8100, 13050, 7400, 13050, 26600, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 26600, 12400, 8100, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13050, 7400, 12500, 8000, 12400, 8050, 13050, 7450, 12450, 8000, 13050, 7450, 12400, 27250, 12350, 8100, 13050
};
const int C30F1_ON_CODE_1_LENGTH = sizeof(C30F1_ON_CODE_1) / sizeof(C30F1_ON_CODE_1[0]);
 
const uint16_t C30F1_ON_CODE_2[] = {
  50, 77900, 39150, 13000, 26650, 13050, 26650, 12400, 8050, 12400, 8100, 12350, 8100, 12450, 27200, 12400, 8100, 12400, 8100, 12400, 27250, 12400, 27250, 12400, 8100, 12350, 27250, 12400, 8100, 12350, 8100, 12350, 27250, 12400, 27250, 12400, 8100, 12400, 27250, 12400, 27250, 12400, 8100, 12400, 8100, 12400, 27250, 12400, 8100, 12400, 8100, 12400, 27250, 12400, 8100, 12400, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12400, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12400, 8100, 12350, 8100, 12350, 8150, 12350, 8150, 12350, 27300, 12350, 8100, 12350, 8150, 12350, 27250, 12350, 8150, 12350, 8150, 12350
};
const int C30F1_ON_CODE_2_LENGTH = sizeof(C30F1_ON_CODE_2) / sizeof(C30F1_ON_CODE_2[0]);
 
// --- КОНЕЦ RAW-КОДОВ ДЛЯ КОНДИЦИОНЕРА ---
 
void setup() {
  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }
 
  Serial.println("--- Запуск системы ---");
 
  Wire.begin(SDA_PIN, SCL_PIN);
 
  if (!am2320.begin()) {
    Serial.println("Ошибка: Датчик AM2320 не найден. Проверьте подключение.");
    while (true);
  } else {
    Serial.println("Датчик AM2320 успешно инициализирован.");
  }
 
  pinMode(IR_LED_PIN, OUTPUT);
  digitalWrite(IR_LED_PIN, LOW);
 
  Serial.println("Введите '11' для вывода текущих данных с датчика, '22' для включения кондиционера, '33' для выключения.");
}
 
void loop() {
  // --- Неблокирующее чтение датчика с использованием millis() ---
  unsigned long currentMillis = millis();
 
  if (currentMillis - previousMillisSensor >= intervalSensor) {
    previousMillisSensor = currentMillis;
 
    if (readTemperatureNext) {
      temperature_value = am2320.readTemperature();
      Serial.print("Автоматическое обновление - Получена температура. ");
    } else {
      humidity_value = am2320.readHumidity();
      Serial.print("Автоматическое обновление - Получена влажность. ");
    }
 
    readTemperatureNext = !readTemperatureNext;
 
    if (!readTemperatureNext) {
      if (isnan(temperature_value) || isnan(humidity_value)) {
        Serial.println("Ошибка: Получены некорректные данные (NaN).");
        Serial.print("Температура (raw): "); Serial.println(temperature_value);
        Serial.print("Влажность (raw): "); Serial.println(humidity_value);
      } else {
        Serial.print("Температура: ");
        Serial.print(temperature_value, 2);
        Serial.println(" °C");
 
        Serial.print("Влажность: ");
        Serial.print(humidity_value, 1);
        Serial.println(" %");
      }
    }
  }
  // --- Конец неблокирующего чтения датчика ---
 
  String command = "";
  if (Serial.available()) {
    command = Serial.readStringUntil('\n');
    command.trim();
  }
 
  // Обработка команды "11" (вывод текущих данных с датчика)
  if (command == "11") {
    Serial.println("Получена команда '11'. Вывод текущих данных с датчика...");
    if (isnan(temperature_value) || isnan(humidity_value)) {
      Serial.println("Ошибка: Данные датчика некорректны (NaN).");
      Serial.print("Температура (raw): "); Serial.println(temperature_value);
      Serial.print("Влажность (raw): "); Serial.println(humidity_value);
    } else {
      Serial.print("Текущая Температура: ");
      Serial.print(temperature_value, 2);
      Serial.println(" °C");
 
      Serial.print("Текущая Влажность: ");
      Serial.print(humidity_value, 1);
      Serial.println(" %");
    }
  }
 
  // Обработка команды "22" (включение кондиционера)
  if (command == "22") {
    Serial.println("Получена команда '22'. Включение кондиционера...");
    sendACOnSignal();
  }
 
  // Обработка команды "33" (выключение кондиционера)
  if (command == "33") {
    Serial.println("Получена команда '33'. Выключение кондиционера...");
    sendACOffSignal();
  }
}
 
// Функция для отправки сигнала включения кондиционера
void sendACOnSignal() {
  Serial.println("Отправка сигнала включения кондиционера...");
  
  // Массивы C30F1_ON_CODE_1 и C30F1_ON_CODE_2 теперь имеют правильный тип uint16_t
  irsend.sendRaw(C30F1_ON_CODE_1, C30F1_ON_CODE_1_LENGTH, 38); // Отправка первого пакета
  delay(50); // Пауза между пакетами
  irsend.sendRaw(C30F1_ON_CODE_2, C30F1_ON_CODE_2_LENGTH, 38); // Отправка второго пакета
}
 
// Функция для отправки сигнала выключения кондиционера
void sendACOffSignal() {
  Serial.println("Отправка сигнала выключения кондиционера...");
  
  // Массивы C30F1_OFF_CODE_1 и C30F1_OFF_CODE_2 теперь имеют правильный тип uint16_t
  irsend.sendRaw(C30F1_OFF_CODE_1, C30F1_OFF_CODE_1_LENGTH, 38); // Отправка первого пакета
  delay(50); // Пауза между пакетами
  irsend.sendRaw(C30F1_OFF_CODE_2, C30F1_OFF_CODE_2_LENGTH, 38); // Отправка второго пакета
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2025, 12:35
Помогаю со студенческими работами здесь

Дистанционное управление проектором
Здравствуйте, уважаемые форумчане! Нужна ваша помощь. Ситуация следующая: попался мне в руки...

дистанционное управление люстрой
года 3 назад поставил в люстры такие реле http://www.dealextremi.som/p/ir-remote- ... 220v-12902 ....

Автомат освещения день-ночь+дистанционное управление
Добрый день ! Собрал простую схему управления уличным фонарем 250W на Tiny2313 с функциями:...

Дистанционное управление с ноутбука и передача глобальных координат с gps на ноутбук в режиме реального времени
Здравствуйте, очень хочу собрать ру модель танка. Интересует вопрос управления им с ноутбука и...

Дистанционное управление роботом. Ардуино. Эвольвектор
Добрый день! Нужна помощь... Пишем программу для управлением роботом с помощью пульта с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мой 7 минутный ролик с крамольным предложением про шахматы, предлагаю заценить
_Ivana 18.07.2025
p2UhJNMGY94
Десять Middleware Node.js для эффективного кодинга
Reangularity 18.07.2025
Когда я только начинал работать с Node. js, количество пакетов в npm меня буквально парализовало. Сегодня их больше 1,3 миллиона — попробуй разберись, что стоит твоего внимания, а что нет. Я потратил. . .
Context и глубины Android
mobDevWorks 18.07.2025
В Android разработки Context напоминает воздух - он везде, жизненно необходим, но мало кто может детально объяснить его природу. Мы привыкли получать его как параметр, передавать дальше и. . .
Результаты исследования от команды MCM (июль 2025 г.)
Programma_Boinc 18.07.2025
Результаты исследования от команды MCM (июль 2025 г. ) Как сообщалось в наших предыдущих публикациях, мы изучаем гены, которые имеют наибольший рейтинг и ассоциируются с различными видами рака, в. . .
ИИ-чатбот на React с OpenAI и LangChain.js
Reangularity 17.07.2025
React давно стал для меня золотым стандартом фронтенд-разработки. Его компонентная структура, виртуальный DOM и однонаправленный поток данных идеально подходят для создания динамичных интерфейсов. . .
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
Трассировка корутин Kotlin с OpenTelemetry
mobDevWorks 14.07.2025
Асинхронное программирование меняет правила игры, особенно когда речь заходит о трассировке операций. В Kotlin с его корутинами эта проблема приобретает особый оттенок, который я хотел бы детально. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru