Датчик температуры и влажности с проводной шиной RS485 на микроконтроллере STM8. Собран был на макетке. Передает данные в формате JSON.
Зачем это надо:
Датчик для автоматизации вытяжки в подвале гаража, по команде отправляет данные с датчика SHT30 в сеть RS485 в формате JSON.
Схема:
Точнее то, как подключены модули
Код:
для STM8 на языке С (без плюсов) и для Arduino IDE.
#include <Wire.h> #include <Serial.h> #define SHT30_address 0x45 #define DERE 13 // PD4. ноги DERE RS485 const char cmd = '1'; // ID void setup() { Wire_begin(); Serial_begin(9600); pinMode(DERE, OUTPUT); // digitalWrite(DERE, HIGH); // Serial_print_s("OK"); digitalWrite(DERE, LOW); // прием } void loop() { // ждем команду if (Serial_available()) { delay(2); char val0 = Serial_read(); // отсекаем команду от мусора char readCmd = Serial_read(); if (val0 == '!' && readCmd == cmd){ // SHT30 byte data[6]; Wire_beginTransmission(SHT30_address); Wire_write(0x2C); Wire_write(0x06); Wire_endTransmission(); delay(500); Wire_requestFrom(SHT30_address, 6); for (byte i = 0; Wire_available() > 0; i++){ data[i] = Wire_read(); } // конвертируем данные с датчика в понятный float temp = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45; float hum = ((((data[3] * 256.0) + data[4]) * 100.0) / 65535.0); // включаем передачу и отправляем. digitalWrite(DERE, HIGH); delay(100); //{"sensor":"cellar","temp":30.4,"hum":50.4} Serial_print_s("{\"s\":\"cr\",\"temp\":"); Serial_print_f(temp); Serial_print_s(",\"hum\":"); Serial_print_f(hum); Serial_print_s("}"); delay(100); digitalWrite(DERE, LOW); } } }
Код для датчика STH20:
#include <Wire.h> #include <Serial.h> #define SHT20_address 0x40 #define DERE PA3 // PD4. ноги DERE RS485 const char cmd = '4'; // ID void setup() { Wire_begin(); Serial_begin(9600); delay(100); // Конф SHT20 /* Wire_beginTransmission(SHT20_address); Wire_write(0xE6); // WRITE_USER_REG Wire_write(0b10000000); Wire_endTransmission(); // reset Wire_beginTransmission(SHT20_address); Wire_write(0xFE); // SOFT_RESET Wire_endTransmission(); */ pinMode(DERE, OUTPUT); // digitalWrite(DERE, HIGH); // Serial_print_s("OK"); digitalWrite(DERE, LOW); // прием } void loop() { // ждем команду if (Serial_available()) { delay(2); char val0 = Serial_read(); // отсекаем команду от мусора char readCmd = Serial_read(); if (val0 == '!' && readCmd == cmd){ // SHT20 byte data[2]; Wire_beginTransmission(SHT20_address); Wire_write(0xF5); Wire_endTransmission(); delay(500); Wire_requestFrom(SHT20_address, 2); for (byte i = 0; Wire_available() > 0; i++){ data[i] = Wire_read(); } // конвертируем данные с датчика в понятный float hum = (((data[0] * 256.0 + data[1]) * 125.0) / 65536.0) - 6; // снова SHT20 Wire_beginTransmission(SHT20_address); Wire_write(0xF3); Wire_endTransmission(); delay(500); Wire_requestFrom(SHT20_address, 2); for (byte y = 0; Wire_available() > 0; y++){ data[y] = Wire_read(); } // конвертируем данные с датчика в понятный float temp = (((data[0] * 256.0 + data[1]) * 175.72) / 65536.0) - 46.85; // включаем передачу и отправляем. digitalWrite(DERE, HIGH); delay(100); //{"sensor":"cellar","temp":30.4,"hum":50.4} Serial_print_s("{\"s\":\"up\",\"temp\":"); Serial_print_f(temp); Serial_print_s(",\"hum\":"); Serial_print_f(hum); Serial_print_s("}"); delay(100); digitalWrite(DERE, LOW); } } }