Dotaz na změnu programu
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Dotaz na změnu programu
Dobrý den,
potřebuji od Vás pomoc.
Našel jsem program pro spínání relé za pomoci wemos d1 esp8266. Spínání je realizováno přes MQTT (Loxone - nodered - wemos).
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "xxxxxxxx";
const char* password = "xxxxxxx";
const char* mqtt_server = "10.0.0.27";
WiFiClient espClient;
PubSubClient client(espClient);
int HeatingPin = 15;
String switch1;
String strTopic;
String strPayload;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
strTopic = String((char*)topic);
if(strTopic == "ha/switch1")
{
switch1 = String((char*)payload);
if(switch1 == "ON")
{
Serial.println("ON");
digitalWrite(HeatingPin, HIGH);
}
else
{
Serial.println("OFF");
digitalWrite(HeatingPin, LOW);
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("arduinoClient")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.subscribe("ha/#");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup()
{
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(HeatingPin, OUTPUT);
digitalWrite(HeatingPin, HIGH);
}
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
}
Spínání 1 relé za pomocí tohoto programu (program je určen pro spínání 1 výstupu) je OK. Vše funguje. Moje otázka zní, jak upravit program, abych mohl spínat další relé (výstupy), tj. dvě relé samostatně.
Programovat bohužel neumím a tak budu rád za radu, popřípadě upravený program. Klidně si za to zaplatím. Velice děkuji.
potřebuji od Vás pomoc.
Našel jsem program pro spínání relé za pomoci wemos d1 esp8266. Spínání je realizováno přes MQTT (Loxone - nodered - wemos).
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "xxxxxxxx";
const char* password = "xxxxxxx";
const char* mqtt_server = "10.0.0.27";
WiFiClient espClient;
PubSubClient client(espClient);
int HeatingPin = 15;
String switch1;
String strTopic;
String strPayload;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
strTopic = String((char*)topic);
if(strTopic == "ha/switch1")
{
switch1 = String((char*)payload);
if(switch1 == "ON")
{
Serial.println("ON");
digitalWrite(HeatingPin, HIGH);
}
else
{
Serial.println("OFF");
digitalWrite(HeatingPin, LOW);
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("arduinoClient")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.subscribe("ha/#");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup()
{
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(HeatingPin, OUTPUT);
digitalWrite(HeatingPin, HIGH);
}
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
}
Spínání 1 relé za pomocí tohoto programu (program je určen pro spínání 1 výstupu) je OK. Vše funguje. Moje otázka zní, jak upravit program, abych mohl spínat další relé (výstupy), tj. dvě relé samostatně.
Programovat bohužel neumím a tak budu rád za radu, popřípadě upravený program. Klidně si za to zaplatím. Velice děkuji.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Dotaz na změnu programu
Musí se definovat další pin který to bude ovládat
Nemám to jak vyzkoušet(je to jen postrčení možná správným směrem), ale dle mne stačí jen ve funkci
zkopírovat, přejmenovat (třeba na switch2) tuto část kodu a vlořit pod tu část kodu switch1 ?
(pozor na závorky) odsadil jsem je - aby byla viditelná struktura co co dělá
PS: kod příště zadávej tlačítkem "</>", vyzkoušej to jestli to zvládneš, poradíme ti - není to složité a třeba budeš mít pěkný koníček
Kód: Vybrat vše
int HeatingPin = 15;
int ChlazeniPin = xx; //na který pin dáš druhé relé
Kód: Vybrat vše
void callback
(pozor na závorky) odsadil jsem je - aby byla viditelná struktura co co dělá
Kód: Vybrat vše
if(strTopic == "ha/switch2")
{
switch2 = String((char*)payload);
if(switch2 == "ON")
{
Serial.println("ON");
digitalWrite(ChlazeniPin, HIGH);
}
else
{
Serial.println("OFF");
digitalWrite(ChlazeniPin, LOW);
}
}
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Dotaz na změnu programu
Děkuji moc za pomoc. Obě relé fungují.
Vyvstal však ještě jeden problém. V okamžiku, kdy odpojím napájení a znovu ho připojím, tak program nenaběhne a nic se ovládat nedá.
Musím odpojit relé z pinu 13 a 15, zapojit napájení a po cca 1 sekundě připojit piny relé zpátky a vše funguje. Wemos se přihlásí do WIFI a skrz loxone - nodered(mqtt) jdou relé ovládat, ale jak je připojeno relé, tak se nic neděje.
Nějak má Wemos problém, že při připojení napájení jsou piny ve vysokém stavu a skrz cívku relé propojeny na GND (proud teče), když odpojím cívku relé, tak piny jsou při přivedení napájení ve vysokém stavu, ale ne proti GND (proud neteče) a tady bude kámen úrazu. Dají se tyto výstupy nějak ošetřit v programu? Jinak ještě jednou velice děkuji za pomoc.
Kód: Vybrat vše
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "xxxx";
const char* password = "xxxx";
const char* mqtt_server = "10.0.0.27";
WiFiClient espClient;
PubSubClient client(espClient);
int HeatingPin15 = 15;
int HeatingPin13 = 13;
String switch1;
String switch2;
String strTopic;
String strPayload;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
strTopic = String((char*)topic);
if(strTopic == "ha/switch1")
{
switch1 = String((char*)payload);
if(switch1 == "ON")
{
Serial.println("ON");
digitalWrite(HeatingPin15, LOW);
}
else
{
Serial.println("OFF");
digitalWrite(HeatingPin15, HIGH);
}
}
if(strTopic == "ha/switch2")
{
switch2 = String((char*)payload);
if(switch2 == "ON")
{
Serial.println("ON");
digitalWrite(HeatingPin13, HIGH);
}
else
{
Serial.println("OFF");
digitalWrite(HeatingPin13, LOW);
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("arduinoClient")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.subscribe("ha/#");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup()
{
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(HeatingPin15, OUTPUT);
digitalWrite(HeatingPin15, HIGH);
pinMode(HeatingPin13, OUTPUT);
digitalWrite(HeatingPin13, HIGH);
}
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
}
Musím odpojit relé z pinu 13 a 15, zapojit napájení a po cca 1 sekundě připojit piny relé zpátky a vše funguje. Wemos se přihlásí do WIFI a skrz loxone - nodered(mqtt) jdou relé ovládat, ale jak je připojeno relé, tak se nic neděje.
Nějak má Wemos problém, že při připojení napájení jsou piny ve vysokém stavu a skrz cívku relé propojeny na GND (proud teče), když odpojím cívku relé, tak piny jsou při přivedení napájení ve vysokém stavu, ale ne proti GND (proud neteče) a tady bude kámen úrazu. Dají se tyto výstupy nějak ošetřit v programu? Jinak ještě jednou velice děkuji za pomoc.
Re: Dotaz na změnu programu
Tak problém je někde v relé modulu. Na nepájivém poli jsem si sestavil vlastní relé modul a vše funguje parádně. Wemos nabíhá při každé obnově napájení.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Dotaz na změnu programu
No může to být spotřebou toho vstupu k relátkům ?
Některé relé moduly mi žraly na vstupu i 40mA nevím proč (je tam optočlen), přidal jsem odpůrek a bylo to.
Nic jiného mne nenapadá.
PS: čím to řídíš, tedy na čem to běží ? RPi ?
Některé relé moduly mi žraly na vstupu i 40mA nevím proč (je tam optočlen), přidal jsem odpůrek a bylo to.
Nic jiného mne nenapadá.
PS: čím to řídíš, tedy na čem to běží ? RPi ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Dotaz na změnu programu
Řídím to Loxonem (domácí automatizací). Za pomocí virtuálního výstupu, který posílá do Node-Red UDP příkaz s příkazem při zapnutí (ON) a vypnutí (OFF). Node-red a mosquitto běží na malině.
Plánuji inteligentní elektroinstalaci do nového domu. Zatím mám na stole zkušební rozvaděč a hraji si.
Plánuji inteligentní elektroinstalaci do nového domu. Zatím mám na stole zkušební rozvaděč a hraji si.
Re: Dotaz na změnu programu
Tak problém vyřešen. Původně jsem měl PINY ovládání relé na pinech Wemosu D7 a D8. Pin D7 má funkci MOSI a D8 10k pull-down a SS. Evidentně mu vadilo uzavření obvodu přes cívku na GND. V okamžiku, kdy jsem změnil PINY v programu na Wemosu a to konkrétně na D1 a D2, tak Wemos startuje s napojeným modulem parádně.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 9 hostů