Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15

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

01.07.2025, 20:42. Показов 1559. Ответов 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 14
02.07.2025, 10:09
Цитата Сообщение от Notcoder92 Посмотреть сообщение
но ни один не подает сигнал на приемник.
Возможно, декодирование просто не удалось.

А подаёт или нет, видно осциллографом на выходе приёмника.
0
0 / 0 / 0
Регистрация: 26.01.2024
Сообщений: 15
02.07.2025, 10:22  [ТС]
может есть другая библиотека для подобных пультов?
0
Эксперт .NET
 Аватар для Rius
13026 / 7591 / 1662
Регистрация: 25.05.2015
Сообщений: 23,093
Записей в блоге: 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
13440 / 7534 / 829
Регистрация: 09.09.2009
Сообщений: 29,554
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru