Xiaomi LYWSD03MMC + HM10 + ESP8266 (WEMOS)

andrew01
Posts: 162
Joined: Fri May 24, 2019 6:49 am

Post

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.
You do not have the required permissions to view the files attached to this post.
kocyl
Posts: 17
Joined: Wed Mar 31, 2021 11:44 am

Post

#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
Posts: 256
Joined: Sun Nov 08, 2020 3:41 pm

Post

Krzyśku wrote: Wed Jan 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
Posts: 256
Joined: Sun Nov 08, 2020 3:41 pm

Post

andrew01 wrote: Wed Oct 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
Posts: 12
Joined: Sat Oct 28, 2023 8:05 pm

Post

andrew01 wrote: Fri Oct 30, 2020 1:46 pm
Zibi wrote: Fri Oct 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
Posts: 12
Joined: Sat Oct 28, 2023 8:05 pm

Post

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

Return to “Ogólna dyskusja”