В предыдущей статье был описан MQTT-мост от 1technophile. К нему были добавлены сенсор температуры и влажности DHT, а также датчик освещенности. Изначально использовался программный декодер ИК-сигналов. Тестирование ИК-передатчика на шлюзе не проводилось из-за отсутствия компонентов. Благодаря IC Station, предоставившим модуль аппаратного декодера YS-IRTM и NodeMCU , в текущей версии программное решение заменено на модуль YS-IRTM.

Проект оказался сложным. Следует отметить, что навыки программирования были недостаточны. Документация труднодоступна, но найдено обсуждение на форуме , объясняющее принцип работы устройства. При распознавании ИК-кода через последовательный интерфейс передаются 3 шестнадцатеричных кода. Для передачи требуется 5 кодов: A1,F1,xx,xx,xx (A1,F1 инициируют отправку последующих значений). Скорость передачи данных можно настраивать, но использовано значение по умолчанию 9600 бод.
Подключение простое – требуется всего 4 провода Dupont. После настройки кода удалось организовать обмен через программный UART. Разработка начата на Arduino Uno с последующим переносом на плату ESP8266. При переходе на ESP возникли сложности. Изначально предполагалась необходимость преобразователя уровней, но это не помогло. Удивительно, что преобразователь не потребовался, учитывая питание ESP 3.3 В. После добавления небольшой задержки проблемы устранены – вероятно, из-за высокой скорости работы ESP.
Для использования укажите SSID, пароль и данные MQTT-сервера. Прошейте устройство, предварительно установив необходимые библиотеки. 1technophile предоставляет подробную документацию в своей вики .
После прошивки для поиска ИК-кодов подпишитесь на топики через Windows-команду ниже. Дайте шлюзу время на подключение, направьте ИК-пульт на сенсор и нажмите кнопку для определения кода.
1 |
"C:\Program Files (x86)\mosquitto\mosquitto_sub" -t stat/# -t tele/# -t cmnd/# -t home/# -v" |
В окне появится сообщение вида “home/sensors/ir 4,fb,8,” (код кнопки питания телевизора). Для тестирования:
1 |
"C:\Program Files (x86)\mosquitto\mosquitto_pub" -t home/commands/MQTTtoIR/ -m 4,fb,8, |
Данный код включает/выключает телевизор.

УвеличитьТеперь можно управлять ИК-устройствами через системы домашней автоматизации. Неиспользуемые сенсоры можно отключить. Без этого в MQTT будут поступать ошибочные данные. Ниже приведены фрагменты кода Arduino для ИК-модуля, полная версия доступна на GitHub :
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 |
……. // software serial : TX = digital pin 12, RX = digital pin 14 SoftwareSerial portOne(14, 12); …………. #define subject433toMQTT "home/433toMQTT" #define subjectMQTTto433 "home/commands/MQTTto433" ………. // Start IR software serial ports portOne.begin(9600); ………… //begining of IR if (portOne.available() > 0) { delay(1); int my_in_bytes[3]={0, 0, 0}; for (int i=0; i <= 2; i++){ incomingByte = portOne.read(); Serial.print("I received: "); Serial.println (String (incomingByte, HEX)); my_in_bytes [i] = incomingByte; } String IRvalue; for (int i=0; i <= 2; i++){ Serial.print(String (my_in_bytes [i], HEX) + "," ); IRvalue = IRvalue + (String (my_in_bytes [i], HEX) + "," ); } Serial.println(""); sendMQTT(subjectIRtoMQTT,String(IRvalue)); } ……………. //IR Recieved if (topicNameRec = subjectMQTTtoIR){ char input1[3]; char input2[3]; char input3[3]; int val1; int val2; int val3; uint8_t my_out_bytes[5]={0xA1, 0xF1, 0, 0, 0}; int commaIndex = callbackstring.indexOf(','); // Search for the next comma just after the first int secondCommaIndex = callbackstring.indexOf(',', commaIndex + 1); String firstValue = callbackstring.substring(0, commaIndex); String secondValue = callbackstring.substring(commaIndex + 1, secondCommaIndex); String thirdValue = callbackstring.substring(secondCommaIndex + 1); // To the end of the string firstValue.toCharArray(input1, 4); val1 = StrToHex(input1); my_out_bytes [2] = val1; secondValue.toCharArray(input2, 4); val2 = StrToHex(input2); my_out_bytes [3] = val2; thirdValue.toCharArray(input3, 4); val3 = StrToHex(input3); my_out_bytes [4] = val3; for (int i=0; i <= 4; i++){ Serial.print(String (my_out_bytes [i], HEX) + "," ); } portOne.write(my_out_bytes,sizeof(my_out_bytes)); Serial.println(""); } ………. //IR String to Hex Conversion int StrToHex(char str[]) { return (int) strtol(str, 0, 16); } |
Планируется создание корпуса методом 3D-печати на тестируемом принтере CR-10 . ИК-светодиод будет вынесен в оптимальное положение, так как текущая ориентация приемника и передатчика в одном направлении неэффективна.
Выражаем благодарность IC Station за предоставленные для обзора NodeMCU ( $5.81 с доставкой ) и ИК-приемопередатчик ( $3.39 с доставкой ). Скидка 15% по промокоду Karics. Шлюз теперь полностью функционален.
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.