esp8266-01s + LCD1602A + DS18B20 + SUPLA

NEW
Posty: 28
Rejestracja: czw kwie 15, 2021 5:28 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ą.
NEW
Posty: 28
Rejestracja: czw kwie 15, 2021 5:28 pm

LCD1602A
LCD1602A
lcd1602.jpg (1 MiB) Przejrzano 1500 razy
Awatar użytkownika
QLQ
Posty: 2278
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

NEW pisze: czw kwie 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
Posty: 28
Rejestracja: czw kwie 15, 2021 5:28 pm

QLQ pisze: czw kwie 15, 2021 6:39 pm
NEW pisze: czw kwie 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.
Awatar użytkownika
QLQ
Posty: 2278
Rejestracja: ndz wrz 03, 2017 9:13 am
Lokalizacja: Koszalin

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
Posty: 28
Rejestracja: czw kwie 15, 2021 5:28 pm

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.
Awatar użytkownika
shimano73
Posty: 1976
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

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
Posty: 28
Rejestracja: czw kwie 15, 2021 5:28 pm

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);
//----------------------------------------------------------
}
Awatar użytkownika
klew
Posty: 8289
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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.
Widzimy się na Supla Offline Party vol. 2 :!:
NEW
Posty: 28
Rejestracja: czw kwie 15, 2021 5:28 pm

klew pisze: sob kwie 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;
}
Załączniki
esp01s_test.jpg
esp01s_test.jpg (551.07 KiB) Przejrzano 1366 razy
ODPOWIEDZ

Wróć do „Pomoc”