esp8266-01s + LCD1602A + DS18B20 + SUPLA

NEW
Posts: 28
Joined: Thu Apr 15, 2021 5:28 pm

Post

Dzień dobry, witam wszystkich i z góry dziękuje za pomoc. Jestem początkujący i zielony ale chętnie się nauczę. Interesuje mnie samodzielne pisanie programów / kodów w C dla układów esp8266/85/32. Na razie potrafię tylko wrzucać gotowe pliki .bin do układów, czasem uda mi się polepić jakiś gotowy kod arduino.

Obecnie pocę się nad kodem dla esp8266-01s i chciałbym by ten układ działał na SULI CLOUD z 1-ym przekaźnikiem, 1-m czujnikiem temperatury DS18B20 oraz wyświetlaczem LCD1602A.

Do chwili obecnej układ esp01s działa tylko z LCD1502A i DS18B20 wyświetlając temperaturę w oC i F.

Czy mógłby ktoś mi pomóc dorobić PRZEKAŹNIK I łączność z SUPLA CLOUD.

Mam dwa osobne kody: jeden w/w czyli esp01s + LCD1602A + DS18B20 i drugi esp01s + PRZEKAŹNIK + SUPLA CLOUD ale połączyć je razem nie potrafię, nie znam zasad pisania kodu.

Poniżej spróbuje wrzucić kod, oby dwa kody przetestowane i działają.
NEW
Posts: 28
Joined: Thu Apr 15, 2021 5:28 pm

Post

lcd1602.jpg
You do not have the required permissions to view the files attached to this post.
QLQ
Posts: 2512
Joined: Sun Sep 03, 2017 9:13 am

Post

NEW wrote: Thu Apr 15, 2021 5:46 pm Dzień dobry, witam wszystkich i z góry dziękuje za pomoc. Jestem początkujący i zielony ale chętnie się nauczę. Interesuje mnie samodzielne pisanie programów / kodów w C dla układów esp8266/85/32. Na razie potrafię tylko wrzucać gotowe pliki .bin do układów, czasem uda mi się polepić jakiś gotowy kod arduino.

Obecnie pocę się nad kodem dla esp8266-01s i chciałbym by ten układ działał na SULI CLOUD z 1-ym przekaźnikiem, 1-m czujnikiem temperatury DS18B20 oraz wyświetlaczem LCD1602A.

Do chwili obecnej układ esp01s działa tylko z LCD1502A i DS18B20 wyświetlając temperaturę w oC i F.

Czy mógłby ktoś mi pomóc dorobić PRZEKAŹNIK I łączność z SUPLA CLOUD.

Mam dwa osobne kody: jeden w/w czyli esp01s + LCD1602A + DS18B20 i drugi esp01s + PRZEKAŹNIK + SUPLA CLOUD ale połączyć je razem nie potrafię, nie znam zasad pisania kodu.

Poniżej spróbuje wrzucić kod, oby dwa kody przetestowane i działają.
Kup sobie wemos d1mini tak dla wygody. Też zaczynałem od esp01 ale ciągle podłączanie/ ,sprawdzanie potem czy działa.... KUP wemos!
Podłączysz pp USB będziesz sobie programował a i gpio jest więcej...
jak coś nie działa to włącz zasilanie.....
NEW
Posts: 28
Joined: Thu Apr 15, 2021 5:28 pm

Post

QLQ wrote: Thu Apr 15, 2021 6:39 pm
NEW wrote: Thu Apr 15, 2021 5:46 pm Dzień dobry, witam wszystkich i z góry dziękuje za pomoc. Jestem początkujący i zielony ale chętnie się nauczę. Interesuje mnie samodzielne pisanie programów / kodów w C dla układów esp8266/85/32. Na razie potrafię tylko wrzucać gotowe pliki .bin do układów, czasem uda mi się polepić jakiś gotowy kod arduino.

Obecnie pocę się nad kodem dla esp8266-01s i chciałbym by ten układ działał na SULI CLOUD z 1-ym przekaźnikiem, 1-m czujnikiem temperatury DS18B20 oraz wyświetlaczem LCD1602A.

Do chwili obecnej układ esp01s działa tylko z LCD1502A i DS18B20 wyświetlając temperaturę w oC i F.

Czy mógłby ktoś mi pomóc dorobić PRZEKAŹNIK I łączność z SUPLA CLOUD.

Mam dwa osobne kody: jeden w/w czyli esp01s + LCD1602A + DS18B20 i drugi esp01s + PRZEKAŹNIK + SUPLA CLOUD ale połączyć je razem nie potrafię, nie znam zasad pisania kodu.

Poniżej spróbuje wrzucić kod, oby dwa kody przetestowane i działają.
Kup sobie wemos d1mini tak dla wygody. Też zaczynałem od esp01 ale ciągle podłączanie/ ,sprawdzanie potem czy działa.... KUP wemos!
Podłączysz pp USB będziesz sobie programował a i gpio jest więcej...
Dzięki za wskazówki ale tu nawet nie chodzi u uklad bo mam NODEMCU V3 tylko o kod J.w.
QLQ
Posts: 2512
Joined: Sun Sep 03, 2017 9:13 am

Post

Do esp8266 kod ten sam. Ew wybierasz tylko płytkę Arduino i gpio na którym ma być coś podłączone, sterowane
jak coś nie działa to włącz zasilanie.....
NEW
Posts: 28
Joined: Thu Apr 15, 2021 5:28 pm

Post

Ja to wszystko wiem i nie o to chodzi chodzi o to by to kodu,który umieściłem ktoś mi pomógł dopisać SUPLE CLOUD.
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

A widzisz , trochę namieszałeś , w tytule wpisałeś .01S a później ze nodeMCU . Oba układy są na tym samym mikrokontrolerze ale różnią się ilością dostępnych gpio, ale to pewnie wiesz . Ci do kodu to nslateij będzie do przykładów supli wkleić twój .
Niwa biblioteka supla device jest dostępna wprost z managera i są tam przykłady z różnymi czujnikami także ds18b20. Rozumiem ze ten LCD jest po i2c także tylko obsługę wyświetlacza musisz sobie dorobić .
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
NEW
Posts: 28
Joined: Thu Apr 15, 2021 5:28 pm

Post

po ciężkich kombinacjach laika czyli mnie doszedłem do momentu gdzie mam łączność z SUOLA CLOUD, mam przekaźnik i termometr w CLOUD i Apcce, mam treść na LCD, w treści na LCD brakuje pomiaru temperatury, przekaźnik miga w rytm pojawiającego się textu LCD.
Ide ku dobremu ale proszę jeśli jest ktoś biegle piszący w C++ o poprawienie kodu, będę wdzięczny.
Kod:

/************************************
ESP8266-01s
***********************************/

#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>

#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Skonfiguruj bibliotekę LiquidCrystal_I2C z adresem 0x27, 16 kolumnami i 2 wierszami
OneWire ds(1);

WiFiClient client;

const char* ssid = "wifi";
const char* password = "12345678";

void setup() {
Serial.begin(115200);
delay(10);

char GUID[SUPLA_GUID_SIZE] = {0x1E,0x72,0x8C,0x81,0x13,0x9A,0xD6,0x45,0x4C,0x50,0x09,0xD3,0xC5,0x94,0x5E,0xB3};
uint8_t mac[6] = {0x00, 0x05, 0x04, 0x06, 0x02, 0x01};

//------------------------------------------------------------
//PRZEKAZNIKI:

// CHANNEL1 - RELAY
SuplaDevice.addRelay(3); //GPIO3 (TX)

// CHANNEL2 - RELAY
//SuplaDevice.addRelay(1); //GPIO1 (RX)

// CHANNEL3 - RELAY
//SuplaDevice.addRelay(0); //GPIO0

// CHANNEL4 - RELAY
//SuplaDevice.addRelay(2); //GPIO2
//------------------------------------------------------------
// CZUJNIKI:

// CHANNEL5 - Opening sensor (Normal Open)
//SuplaDevice.addSensorNO(1, true);

// CHANNEL6 - Opening sensor (Normal Open)
//SuplaDevice.addSensorNO(3, true);

// CHANNEL7 - Opening sensor (Normal Open)
//SuplaDevice.addSensorNO(0, true);

// CHANNEL8 - Opening sensor (Normal Open)
//SuplaDevice.addSensorNO(2, true);
//-----------------------------------------------------------
// TERMOMETRY:

// CHANNEL9 - Thermometer DS18B20
SuplaDevice.addDS18B20Thermometer();

// CHANNEL10 - Thermometer DS18B20
//SuplaDevice.addDS18B20Thermometer();
//----------------------------------------------------------

SuplaDevice.begin(GUID, // Global Unique Identifier
mac, // Ethernet MAC address
"svr00.supla.org", // SUPLA server address
00, // Location ID
"12345678"); // Location Password
}

void loop() {
SuplaDevice.iterate();
LCD();

}

// Supla.org ethernet layer
int supla_arduino_tcp_read(void *buf, int count) {
_supla_int_t size = client.available();

if ( size > 0 ) {
if ( size > count ) size = count;
return client.read((uint8_t *)buf, size);
};

return -1;
};

int supla_arduino_tcp_write(void *buf, int count) {
return client.write((const uint8_t *)buf, count);
};

bool supla_arduino_svr_connect(const char *server, int port) {
return client.connect(server, 2015);
}

bool supla_arduino_svr_connected(void) {
return client.connected();
}

void supla_arduino_svr_disconnect(void) {
client.stop();
}

void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

// Serial.println("WiFi init");
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
// Serial.print(".");
}

//Serial.print("\nlocalIP: ");
//Serial.println(WiFi.localIP());
//Serial.print("subnetMask: ");
//Serial.println(WiFi.subnetMask());
//Serial.print("gatewayIP: ");
//Serial.println(WiFi.gatewayIP());
}

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
SuplaDeviceCallbacks cb;

cb.tcp_read = &supla_arduino_tcp_read;
cb.tcp_write = &supla_arduino_tcp_write;
cb.eth_setup = &supla_arduino_eth_setup;
cb.svr_connected = &supla_arduino_svr_connected;
cb.svr_connect = &supla_arduino_svr_connect;
cb.svr_disconnect = &supla_arduino_svr_disconnect;
cb.get_temperature = NULL; //&get_temperature;
cb.get_temperature_and_humidity = NULL;
cb.get_rgbw_value = NULL;
cb.set_rgbw_value = NULL;
return cb;
}
//-----------------------------------------------------------------------
void LCD() {
lcd.begin(0, 2); // Zainicjuj moduł I2C LCD (SDA = GPIO0, SCL = GPIO2)
lcd.backlight(); // Włącz podświetlenie
lcd.clear();
delay(500);

lcd.setCursor(0, 0);
lcd.print("text 1"); // Wyświetl tekst
delay(1000);

lcd.setCursor(0, 1);
lcd.print("text 2"); // Wyświetl tekst
delay(1000);
lcd.clear();

lcd.setCursor(1, 0);
lcd.print("text 3");
delay(1000);

lcd.setCursor(1, 1);
lcd.print("text 4");
delay(1000);

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
for ( i = 0; i < 8; i++) {
}
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{ // we need 9 bytes
data = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
}else
{
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
}
//----------------------------------------------------------
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;

lcd.clear();
delay(500);
lcd.setCursor(0, 0); // Idź do kolumny 0, wiersz 0
lcd.print("Temp.: PIECA CO");

lcd.setCursor(0, 1);
lcd.print(celsius);
lcd.print(" C");

lcd.setCursor(9, 1);
lcd.print(fahrenheit);
lcd.print(" %");

delay(10000);
//----------------------------------------------------------
}
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Ustawiłeś przekaźniki i LCD na tych samych gpio.
Drugi problem jest taki, że dałeś 10s delay na koniec obsługi LCD. Będzie to blokować wykonywanie całego programu.
Trzeci problem jest taki, że używasz starej wersji biblioteki SuplaDevice. Z managera bibliotek w Arduino możesz sobie zainstalować najnowszą wersję i najlepiej by było zacząć cały ten program od początku od jakiegoś przykładu z nowej biblioteki.
Najlepsze suple dla Twojego domu :mrgreen:
NEW
Posts: 28
Joined: Thu Apr 15, 2021 5:28 pm

Post

klew wrote: Sat Apr 17, 2021 6:23 am Ustawiłeś przekaźniki i LCD na tych samych gpio.
Drugi problem jest taki, że dałeś 10s delay na koniec obsługi LCD. Będzie to blokować wykonywanie całego programu.
Trzeci problem jest taki, że używasz starej wersji biblioteki SuplaDevice. Z managera bibliotek w Arduino możesz sobie zainstalować najnowszą wersję i najlepiej by było zacząć cały ten program od początku od jakiegoś przykładu z nowej biblioteki.
dzięki za wskazówki, poprawiłem co mogłem, trochę po zmieniałem lecz działam po omacku bo jestem za bardzo zielony. Kod już ruszył działa prawie tak jak chce ale wydaje mi się termometr w apce działa ok lecz na wyświetlaczu albo się bardzo opóźnia albo z czytuje tylko stan na początku, proszę o sprawdzenie jak komuś by się chciało będę wdzięczy.
Układ to esp8266-01s, LCD1602A i DS18B20.
kod:

#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
//warstwa internetowa
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <OneWire.h>
int button1 = 0; //wartosc początkowa dla przycisku 1

WiFiClient client;
OneWire oneWire(2); //GPIO2) - Pin number definiujemyna którym pinie będzie podłączony czujnik DS18B20
OneWire ds(2);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2); // biblioteka LiquidCrystal_I2C z adresem 0x27, 16 kolumnami i 2 wierszami
//-----------------------------------

const char* ssid = "…...";
const char* password = "……..";
//----------------------------------

double get_temperature(int channelNumber, double last_val) { //ta część kodu odpowiada za odczyt temperatury
double t = -275;
if ( sensors.getDeviceCount() > 0 )
{
sensors.requestTemperatures();
t = sensors.getTempCByIndex(0);
};
return t;
}
//----------------------------------

void setup() {
Serial.begin(115200);
sensors.begin();
SuplaDevice.setTemperatureCallback(&get_temperature);
pinMode (0, INPUT_PULLUP); //ustawiamy GPIO0 na przycisk
delay(10);

char GUID[SUPLA_GUID_SIZE] = {0x04,0x89,0x37,0x91,0x99,0x25,0x1B,0x80,0x0F,0xCC,0x7E,0x14,0xFD,0xEB,0x59,0x79};
uint8_t mac[6] = {0x00, 0x05, 0x04, 0x03, 0x02, 0x01};
//-----------------------------------

// CHANNEL0 - Thermometer DS18B20 // GPIO2
SuplaDevice.addDS18B20Thermometer();

// CHANNEL1 - RELAY
SuplaDevice.addRelay(3); // GPIO3

// CHANNEL2 - Opening sensor (Normal Open) // GPIO ???
//SuplaDevice.addSensorNO(???);

// Moduł I2C LCD (SDA = GPIO1, SCL = GPIO) // GPIO1 i GPIO0
//-----------------------------------

SuplaDevice.begin(GUID, // Global Unique Identifier
mac, // Ethernet MAC address
"svr .. .supla.org", // SUPLA server address // w miejsca xxxx wprowadzamy dane z clouda
.. , // Location ID
" …….. "); // Location Password
//-----------------------------------

lcd.begin(1, 0); // Zainicjuj moduł I2C LCD (SDA = GPIO1, SCL = GPIO0)
lcd.backlight(); // Włącz podświetlenie
lcd.clear();
delay(500);

lcd.setCursor(0, 0);
lcd.print("czekaj trwa ... "); // Wyświetl tekst
delay(1000);

lcd.setCursor(0, 1);
lcd.print("pomiar ........."); // Wyświetl tekst
delay(1000);
lcd.clear();

lcd.setCursor(1, 0);
lcd.print(" Temperatury: ");
delay(1000);

lcd.setCursor(1, 1);
lcd.print("** Pieca CO **");
delay(1000);

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
for ( i = 0; i < 8; i++) {
}
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{ // we need 9 bytes
data = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
}else
{
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}

celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;

lcd.clear();
delay(500);
lcd.setCursor(0, 0); // Idź do kolumny 0, wiersz 0
lcd.print("Temp.: PIECA CO");

lcd.setCursor(0, 1);
lcd.print(celsius);
lcd.print(" C");

lcd.setCursor(9, 1);
lcd.print(fahrenheit);
lcd.print(" %");

delay(0000);
}
//--------------------------------------

void loop() {
SuplaDevice.iterate();

// ponizej kod umozliwiający włączać i wyłączać przekaźnik 1 z dodatkowego fizycznego przycisku dzwonkowego. W moim przypadku
// otwieranie/zamykanie bramy

TSD_SuplaChannelNewValue przycisk1; //ustaw nazwe dla przycisku
przycisk1.SenderID = 0; //Powiadom cnlouda, że załączasz recznie. W przypadku siłowników ma być 0
przycisk1.ChannelNumber = 4; //nr kanału przekaźnika
przycisk1.DurationMS = 0; //czas wlaczenia

button1 = digitalRead(0);
if(digitalRead(0)==LOW){ //tu dodajemy jeszcze raz zeby nie pstrykalo samo czyli przerwa i ponowne zapytanie
delay(100);

if(digitalRead(0)==LOW){ //sprawdzam 2 razy stan na PINie 16 w odstępach 100ms . bez tego było dużo zakłuceń
przycisk1.value[0] = !przycisk1.value[0];
SuplaDevice.channelSetValue(&przycisk1);
while(digitalRead(0)==LOW);
delay(20);
}

}}
//---------------------------------------------------------------------------------
// Supla.org ethernet layer
int supla_arduino_tcp_read(void *buf, int count) {
_supla_int_t size = client.available();
if ( size > 0 ) {
if ( size > count ) size = count;
return client.read((uint8_t *)buf, size);
};
return -1;
};

int supla_arduino_tcp_write(void *buf, int count) {
return client.write((const uint8_t *)buf, count);
};
bool supla_arduino_svr_connect(const char *server, int port) {
return client.connect(server, 2015);
}
bool supla_arduino_svr_connected(void) {
return client.connected();
}

void supla_arduino_svr_disconnect(void) {
client.stop();
}

void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {
// Serial.println("WiFi init");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
// Serial.print(".");
}
}

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
SuplaDeviceCallbacks cb;

cb.tcp_read = &supla_arduino_tcp_read;
cb.tcp_write = &supla_arduino_tcp_write;
cb.eth_setup = &supla_arduino_eth_setup;
cb.svr_connected = &supla_arduino_svr_connected;
cb.svr_connect = &supla_arduino_svr_connect;
cb.svr_disconnect = &supla_arduino_svr_disconnect;
cb.get_temperature = NULL; //&get_temperature;
cb.get_temperature_and_humidity = NULL;
cb.get_rgbw_value = NULL;
cb.set_rgbw_value = NULL;

return cb;
}
You do not have the required permissions to view the files attached to this post.

Return to “Pomoc”