Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение nick7zmail » Пн мар 12, 2018 11:41 am

Ох...чтож вы делаете то...существуют же циклы...for, while...зачем каждое реле то отдельно инициализировать...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение woow » Пн мар 12, 2018 11:57 am

Как в народе говорят "дурная голова рукам покоя не даёт"
ну а всё таки может и не совершенен, но работает и в начале было 4 реле, так практически copy+paste размножил до 8.
А как там с арай и форами не дорос ещё. Этот для меня уже достижение.
намучился пока web серверу mqtt а как теперь всё сломать и на циклы перейти, если не получится откажусь идеи о включении всех реле разом, чего уж там.
Raspberry Pi 3B+
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение alexsis_76 » Пн мар 12, 2018 3:24 pm

for(uint8_t i=2;i<=9;i++)
pinMode(i, OUTPUT);
и не обязательно писать int.
За это сообщение автора alexsis_76 поблагодарил:
woow (Пн мар 12, 2018 3:30 pm)
Рейтинг: 1.16%
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение woow » Пн мар 12, 2018 3:30 pm

после экспериментов и помощи тех кто больше меня понимает получился вот такой скетч. Теперь все реле управляется как отдельно так и разом с МД и отображается, но вот проблема с командами управления ALLRelays, команда по MQTT посылает статус только на PowerPanel/relayAll 1 или 0, а для правильности отображения нужно на все от PowerPanel/relay1 до PowerPanel/relay8 подсылал на сервер 0 или 1 соответственно. Может тыкнет кто пальчиком, а то весь вечер по ка без результатно.
СпойлерПоказать

Код: Выделить всё

*
connect to mqtt server, send and recive
Arduino Nano
W5100
HL-58S
*/

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
//#include <EEPROM.h>  

const int relay1 = 2;
const int relay2 = 3;
const int relay3 = 4;
const int relay4 = 5;
const int relay5 = 6;
const int relay6 = 7;
const int relay7 = 8;
const int relay8 = 9;

const int relayAll[] = { 2, 3, 4, 5, 6, 7, 8, 9 };    
int pinCount = 9;                                     

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 1, 140 };
byte ip[]     = { 192, 168, 1, 132 };

void callback(char* topic, byte* payload, unsigned int length) 
{
  int r,hl;
  Serial.print("  Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  
////****///

  char receivedChar = (char)payload[0];
  Serial.print(receivedChar);
  if(receivedChar=='1')
    hl = LOW;
    else
    hl = HIGH;  
       if(String(topic)=="PowerPanel/relay1")
    r = relay1;
  else if(String(topic)=="PowerPanel/relay2")
    r = relay2;
  else if(String(topic)=="PowerPanel/relay3")
    r = relay3;
  else if(String(topic)=="PowerPanel/relay4")
    r = relay4;
  else if(String(topic)=="PowerPanel/relay5")
    r = relay5;
  else if(String(topic)=="PowerPanel/relay6")
    r = relay6;
  else if(String(topic)=="PowerPanel/relay7")
    r = relay7;
  else if(String(topic)=="PowerPanel/relay8")
    r = relay8;
  else if(String(topic)=="PowerPanel/relayAll")     
   r = 255;                                
else
  r = relay1;

if (r == 255)
  for (byte i = 0; i < pinCount - 1; i++)
    digitalWrite(relayAll[i], hl);
else
  digitalWrite(r, hl);    
   
}

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void reconnect() 
{
 // Loop until we're reconnected
  while (!client.connected()) 
 {
    Serial.println(" Attempting MQTT connection...");
 // Attempt to connect
    if (client.connect("arduinoPowerPanel")) 
        {
        Serial.println("connected");
        }
        else 
        {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          delay(5000);
        }    
  }
}

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  pinMode(relay5, OUTPUT);
  pinMode(relay6, OUTPUT);
  pinMode(relay7, OUTPUT);
  pinMode(relay8, OUTPUT);

  
  if (client.connect("arduinoPowerPanel")) 
   {
    Serial.print("online");
    client.publish("PowerPanel/relay1", "1");
    client.subscribe("PowerPanel/relay1");
    client.publish("PowerPanel/relay2", "1");
    client.subscribe("PowerPanel/relay2");
    client.publish("PowerPanel/relay3", "1");
    client.subscribe("PowerPanel/relay3");
    client.publish("PowerPanel/relay4", "1");
    client.subscribe("PowerPanel/relay4");
    client.publish("PowerPanel/relay5", "1");
    client.subscribe("PowerPanel/relay5");
    client.publish("PowerPanel/relay6", "1");
    client.subscribe("PowerPanel/relay6");
    client.publish("PowerPanel/relay7", "1");
    client.subscribe("PowerPanel/relay7");
    client.publish("PowerPanel/relay8", "1");
    client.subscribe("PowerPanel/relay8");
      client.publish("PowerPanel/relayAll", "1");
    client.subscribe("PowerPanel/relayAll");
    
    }
   }
}

void loop()
{
   if (!client.connected()) 
      {
       reconnect();
      }
  client.loop();
}

Raspberry Pi 3B+
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение Amarok » Вт мар 13, 2018 8:25 am

А этот скетч под esp8266+mqtt никто не портировал?
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение woow » Вт мар 13, 2018 9:53 am

Amarok писал(а):А этот скетч под esp8266+mqtt никто не портировал?
Подобных под ESP8266 с MQTT решений множество и здесь тема как раз не о ESP8266, поскольку вся изюминка в том что это проводной вариант, ненужна WiFi сеть и все исходящие из этого проблемы и последствие.
Raspberry Pi 3B+
vovankin
Сообщения: 20
Зарегистрирован: Пн окт 22, 2018 5:30 pm
Откуда: Сургут
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение vovankin » Чт ноя 29, 2018 7:12 pm

Всех приветствую.
Я начинающий.

Скейч автора не компелиться.
Пишет ошибку "was not declared in this scope"
Пробовал разные версии IDE от 1.0.1 до крайней 1.8.7 результат один.
В скейче - контролер - когда закоментируешь то что связано с датчиками температуры, компилиться.
В скейче - где контроллер вэб сервер коментируешь то что касается температуры - начинает ругаться на вспомогательные команды типа статус выходов и т.п. Конкретно на "commandsHelp"
Перечитал кучу страниц форумов - ответап не нашел. Поиск также.
Может какие то особые библиотеки надо использовать?
Использую те что по умолчанию+плюс то что мастер установки библиотек ставит сам.
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение woow » Пн дек 10, 2018 5:32 pm

этот скечь "растянул" до 16 реле на Arduino Nano с W5100, но увы не получилось с двумя выводами D0 и D1 (иначе как Rx и Tx), скечь другой эти выводы рабочие как и все цифровые, а как только загружаю этот сразу же и отключаются, скорей всего какая то библиотека использует эти регистры, ну тогда управлять можно и 14 реле.
И есть ещё проблема при первом запуске почему-то не отрабатываются команды и на сериал мониторе они не видны, после двух -трёх нажатий начинает работать, дальше без глюков, но всё ровно так не годится MQTT команда отослана а результата нет, может кто профессиональном взглядом видит эту проблему.
тут укороченный скечь на одну реле для рассмотрения и наглядности:
СпойлерПоказать

Код: Выделить всё

/*
connect to mqtt server, send and recive
Arduino Nano
W5100
HL-58S
*/

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>  

const int relay1 = 2; 

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 1, 123 };
byte ip[]     = { 192, 168, 1, 32 };

void callback(char* topic, byte* payload, unsigned int length) 
{
  int r,hl;
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
////****///
  char receivedChar = (char)payload[0];
  Serial.print(receivedChar);
  if(receivedChar=='1')
    hl = LOW;
    else
    hl = HIGH;  
       if(String(topic)=="PowerPanel/relay1")
    r = relay1;
	//back;
   
  digitalWrite(r, hl); 
  Serial.println();
}

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void reconnect() 
{
 // Loop until we're reconnected
  while (!client.connected()) 
 {
    Serial.println("Attempting MQTT connection...");
 // Attempt to connect
    if (client.connect("arduinoPowerPanel")) 
        {
        Serial.println("connected");
        }
        else 
        {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          delay(5000);
        }
  }
}

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  
  pinMode(relay1, OUTPUT);
 
  
  if (client.connect("arduinoPowerPanel")) 
   {
    Serial.print("online");
    client.publish("PowerPanel/relay1", "1");
    client.subscribe("PowerPanel/relay1");
    	   }
}

void loop()
{
   if (!client.connected()) 
      {
       reconnect();
      }
  client.loop();
}

здесь полный скечь:
СпойлерПоказать

Код: Выделить всё

/*
connect to mqtt server, send and recive
Arduino Nano
W5100
HL-58S
*/

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>  

const int relay1 = 0; // This output not working properly, why , i don't know :(
const int relay2 = 1; // This output not working properly, why , i don't know :(
const int relay3 = 2;
const int relay4 = 3;
const int relay5 = 4;
const int relay6 = 5;
const int relay7 = 6;
const int relay8 = 7;
const int relay9 = 8;
const int relay10 = 9;
const int relay11 = A0;
const int relay12 = A1;
const int relay13 = A2;
const int relay14 = A3;
const int relay15 = A4;
const int relay16 = A5;

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 1, 123 };
byte ip[]     = { 192, 168, 1, 32 };

void callback(char* topic, byte* payload, unsigned int length) 
{
  int r,hl;
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
////****///
  char receivedChar = (char)payload[0];
  Serial.print(receivedChar);
  if(receivedChar=='1')
    hl = LOW;
    else
    hl = HIGH;  
       if(String(topic)=="PowerPanel/relay1")
    r = relay1;
  else if(String(topic)=="PowerPanel/relay2")
    r = relay2;
  else if(String(topic)=="PowerPanel/relay3")
    r = relay3;
  else if(String(topic)=="PowerPanel/relay4")
    r = relay4;
  else if(String(topic)=="PowerPanel/relay5")
    r = relay5;
  else if(String(topic)=="PowerPanel/relay6")
    r = relay6;
  else if(String(topic)=="PowerPanel/relay7")
    r = relay7;
  else if(String(topic)=="PowerPanel/relay8")
    r = relay8;
  else if(String(topic)=="PowerPanel/relay9")
    r = relay9;
  else if(String(topic)=="PowerPanel/relay10")
    r = relay10;
  else if(String(topic)=="PowerPanel/relay11")
    r = relay11;
  else if(String(topic)=="PowerPanel/relay12")
    r = relay12;
  else if(String(topic)=="PowerPanel/relay13")
    r = relay13;
  else if(String(topic)=="PowerPanel/relay14")
    r = relay14;
  else if(String(topic)=="PowerPanel/relay15")
    r = relay15;
  else if(String(topic)=="PowerPanel/relay16")
    r = relay16;
  else
    r = relay1;
	//back;
   
  digitalWrite(r, hl); 
  Serial.println();
}

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void reconnect() 
{
 // Loop until we're reconnected
  while (!client.connected()) 
 {
    Serial.println("Attempting MQTT connection...");
 // Attempt to connect
    if (client.connect("arduinoPowerPanel")) 
        {
        Serial.println("connected");
        }
        else 
        {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          delay(5000);
        }
  }
}

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  pinMode(relay5, OUTPUT);
  pinMode(relay6, OUTPUT);
  pinMode(relay7, OUTPUT);
  pinMode(relay8, OUTPUT);
  pinMode(relay9, OUTPUT);
  pinMode(relay10, OUTPUT);
  pinMode(relay11, OUTPUT);
  pinMode(relay12, OUTPUT);
  pinMode(relay13, OUTPUT);
  pinMode(relay14, OUTPUT);
  pinMode(relay15, OUTPUT);
  pinMode(relay16, OUTPUT);    
  
  if (client.connect("arduinoPowerPanel")) 
   {
    Serial.print("online");
    client.publish("PowerPanel/relay1", "1");
    client.subscribe("PowerPanel/relay1");
    client.publish("PowerPanel/relay2", "1");
    client.subscribe("PowerPanel/relay2");
    client.publish("PowerPanel/relay3", "1");
    client.subscribe("PowerPanel/relay3");
    client.publish("PowerPanel/relay4", "1");
    client.subscribe("PowerPanel/relay4");
    client.publish("PowerPanel/relay5", "1");
    client.subscribe("PowerPanel/relay5");
    client.publish("PowerPanel/relay6", "1");
    client.subscribe("PowerPanel/relay6");
    client.publish("PowerPanel/relay7", "1");
    client.subscribe("PowerPanel/relay7");
    client.publish("PowerPanel/relay8", "1");
    client.subscribe("PowerPanel/relay8");
    client.publish("PowerPanel/relay9", "1");
    client.subscribe("PowerPanel/relay9");
    client.publish("PowerPanel/relay10", "1");
    client.subscribe("PowerPanel/relay10");
    client.publish("PowerPanel/relay11", "1");
    client.subscribe("PowerPanel/relay11");
    client.publish("PowerPanel/relay12", "1");
    client.subscribe("PowerPanel/relay12");
    client.publish("PowerPanel/relay13", "1");
    client.subscribe("PowerPanel/relay13");
    client.publish("PowerPanel/relay14", "1");
    client.subscribe("PowerPanel/relay14");
    client.publish("PowerPanel/relay15", "1");
    client.subscribe("PowerPanel/relay15");
    client.publish("PowerPanel/relay16", "1");
    client.subscribe("PowerPanel/relay16");	
	   }
}

void loop()
{
   if (!client.connected()) 
      {
       reconnect();
      }
  client.loop();
}
За это сообщение автора woow поблагодарили (всего 2):
vovankin (Пт дек 21, 2018 7:18 pm) • deemjd (Вс дек 30, 2018 2:22 pm)
Рейтинг: 2.33%
Raspberry Pi 3B+
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение nick7zmail » Вт дек 11, 2018 8:47 am

rx и tx это SPI интерфейс. Чтобы пользоваться как цифровыми - надо отключить вывод в сериал
Убираем это
#include <SPI.h>
Serial.begin(9600);
и всё что с этим связано.
За это сообщение автора nick7zmail поблагодарил:
woow (Вт дек 11, 2018 1:35 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Bzdenchik
Сообщения: 9
Зарегистрирован: Вт ноя 20, 2018 11:11 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение Bzdenchik » Пт дек 14, 2018 1:34 pm

У меня код работает, но очень часто зависает контроллер.
Сначала отваливается сериал, потом контроллер перестает реагировать на сообщения брокера mqtt.
При этом пинги ходят всегда исправно.
Кто-нибудь сталкивался с такой проблемой?

P.S. нагуглил что этот косяк может быть связан с библиотекой PubSubClient и её зависанием из за получения нескольких сообщений разом.
Советуют переходить на асинхронный клиент, но я в этом ни бум бум, к сожалению.((
Ответить