Увеличить количество подключенных устройств esp8266?

filon543

New member
Подскажите пожалуйста, как увеличить количество подключаемых датчиков(ds18b20 или ...) и исполняемых устройств(Светодиод, реле, ....)??? Я совсем не программист, а с железом я разберусь.
Спасибо !
ДОПОЛНЕНИЕ:
Думаю надо пояснить свой вопрос: Я приложил скейтч в котором надо что то добавить(я в программировании ....),ч тоб можно было подключить хотя бы 2, 3, 4 светика или реле(симисторы)и как то разделять показания для mqtt для разных ds18b20 (я знаю о том что их на одну шину можно цеплять много), но вот со скейтчем у меня проблема. Помогите, кому не сложно?
 

Вложения

Последнее редактирование:

nikolz

Well-known member
Подскажите пожалуйста, как увеличить количество подключаемых датчиков(ds18b20 или ...) и исполняемых устройств(Светодиод, реле, ....)??? Я совсем не программист, а с железом я разберусь.
Спасибо !
датчики DS18B20 паяются на три провода и подключаются к оному пину. Число любое (разумное)
Реле лучше заменять на симисторы (лучше в смысле управления мощностью нагрузки)
увеличить с помощью расширителя портов ввода-вывода, например PCF8574,
либо сдвиговым регистром с защелкой например 74HC595
 

=AK=

New member
Подскажите пожалуйста, как увеличить количество подключаемых датчиков(ds18b20 или ...)
Заведите шину I2C, на это понадобится 2 пина. К этой шине можете подключать расширители ввода-вывода, АЦП, мастер шины 1-wire (например, DS2482-100) и т.д и т.п.
 

filon543

New member
Подскажите пожалуйста, как увеличить количество подключаемых датчиков(ds18b20 или ...) и исполняемых устройств(Светодиод, реле, ....)??? Я совсем не программист, а с железом я разберусь.
Спасибо !
Думаю надо пояснить свой вопрос: Я приложил скейтч в котором надо что то добавить(я в программировании ....),ч тоб можно было подключить хотя бы 2, 3, 4 светика или реле(симисторы)и как то разделять показания для mqtt для разных ds18b20 (я знаю о том что их на одну шину можно цеплять много), но вот со скейтчем у меня проблема. Помогите, кому не сложно?
 

filon543

New member
датчики DS18B20 паяются на три провода и подключаются к оному пину. Число любое (разумное)
Реле лучше заменять на симисторы (лучше в смысле управления мощностью нагрузки)
увеличить с помощью расширителя портов ввода-вывода, например PCF8574,
либо сдвиговым регистром с защелкой например 74HC595
Думаю надо пояснить свой вопрос: Я приложил скейтч в котором надо что то добавить(я в программировании ....),ч тоб можно было подключить хотя бы 2, 3, 4 светика или реле(симисторы)и как то разделять показания для mqtt для разных ds18b20 (я знаю о том что их на одну шину можно цеплять много), но вот со скейтчем у меня проблема. Помогите, кому не сложно?
 

filon543

New member
датчики DS18B20 паяются на три провода и подключаются к оному пину. Число любое (разумное)
Реле лучше заменять на симисторы (лучше в смысле управления мощностью нагрузки)
увеличить с помощью расширителя портов ввода-вывода, например PCF8574,
либо сдвиговым регистром с защелкой например 74HC595
Думаю надо пояснить свой вопрос: Я приложил скейтч в котором надо что то добавить(я в программировании ....),ч тоб можно было подключить хотя бы 2, 3, 4 светика или реле(симисторы)и как то разделять показания для mqtt для разных ds18b20 (я знаю о том что их на одну шину можно цеплять много), но вот со скейтчем у меня проблема. Помогите, кому не сложно?
 

filon543

New member
Код:
// Светодиод подлкючен к 5 пину
// Датчик температуры ds18b20 к 2 пину

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const char *ssid =  "AIRPORT";  // Имя вайфай точки доступа
const char *pass =  "PASSWORD"; // Пароль от точки доступа

const char *mqtt_server = "server"; // Имя сервера MQTT
const int mqtt_port = 11140; // Порт для подключения к серверу MQTT
const char *mqtt_user = "Login"; // Логи от сервер
const char *mqtt_pass = "Pass"; // Пароль от сервера

#define BUFFER_SIZE 100

bool LedState = false;
int tm=300;
float temp=0;

// Функция получения данных от сервера

void callback(const MQTT::ublish& pub)
{
  Serial.print(pub.topic());   // выводим в сериал порт название топика
  Serial.print(" => ");
  Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных

  String payload = pub.payload_string();

  if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные
  {
  int stled = payload.toInt(); // преобразуем полученные данные в тип integer
  digitalWrite(5,stled);  //  включаем или выключаем светодиод в зависимоти от полученных значений данных
  }
}



WiFiClient wclient;   
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup() {

  sensors.begin();
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  pinMode(5, OUTPUT);
}

void loop() {
  // подключаемся к wi-fi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if (client.connect(MQTT::Connect("arduinoClient2")
                         .set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Connected to MQTT server");
        client.set_callback(callback);
        client.subscribe("test/led"); // подписывааемся по топик с данными для светодиода
      } else {
        Serial.println("Could not connect to MQTT server"); 
      }
    }

    if (client.connected()){
      client.loop();
      TempSend();
  }

}
} // конец основного цикла


// Функция отправки показаний с термодатчика
void TempSend(){
  if (tm==0)
  {
  sensors.requestTemperatures();   // от датчика получаем значение температуры
  float temp = sensors.getTempCByIndex(0);
  client.publish("test/temp",String(temp)); // отправляем в топик для термодатчика значение температуры
  Serial.println(temp);
  tm = 300;  // пауза меду отправками значений температуры  коло 3 секунд
  }
  tm--;
  delay(10);
}
 

nikolz

Well-known member
Думаю надо пояснить свой вопрос: Я приложил скейтч в котором надо что то добавить(я в программировании ....),ч тоб можно было подключить хотя бы 2, 3, 4 светика или реле(симисторы)и как то разделять показания для mqtt для разных ds18b20 (я знаю о том что их на одну шину можно цеплять много), но вот со скейтчем у меня проблема. Помогите, кому не сложно?
Не сложно - это как?
Чтобы сделать всего много надо заново разработать программу отладить ее и потом еще отвечать,
что куда вставлять толпе халявщиков.
Ну и кто же такой дурной здесь есть?
 

filon543

New member
Не сложно - это как?
Чтобы сделать всего много надо заново разработать программу отладить ее и потом еще отвечать,
что куда вставлять толпе халявщиков.
Ну и кто же такой дурной здесь есть?
Не сложно-это я про тех кто в теме, для кого текст этого небольшого скейтча, как записка от жены чего купить в магазине(все понятно что купить и сколько) .
И прогу разрабатывать и проверять и отлаживать я не прошу, а прошу лиш указать на циклы которые нужно повторить в проге с изменениями(если я правильно понял прогу).
И "дурных", как ты выразился я думаю тут не много, а вот разбирающихся думаю много.
А таких "спецов" как ты я и не прошу помочь.
 

tretyakov_sa

Moderator
Команда форума
Подскажите пожалуйста, как увеличить количество подключаемых датчиков(ds18b20 или ...) и исполняемых устройств(Светодиод, реле, ....)??? Я совсем не программист, а с железом я разберусь.
Вот так попробуйте для DS18B20, замените свою функцию:
Код:
// Функция отправки показаний с термодатчика
void TempSend(){
  if (tm==0)
  {
  sensors.requestTemperatures();   // от датчика получаем значение температуры
   for (byte i = 0; i < sensors.getDeviceCount(); i++) {
  float temp = sensors.getTempCByIndex(i);
  String num;
  num += i;
  client.publish("test/temp"+num,String(temp)); // отправляем в топик для термодатчика значение температуры
  Serial.print("test/temp"+num+"= ");
  Serial.println(temp); 
  }
  tm = 300;  // пауза меду отправками значений температуры  коло 3 секунд
  }
  tm--;
  delay(10); 
}
 

filon543

New member
Вот так попробуйте для DS18B20, замените свою функцию:
Код:
// Функция отправки показаний с термодатчика
void TempSend(){
  if (tm==0)
  {
  sensors.requestTemperatures();   // от датчика получаем значение температуры
   for (byte i = 0; i < sensors.getDeviceCount(); i++) {
  float temp = sensors.getTempCByIndex(i);
  String num;
  num += i;
  client.publish("test/temp"+num,String(temp)); // отправляем в топик для термодатчика значение температуры
  Serial.print("test/temp"+num+"= ");
  Serial.println(temp);
  }
  tm = 300;  // пауза меду отправками значений температуры  коло 3 секунд
  }
  tm--;
  delay(10);
}
Спасибо вам за участие и помощь, но произошло только изменение топика на test/temp0 и все?
Я подключал 2 - DS18B20 на одну шину, передаются на MQTT сервер только показания одного и в топик test/temp0?
Если я правильно понял в вашем случае топики должны были с именами test/temp+1 в зависимости от количества подключенных датчиков?
Но этого не происходит?
 

tretyakov_sa

Moderator
Команда форума
Спасибо вам за участие и помощь, но произошло только изменение топика на test/temp0 и все?
Я подключал 2 - DS18B20 на одну шину, передаются на MQTT сервер только показания одного и в топик test/temp0?
Если я правильно понял в вашем случае топики должны были с именами test/temp+1 в зависимости от количества подключенных датчиков?
Но этого не происходит?
Я загрузил этот код:
Код:
// Светодиод подлкючен к 5 пину
// Датчик температуры ds18b20 к 2 пину

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const char *ssid =  "AIRPORT";  // Имя вайфай точки доступа
const char *pass =  "PASSWORD"; // Пароль от точки доступа

const char *mqtt_server = "server"; // Имя сервера MQTT
const int mqtt_port = 11140; // Порт для подключения к серверу MQTT
const char *mqtt_user = "Login"; // Логи от сервер
const char *mqtt_pass = "Pass"; // Пароль от сервера

#define BUFFER_SIZE 100

bool LedState = false;
int tm=300;
float temp=0;

// Функция получения данных от сервера

void callback(const MQTT::Publish& pub)
{
  Serial.print(pub.topic());   // выводим в сериал порт название топика
  Serial.print(" => ");
  Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных
 
  String payload = pub.payload_string();
 
  if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные
  {
  int stled = payload.toInt(); // преобразуем полученные данные в тип integer
  digitalWrite(5,stled);  //  включаем или выключаем светодиод в зависимоти от полученных значений данных
  }
}



WiFiClient wclient;     
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup() {
 
  sensors.begin();
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
  pinMode(5, OUTPUT);
}

void loop() {
  // подключаемся к wi-fi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if (client.connect(MQTT::Connect("arduinoClient2")
                         .set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Connected to MQTT server");
        client.set_callback(callback);
        client.subscribe("test/led"); // подписывааемся по топик с данными для светодиода
      } else {
        Serial.println("Could not connect to MQTT server");  
      }
    }

    if (client.connected()){
      client.loop();
      TempSend();
  }
 
}
} // конец основного цикла


// Функция отправки показаний с термодатчика
void TempSend(){
  if (tm==0)
  {
  sensors.requestTemperatures();   // от датчика получаем значение температуры
   for (byte i = 0; i < sensors.getDeviceCount(); i++) {
  float temp = sensors.getTempCByIndex(i);
  String num;
  num += i;
  client.publish("test/temp"+num,String(temp)); // отправляем в топик для термодатчика значение температуры
  Serial.print("test/temp"+num+"= ");
  Serial.println(temp);
    }
tm = 300;  // пауза меду отправками значений температуры  коло 3 секунд
  }
  tm--;
  delay(10); 
}
Все работает проверил:
upload_2018-4-11_23-25-38.png
 

filon543

New member
Приветствую! А теперь заработало, вы что то исправили? Спасибо вам огромное, кстати у вас очень интересный канал, подписался!
Знаете анекдот : Студент в деревне: Бабка дай пожалуйста воды попить, а то так жрать хочется аж но переночевать не где ....., а чем это я? аааа...
Может еще подскажете как еще один или два или .... светика(реле, ....) подключить?
Спасибо!
p.s. Странно, но вроде ничего не изменилось, а теперь работает??
 
Последнее редактирование:

filon543

New member
Не получается подсказать, как еще один или два или .... светика(реле, ....) подключить?
 
Сверху Снизу