Датчик температуры и влажности с RS485 на STM8.

Датчик температуры и влажности с проводной шиной 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);  
     
  }  
 }
}