Dotaz na změnu programu

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
gamacek
Příspěvky: 5
Registrován: 24 čer 2020, 19:38
Reputation: 0

Dotaz na změnu programu

Příspěvek od gamacek » 24 čer 2020, 19:47

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.

Uživatelský avatar
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

Příspěvek od pavel1tu » 25 čer 2020, 06:46

Musí se definovat další pin který to bude ovládat

Kód: Vybrat vše

int HeatingPin = 15;
int ChlazeniPin = xx; //na který pin dáš druhé relé
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

Kód: Vybrat vše

void callback
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á

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);
         }
    }
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 ;)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

gamacek
Příspěvky: 5
Registrován: 24 čer 2020, 19:38
Reputation: 0

Re: Dotaz na změnu programu

Příspěvek od gamacek » 25 čer 2020, 16:34

Děkuji moc za pomoc. Obě relé fungují.

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();
}
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.
IMG_20200625_162520_1.jpg

gamacek
Příspěvky: 5
Registrován: 24 čer 2020, 19:38
Reputation: 0

Re: Dotaz na změnu programu

Příspěvek od gamacek » 25 čer 2020, 19:16

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í.
IMG_20200625_191045.jpg

Uživatelský avatar
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

Příspěvek od pavel1tu » 25 čer 2020, 20:11

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 ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

gamacek
Příspěvky: 5
Registrován: 24 čer 2020, 19:38
Reputation: 0

Re: Dotaz na změnu programu

Příspěvek od gamacek » 25 čer 2020, 21:28

Ří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.
IMG_20200625_211751.jpg

gamacek
Příspěvky: 5
Registrován: 24 čer 2020, 19:38
Reputation: 0

Re: Dotaz na změnu programu

Příspěvek od gamacek » 26 čer 2020, 15:55

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ě.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 15 hostů