Xiaomi LYWSD03MMC + HM10 + ESP8266 (WEMOS)

andrew01
Posty: 162
Rejestracja: pt maja 24, 2019 6:49 am

Muszę przyznać, że nowy układ działa stabilniej, mam podłączonych 6 czujników i z jednym miałem duże problemy, obecnie jest znacznie lepiej. Prawa część wykresu to już na nowym układzie.
Załączniki
Screenshot_20210517-122052_SUPLA.jpg
Screenshot_20210517-122052_SUPLA.jpg (341.01 KiB) Przejrzano 1251 razy
kocyl
Posty: 17
Rejestracja: śr mar 31, 2021 11:44 am

#include <SoftwareSerial.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/sensor/therm_hygro_meter.h>

#define MODULE_NAME "Xiaomi Mijia" //Nazwa modułu
#define TEMPERATURE_NOT_AVAILABLE -275
#define STASSID "...."
#define STAPSK "...."

Supla::ESPWifi wifi(STASSID, STAPSK);

bool debug = false;

class myThermHygroMeter : public Supla::Sensor::ThermHygroMeter
{
public:
myThermHygroMeter(double *temp, double *humi)
{
myTemp = temp;
myHumi = humi;
lastReadTime = 0;
}
void onInit()
{
channel.setNewValue(getTemp(), getHumi());
}

double getTemp()
{
return *myTemp;
}
double getHumi()
{
return *myHumi;
}
double *myTemp;
double *myHumi;
};

//###### MIJIA #######

//podłaczenie modułu HM-10
SoftwareSerial hm10(D5, D6); // RX, TX

//liczba czujników
const byte sensorCount = 2;

//adresy czujników, na końcu niezbędny NULL
char addr[sensorCount][7] = {
{0xA4,0xC1,0x38,0x0E,0x36,0x8F,0x00}, //#1
{0xA4,0xC1,0x38,0x66,0x23,0x63,0x00} //#2
};

//czas pomiędzy odczytami
int readInterval = 10000;

//maksymalna liczba dozwolonych pominięć odczytu
byte maxSkippedReading = 5;

class Mijia
{
private:
char mijiaData[100];
byte mijiaIndex;
unsigned long lastReadTime;
unsigned long lastReceiveTime;
char receivedAddr[6];

public:

double temp[sensorCount];
double humi[sensorCount];
double batt[sensorCount];
double volt[sensorCount];
byte skippedReading[sensorCount];

void clearValues(int i)
{
Serial.print(F("*** MIJIA CLEAR VALUES "));
Serial.println(i);
temp = TEMPERATURE_NOT_AVAILABLE;
humi = TEMPERATURE_NOT_AVAILABLE;
batt = TEMPERATURE_NOT_AVAILABLE;
volt = TEMPERATURE_NOT_AVAILABLE;
}

void clearAllValues()
{
for (int i = 0; i < sensorCount; i++)
{
clearValues(i);
}
}

void Initialize()
{
Serial.println("AT");
hm10.write("AT");
delay(100);
Serial.println("AT+ROLE1");
hm10.write("AT+ROLE1");
delay(100);
Serial.println("AT+IMME1");
hm10.write("AT+IMME1");
delay(100);
Serial.println("AT+RESET");
hm10.write("AT+RESET");
delay(50);
clearAllValues();
}

void Iterate()
{
if (hm10.available() > 0)
{
mijiaData[mijiaIndex] = hm10.read();
mijiaIndex++;
lastReceiveTime = millis();
}

//paczkę uznajemy za odczytaną gdy minął zadany czas np. 200ms
//lub kończy się na 0D 0A (nowa linia)
if ((millis() - lastReceiveTime > 200 and mijiaIndex > 0) or
(mijiaIndex > 10 and
(int)mijiaData[mijiaIndex - 1] == 0x0A and
(int)mijiaData[mijiaIndex - 2] == 0x0D))
{
if (debug)
{
Serial.println("ODCZYTANO PACZKĘ DANYCH");
Serial.print("HEX: ");
for (int i = 0; i < mijiaIndex; i++)
{
Serial.print(mijiaData,HEX);
Serial.print(" ");
}
Serial.println();

Serial.print("DEC: ");
for (int i = 0; i < mijiaIndex; i++)
{
Serial.print(mijiaData,DEC);
Serial.print(" ");
}
Serial.println();
}
//paczka z danymi
if (mijiaIndex >= 36 and
strncmp(mijiaData,"OK+DISA:",8) == 0 and
(int)mijiaData[19] == 0x1A and //UUID 181A
(int)mijiaData[20] == 0x18)
{
if (debug) Serial.println("POPRAWNA PACZKA DANYCH");

//wyodrębnienia adresu urządzenia
for (int i = 21; i < 27; i++) receivedAddr = mijiaData;

//sprawdzenie czy adres jest znany
for (int i = 0; i < sensorCount; i++)
{
if (strcmp(receivedAddr,addr) == 0)
{
//zerowanie wskaźnika pominięć
skippedReading = 0;

Serial.print("ZNANY CZUJNIK:");
for (int j = 0; j < 6; j++)
{
Serial.print(" ");
Serial.printf("%02hhX", receivedAddr[j]);
}
Serial.println();

temp[i] = ((double)mijiaData[27] * 256 + (double)mijiaData[28]) / 10;
humi[i] = mijiaData[29];
batt[i] = mijiaData[30];
volt[i] = ((double)mijiaData[31] * 256 + (double)mijiaData[32]) / 1000;

Serial.print("Temp: ");
Serial.println(temp[i]);
Serial.print("Humi: ");
Serial.println(humi[i]);
Serial.print("Batt: ");
Serial.println(batt[i]);
Serial.print("Volt: ");
Serial.println(volt[i]);
}
}
}

mijiaIndex = 0;
memset(mijiaData, 0, sizeof(mijiaData));
}

//odczyt danych
if (hm10.available() == 0 and millis() - lastReadTime > readInterval)
{
lastReadTime = millis();
lastReceiveTime = millis();
//licznik pominiętych odczytów
for (int i = 0; i < sensorCount; i++)
{
skippedReading[i]++;
if (skippedReading[i] > maxSkippedReading) clearValues(i);
}
mijiaIndex = 0;
memset(mijiaData, 0, sizeof(mijiaData));
hm10.write("AT+DISA?");
}
}
};

Mijia myMijia;

int suplaStatus;
void status_func(int status, const char *msg)
{
suplaStatus = status;
Serial.println(msg);
}

void setup() {

Serial.begin(9600);
while (!Serial)
{
}
delay(1000);
Serial.println("SERIAL STARTED");

hm10.begin(9600);
while (!hm10)
{
}
delay(1000);
Serial.println("HM10 SERIAL STARTED");

myMijia.Initialize();

//#1
new myThermHygroMeter(&myMijia.temp[0], &myMijia.humi[0]);
new myThermHygroMeter(&myMijia.volt[0], &myMijia.batt[0]);

//#2
new myThermHygroMeter(&myMijia.temp[1], &myMijia.humi[1]);
new myThermHygroMeter(&myMijia.volt[1], &myMijia.batt[1]);

SuplaDevice.setStatusFuncImpl(&status_func);

// Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-guid
char GUID[SUPLA_GUID_SIZE] = {...};
// Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {...};

SuplaDevice.setName(MODULE_NAME);
SuplaDevice.begin(GUID, // Global Unique Identifier
"....", // SUPLA server address
"....", // Email address used to login to Supla Cloud
AUTHKEY); // Authorization key // Location Password
}

void loop() {

SuplaDevice.iterate();

if (suplaStatus == 17)
myMijia.Iterate();

}


Czy znajdzie się ktoś kto przerobiłby kod pod ESP332 z wbudowanym BLE?
Juszczaczek1
Posty: 256
Rejestracja: ndz lis 08, 2020 3:41 pm

Krzyśku pisze: śr sty 13, 2021 6:55 pm A jeszcze jedno. Do flashowania muszę użyć arduino uno czy mogę też d1 mini?
Też chciałbym wiedzieć bo nie posiadam Arduino
Juszczaczek1
Posty: 256
Rejestracja: ndz lis 08, 2020 3:41 pm

andrew01 pisze: śr paź 28, 2020 11:46 pm
Do efektu końcowego potrzebny jest jeszcze plik ino (poniżej) dla Wemos'a lub jakiegokolwiek innego ESP, jest w zasadzie jeszcze ciepły, gdyż działa to u mnie od niedawna, więc nie wykluczam, że znajdą się jakieś błędy. Odczyt danych jest co 10 sekund, można to oczywiście wydłużyć. Jeśli przez 5 kolejnych prób nie otrzymamy danych to takiemu czujnikowi zostaną wyłączone wskazania.

Kto mi wytlumaczy jak mam to zrobic? nigdy tego nie robilem
Adamus10
Posty: 12
Rejestracja: sob paź 28, 2023 8:05 pm

andrew01 pisze: pt paź 30, 2020 1:46 pm
Zibi pisze: pt paź 30, 2020 9:04 am andrew01 jak to u ciebie funkcjonuje? Bo chyba będę zamawiał te Xiaomi jeśli jest taka opcja zrobić to na wemosie.
U mnie na razie dwa czujniki, 4 dodatkowe już zamówione :)

Zamówiłem też poniższy moduł aby takiego druciarstwa nie było z podłączeniem anteny zewnętrznej:

https://www.aliexpress.com/item/1005001 ... 4c4dltt5ok

Pozdrawiam
Andrzej
Jak krok po kroku zrobiłes aktualizacje w module JDY-08?
Ja robie tak:
Wgrywam oryginalny soft (540)
włączam "upgrade mode"
wgrywam soft z posta (709)
brak komunikacji AT.

Może czegoś nie robię jak powinienem?
Adamus10
Posty: 12
Rejestracja: sob paź 28, 2023 8:05 pm

Poradziłem sobie, choć spędziłem na tym sporo czasu.
Wrócę tu jeszcze by opisać to dla potomnych.
ODPOWIEDZ

Wróć do „Ogólna dyskusja”