Перейти к публикации
iT4iT.CLUB

Рекомендованные сообщения

В общем тяга к автоматике давно у меня в оном месте свербит а в городской однушке много не автоматизируеш . С подачи уважаемого Kitsum узнал о преимуществах MQTT перед мускулом и родилась идея контроля качества воздуха с заменой оного в жилище (после 9го мая с утра это особенно актуально) Собрал из аргалита коробку и обклеил стеклотканью на эпоксидной смоле внутри и снаружи  ,поместил туда центробежный вентилятор (фоток нет так как я заклеил его в коробке раньше чем мысль оставить на память потомкам образ этого агрегата посетила меня) вклеил прямоугольные воздуховоды и модернизированные обратные клапана клапана . Клапана изготовил очень легко . До этого месяца два ждал с али потшипники и думал схему как этот самый клапан я сделаю но купив стандартные обратки понял что тут особо думать не нужно отрезав с одной стороны ось на которой качается запирающий лепесток я на это место поместил качалку из комплекта сервопривода . Рычаги кочалки распилены пополам так чтобы обеими своими концами захватывали лепесток а в корпусе клапана грубо прожжена дырень паяльником куда входит серва и вставляется в штатную качалку а чтобы серва держалась на корпусе применил холодную сварку из автомагазина , причем эта холодная сварка держит весь этот пластик не хуже горячей , покрайней мере когда я понял свой косяк (разместил под разными углами сервы ) и попытался оторвать серву от корпуса, мне это удалось далеко не сразу хотя дядька я не маленький. Ну в общем получилось то что получилось , агрегат вроде интересный но без мозгов... ESP8266 а точнее  NodeMcu ESP12e которая валялась у меня с незапамятных времен была призвана частично решить этот недостаток, прикрутил реле на включение мотора вытяжки а также добавил два датчика DHT22 для измерения температуры и влажности в помещении и за стенкой где расположена ванная и началась глубоко интелектуальная работа по поиску и копипаста чужого кода .после пары безсонных ночей на свет был рожден некий франкинштейн которого Kitsum безжалостно унизил и уничтожил родив при этом код в котором я тоже поучавствовал добавив пароль, имя точки и адрес сервера ! В общем теперь это полноценный умный агрегат который шевелит клапанами и включает мотор в зависимости от данных MQTT. А собственно чего я добиваюсь ? Малинка едет , едет датчик CJMCU-811 CCS811 для определения количества выпитого на днях витаемого в воздухе , проломлена стена куда помещен и запенян воздуховод (создание фильтра очитки воздуха , запирания и подогрева в скором времени тоже будет изложено сдесь)

 

 

лепесток.jpg

качалка.jpg

клапан.jpg

Изменено пользователем svchekalin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все конечно убого но все будет скрыто от посторонних глаз так что особо внешним видом не парюсь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот и все уважаемые , первая часть марлезонского балета окончена . Часть проекта по созданию автоматического регулирования микроклимата под названием умная вытяжка считаю оконченным.

И так , немного по эксперементировав стало понятно что датчики dht-22 никуда не годятся , разница в показаниях двух лежащих рядом просто чудовищная и от оных решено отказаться в пользу bme-280 . Было заказано аж три и до кучи ccs-811 (прилетели достаточно быстро всего пару недель) два bme-280 управляются контроллером вытяжки а два других датчика будут принимать участие в дальнейшем развитии проекта по контролю домашнего микроклимата. В общем данные пересылаются в mqtt а оттуда обрабатываются мощнейшей софтинкой на андроид по имени tasker (подробней о возможностях чудо софта https://xakep.ru/2014/05/25/tasker-full-using/) и плагина к нему mqtt client . На данный момент имеются гибко настраиваемые действия по событию будь то сообщение в топике или голосовая команда. Скетч с разрешения уважаемого kitsum прикладываю.

Скрытый текст

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>
#include <Wire.h>
#include <BME280I2C.h> // https://github.com/finitespace/BME280
/* Настройки подключения d1 white d2 black*/
String ssid   = "точка достура";
String pass   = "пароль точки доступа";
String server = "ip адрес mqtt";
String device = "AirPump"; // Обязательно уникальное имя для каждого MQTT клиента
/* Сетевой клиент */
WiFiClient espClient;
PubSubClient client(espClient);
/* Сервы */
Servo myservo1;
Servo myservo2;
/* Таймеры */
uint32_t timer_bme = 0;
/* BME */
BME280I2C::Settings
settings1(
  BME280::OSR_X1,
  BME280::OSR_X1,
  BME280::OSR_X1,
  BME280::Mode_Forced,
  BME280::StandbyTime_1000ms,
  BME280::Filter_Off,
  BME280::SpiEnable_False,
  BME280I2C::I2CAddr_0x76
),
settings2(
  BME280::OSR_X1,
  BME280::OSR_X1,
  BME280::OSR_X1,
  BME280::Mode_Forced,
  BME280::StandbyTime_1000ms,
  BME280::Filter_Off,
  BME280::SpiEnable_False,
  BME280I2C::I2CAddr_0x77
);
BME280I2C BME1(settings1), BME2(settings2);

void setup() {
  /* Serial */
  Serial.begin(115200);
  /* i2c scaner */
  Wire.begin(4, 5);
  i2c_scaner();
  /* Сервы */
  myservo1.attach(14); myservo1.write(170);
  myservo2.attach(12); myservo2.write(103);
  /* Нагрузка*/
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  /* BME */
  BME1.begin();
  BME2.begin();
  /* Режим клиента */
  WiFi.setAutoConnect(true);
  WiFi.setAutoReconnect(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid.c_str(), pass.c_str());
  /* Подключаемся */
  while(!WiFi.isConnected()) {
    delay(500);
    Serial.print('.');
  } Serial.print("!\r\n");
  /* Подключаемся к брокеру */
  client.setServer(server.c_str(), 1883);
  client.setCallback(callback);
}

void loop() {
  client.loop();
  if (client.connected()) {
    /* Тут можно что-то свое слепить */
    
    /* Отправка показаний с сенсоров каждые 10 секунд */
    uint32_t currentTime = millis();
    if (currentTime - timer_bme > 10000 or currentTime < timer_bme) {
      /* BME */
      float humidity, temperature;
      
      temperature = BME1.temp(BME280::TempUnit_Celsius);
      humidity = BME1.hum();
      if (!isnan(humidity) and !isnan(temperature)) {
        mqttsend("bme1/humidity",    humidity);
        mqttsend("bme1/temperature", temperature);
      } else Serial.println("Ошибка данных полученых от BME 1");

      temperature = BME2.temp(BME280::TempUnit_Celsius);
      humidity = BME2.hum();
      if (!isnan(humidity) and !isnan(temperature)) {
        mqttsend("bme2/humidity",    humidity);
        mqttsend("bme2/temperature", temperature);
      } else Serial.println("Ошибка данных полученых от BME 2");
      
      /* Обновляем таймер */
      timer_bme = millis();
    }
  } else reconnect();
}

void reconnect() {
  while (!client.connected()) {
    if (!device.length()) device = WiFi.hostname();
    if (client.connect(device.c_str())) {
      /* На какие топики подписаться */
      client.subscribe((device + "/control/#").c_str());
      Serial.printf("Оформлена подписка: %s\r\n", (device + "/control/#").c_str());
    } else {
      Serial.printf("Подключение не удалось, ошибка %d. Повтор через 5 секунд\r\n", client.state());
      delay(5000);
    } 
  }
}

void callback(char *gtopic, byte *payload, unsigned int length) {
  String msg;
  for (unsigned int i = 0; i < length; i++) msg += (char)payload;
  Serial.printf("\r\nСообщение[%s]: %s ", gtopic, msg.c_str());
  /* Тут обрабатываются команды */
  if (find(gtopic, "gpio13")) gpio(13, msg, "on", "off", LOW, HIGH);
  else if (find(gtopic, "servo1")) servo(myservo1, msg, "open", "close", 80, 170);
  else if (find(gtopic, "servo2")) servo(myservo2, msg, "open", "close", 18, 103);
  else Serial.print("Топик не поддерживается");
}

void gpio(byte port, String msg, const char *c1, const char *c2, bool st1, bool st2) {
  if (msg == c1) digitalWrite(port, st1);
  else if (msg == c2) digitalWrite(port, st2);
  else Serial.print("Команда не поддерживается");
}

void servo(Servo s, String msg, const char *c1, const char *c2, byte g1, byte g2) {
  if (msg == c1) s.write(g1); 
  else if (msg == c2) s.write(g2);
  else Serial.print("Команда не поддерживается");
}

bool find(char *gtopic, char *topic) { 
  return (String(gtopic) == (device + "/control/" + topic));
}

void mqttsend(String subtopic, int32_t message)  { mqttsend(subtopic, String(message)); }
void mqttsend(String subtopic, uint32_t message) { mqttsend(subtopic, String(message)); }
void mqttsend(String subtopic, float message)    { mqttsend(subtopic, String(message)); }
void mqttsend(String subtopic, String message)   { client.publish((device + "/" + subtopic).c_str(), message.c_str()); }

void i2c_scaner() {
  byte count = 0;
  Serial.println("Scanning...");
  for (byte address = 1; address < 127; address++) {
      Wire.beginTransmission(address);
      byte status = Wire.endTransmission();
      if (status == 0) {
        Serial.print("I2C device found at address ");
        Serial.println(address, HEX);
        ++count;
      } else if (status == 4) {
        Serial.print("Unknow error at address ");
        Serial.println(address, HEX);
      }
  }
  if (!count) Serial.println("No I2C devices found");
  Serial.println("done\n");
}

 


Screenshot_2018-06-28-13-20-55-865_com.thn.iotmqttdashboard.png Screenshot_2018-06-28-13-20-44-147_com.thn.iotmqttdashboard.png Screenshot_2018-06-28-13-22-58-819_com.miui.home.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа



Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...