Самодельный ардуино контролер отопления

Тема в разделе "Силовая электроника", создана пользователем mednagolov, 25 окт 2022.

  1. mednagolov

    mednagolov Гик

    Блин ослографа всётаки не хватает....
     
  2. mednagolov

    mednagolov Гик

    на слух этот пакет из пяти команд звучит прикольно....)) прямо как в молодости помню с магнитофона игрушки загружал в *МАГИК* ...)))
    ...ауди.касеты помню ходили по рукам.... жажевают пленку, то растянут.... да и магнитофон *РОМАНТИК* с ушатаным лентопротягом было ещё то веселье......когда в конце пи-пи- и-пи-пи и ПИ ЧЁ вам.ЗАГРУЗИЛОСЬ.....))))
    Короче по манитору порта пакет из 5 команд пролетает за 0,656 секунды.
    DIMDTMF фото1.PNG
     
  3. mednagolov

    mednagolov Гик

    Сейчас запишу телефоном то что пищит мне дуинка (через пьезодинамку) , сохраню как МР-3 файл, и попробую его аудио звонком через SIM8000 на дуинку загнать...по схеме
    DTMF схема.jpg
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Зачем Садо/мазо? Купите платку за 50 рублей и будет Вам Щастье! Тем более говорят что сегодня на Али какая то охрененская распродажа
     
  5. mednagolov

    mednagolov Гик

    О декоде после *подъёма трубки* дуинка в цикле с приходом первого высокого импульса каждые 6мс *слушает* прилетела ли 1 , если прилетела то в некую переменную длинной 8 знаков по порядку пишет 1, если не было пишет 0. и так 8 раз. если 10 мс был 0 то готовтися к принятию следующего *байта* ..и так три раза.
    Окончанием прослушивания 1длинее 45мс.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Да и если так сильно надо то можно уже освоить Esp32+Mqtt.
     
  7. Airbus

    Airbus Радиохулиган Модератор

    Ну или Blynk если уж совсем лень
     
  8. mednagolov

    mednagolov Гик

    так вроде в sim800 уже есть
    DTMF
     
  9. mednagolov

    mednagolov Гик

    И так двигаемся далие...
    блок промреле схематично думаю будет так
    модуль 4 рреле 3 входа.png
     
  10. mednagolov

    mednagolov Гик

    плата в Sprint-Layout 0.6
    плата промреле.JPG
     
  11. mednagolov

    mednagolov Гик

    Общая схема
    схема общая 380 v.jpg
     
  12. mednagolov

    mednagolov Гик

    Тут вот чаго думаю... Хочу новый котёл сварить ,а то действующему сейчас котлу 5 лет уже ...
    ТАК не воткнуть ли в электрокотел датчики от девятки? Ну да, конечно не ДАЛАСЫ - плюс минус пять градусов. Я думаю эта погрешность не сильно критична . Датчики ТМ106-10 для контроля температуры ( 150-1220 Ом ), и Датчик включения вентилятора TM108 (включается при 92-98 градусов). Примерно так-
    термозащита.jpg
     
  13. mednagolov

    mednagolov Гик

    Там с права от котла нарисовал *транзисторную развязку* , чтоб не на прямую на пин ардуинки подавать, только не соображу как правильно развязать... может можно ещё как то сделать ... ?
     
  14. mednagolov

    mednagolov Гик

    И конечно же немного фото...
    2022-11-26 11.19.04.jpg 2022-11-26 11.18.45.jpg 2022-11-26 11.18.07.jpg
     
  15. mednagolov

    mednagolov Гик

    Скетч пока такой, чёта забуксовал я со стрингами ... Хочу записывать и изменять что бы номер телефона можно было IK-пультом. только вот стринг не плюсуется в одиннадцати значное число, ( толи флеш памяти не хватает, толи у меня мозгов )
    IK-blok такой-
    Код (C++):
    // блок IRremote
    // проблема - стринг(ввод номера абанента)
      #include <SoftwareSerial.h>
         SoftwareSerial  mySerial(2, 3);  // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    //--- IRremote -----------
      #include <IRremote.h>
    int irPin = 4;
         IRrecv irReciver(irPin); // указываем вывод, к которому подключён приёмник
         decode_results results;
    //------ OLED --------------------
       #include <GyverOLED.h>
          GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
    //--------------------------
    //String s1 ("TELEFON");
    //String myString ;
    //int C =0;
    //int index =0;
    //int val =0;

    void setup() {
    // pinMode(LED_BUILTIN, OUTPUT);
      Serial.begin(9600);
      mySerial.begin(9600); // Скорость обмена данными с модемом
    irReciver.enableIRIn(); // запускаем приём
       oled.init();          // инициализация дисплея
    // заставка //
        oled.clear();       // очистка
      oled.setScale(2);   // масштаб текста (1..4)
      oled.setCursor(0, 3);       // курсор в 0,3
      oled.print("Atmeda328");
      delay(2000);
        oled.clear();       // очистка

    //-----
      Serial.println("Start!");    // пишем в монитор порта
        mySerial.println("AT");    //посылаем AT на SIM800

    //
    }

    void loop() {
      if (irReciver.decode(&results)) { // если данные пришли
        decodeIR(); // расшифровываем данные
        irReciver.resume(); // принимаем следующую команду
      //Serial.println( results.value, HEX ); // выводим данные
      delay(800);
    //index++;
    //oled.setCursor(0, 3);       // курсор в 0,3
    //  oled.print myString;
    // Serial.println(myString);    // пишем в монитор порта
    // Serial.println(myString);    // пишем в монитор порта
     
      }
    //myString + val;
    //delay(200);
    //val=0;

    }// //END LOOP ****

    // определяем значение нажатой клавиши
    void decodeIR() {
      switch (results.value)
      {
        case 0xFF9867:
          Serial.println("0");
          // val=0;
          break;
        case 0xFFA25D:
          Serial.println("1");
          //  val=1;
          break;
        case 0xFF629D:
          Serial.println("2");
            // val=2;
          break;
        case 0xFFE21D:
          Serial.println("3");
         // digitalWrite(LED_BUILTIN, HIGH);
            // val=3;
          break;
        case 0xFF22DD:
          Serial.println("4");
            //  val=4;
          break;
        case 0xFF02FD:
          Serial.println("5");
          break;
        case 0xFFC23D:
          Serial.println("6");
          break;
      case 0xFFE01F:
          Serial.println("7");
          //digitalWrite(LED_BUILTIN, LOW);
          break;
      case 0xFFA857:
          Serial.println("8");
          break;
      case 0xFF906F:
          Serial.println("9");
          break;
      case 0xFF18E7:
          Serial.println("UP");
          break;
      case 0xFF4AB5:
          Serial.println("DOWN");
          break;
      case 0xFF10EF:
          Serial.println("LEFT");
          break;
      case 0xFF5AA5:
          Serial.println("RAIT");
          break;
      case 0xFF38C7:
          Serial.println("OK");
          break;
      case 0xFF6897:
          Serial.println("*");
          break;
       case 0xFFB04F:
          Serial.println("#");
          break;
       }


    }//---- END decodeIR ----


    //
     
  16. mednagolov

    mednagolov Гик

    Скетч контролера пока такой. В принципе работает, * еденички* на ключи вроде правильно шлёт , далие нужно вставить блок для SIM800, и написать аварийные менюшки если конечно *памяти* хватит... а то уже 40 процентов нахуйдожничал.
    Код (C++):
    //SIM800_0 тест на ОК.
    // щлейф-1 = GND,VCC (+5),SCL,SDA,A3(DS18B20),4(IF приемник)
    // щлейф-2 = +12v gnd, 9,10,11,12 - выходы на ключи.
    // шлейф-3( входы ) =A0(уровень ТН предупреждение),A1(уровень ТН авария),
          //A2(перегрев котла)
    // 8- бипер, 6- кнопка на контр.
    // 2,3 - програмсериал. 7-резерв(не распаян).


    #include <SoftwareSerial.h>
    SoftwareSerial  mySerial(2, 3);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    #include <GyverOLED.h>
    GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;

    //** подкл.библиотеки для DS18B20 **
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS A3 //обьявляем ONE_WIRE_BUS к пину (A1)
    // Настройте oneWire для связи с любыми устройствами OneWire
    //  (а не только с микросхемами температуры Maxim / Dallas)
    OneWire oneWire(A3); // вход датчиков 18b20
    DallasTemperature ds(&oneWire);
    DeviceAddress sensor_pom = {0x28, 0xFF, 0x46, 0x9C, 0x30, 0x17, 0x3, 0x70};// адрес моего датчика
    //----    
    float T_OK =20;      // переменная для обработки
    float T_progr =28;  // тнмпература помещения в режиме прогрев
    float T_komf =26;  // тнмпература помещения в режиме комфорт
    float T_min=22;   // тнмпература помещения в режиме эконом
    float T_pom =0;  //переменная для температуры в помещении сейчас
    float d =0;     // дельта по температуре


    //**  
    uint32_t myTimer1 ,  myTimer2, myTimer3 ; // для таймера на millis()
    int sek=0;                   // секунда
    int mint=0;                 // минута
    int ch=0;                  // час
    int Ned=0 ;               // дни недели
    int s =0;        // рабочий тайм
    int T =0;
    //--
    int Alarm =0;  // переменная тревог
    int R =0;     // переменная выбора режима
    int M =0;    // переменная для меню        
    const int relay_3 = 12 ;     // третья мощность нагрева
    const int relay_2 = 11 ;    //  вторая мощность нагрева
    const int relay_1 = 10 ;   // первая мощность нагрева
    const int relay_Pomp = 9; // циркуляционный насос
    //const int bip = 8 ;         // зумер подключен к D8
    const int but_kontr =6;     // кнопка на контролере
    boolean F_but_kontr = false; // флаг кнопка на контролере
    //===
    void setup() {//**
      Serial.begin(9600);   // Скорость обмена данными с компьютером
    mySerial.begin(9600); // Скорость обмена данными с модемом
    oled.init();        // инициализация
    //--далас сетуп --
      ds.begin();            // инициализация термодатчика  DS18B20
            // устанавливаем разрешение датчика 11 бит (может быть 9, 10, 11, 12)
           // на точность измерения температуры показатель не влияет.
         ds.setResolution(sensor_pom , 11);
    //----
    pinMode(but_kontr, INPUT_PULLUP); // пин кнопки контролера
    pinMode(relay_1 ,OUTPUT); // выход 1кВт (ТЭН-1 + МЭН)
    pinMode(relay_2 ,OUTPUT); // выход 2кВт (ТЭН-1)
    pinMode(relay_3 ,OUTPUT); // выход 2кВт (ТЭН-2)
    pinMode(relay_Pomp ,OUTPUT); // выход помпа (циркул. насос)
    //pinMode(bip,OUTPUT);        //пин на бипер
    // заставка экран //
        oled.clear();       // очистка
      oled.setScale(2);   // масштаб текста (1..4)
      oled.setCursor(0, 3);       // курсор в 0,3
      oled.print("Atmeda328");
      delay(2000);
     
         oled.clear();
       oled.setCursor(0, 3);
       oled.print(" ТЕСТ- ОК !");
    //        tone(bip,1500,300);
    delay(2000);
       oled.clear();
    //---- контрол SIM800
      Serial.println("Start!");    // пишем в монитор порта
        mySerial.println("AT");    //посылаем AT на SIM800

    }//**СТОП СЕТ **
    void loop() {//***
    //--сериал порт --
      if ( mySerial.available())           // Ожидаем прихода данных (ответа) от модема...
        Serial.write( mySerial.read());    // ...и выводим их в Serial
      if (Serial.available())           // Ожидаем команды по Serial...
         mySerial.write(Serial.read());    // ...и отправляем полученную команду модему
    //----

    //** таймер часов **
    if (millis() - myTimer1 >= 1000  )    // таймер на millis()
    {  myTimer1 = millis();  sek++;  s++;}
    if (sek>=60){mint++; sek=0;}            //считает секунды
    if (mint>=60){ch++; mint=0;}           // считает минуты
    if (ch>=24){ch=0; Ned++ ;}            // считает часы
    if (Ned > 7){Ned = 0;}
    //if (s > 10){s = 0;}
    //----
    //** работа с датчиком температуры **
    if (millis() - myTimer3 >= 5000  )
      {  myTimer3 = millis();    // таймер на millis()
    ds.requestTemperatures(); // считываем температуру с датчиков
    //delay (1000);
       T_pom = ds.getTempC(sensor_pom); // присваиваем показания датчика температуры переменной T_pom
    T =1; // обновление экрана
    }//**

    //** обработка кнопок **
    //** кнопка контролера **
      if (digitalRead(but_kontr) ==0 && F_but_kontr == false){ F_but_kontr =true; if( R>2 ){R=0;}; }
    if (digitalRead(but_kontr) ==1) { F_but_kontr=false; }


    //** ГЛАВНОЕ МЕНЮ ***
    if(M==0){ //** МЕНЮ №0 **
    //if(s<30){ // гашение экрана
    if(T==1) {  // показать температуру
       // oled.clear();
       oled.setCursor(0, 0);
       oled.print( T_pom ,2);
    if( R ==0 ){
       //oled.clear();
       oled.setCursor(0, 6);
       oled.print( "РЕЖ ЭКОНОМ ");  }  
    if( R ==1  ){
       //oled.clear();
       oled.setCursor(0, 6);
       oled.print( "РЕЖ КОМФОРТ");  }
    if( R ==2  ){
       //oled.clear();
       oled.setCursor(0, 6);
       oled.print( "РЕЖ ПРОГРЕВ");  }


    //} // гашение экрана 30 сек.

    //--- блок нагрева --
    if(F_but_kontr == true){R++; delay(500 );  s =0; }
     
    //Serial.println(R);    // пишем в монитор порта
     
      if( R ==0 ){ //--Режим нагрева эконом --
    T_OK = T_min; }
      if( R ==1 ){ //--Режим нагрева комфорт --
    T_OK = T_komf; }
      if( R ==2 ){ //--Режим нагрева прогрев --
    T_OK = T_progr; }


    //====
    if( Alarm ==0 ){ //--Режим нагрева  --
    //-- реле-1 --  
          if( T_pom < T_OK+d ) {digitalWrite(relay_1, HIGH);}
          if( T_pom > T_OK+d+1 ) {digitalWrite(relay_1, LOW); }      // реле 1
    //-- реле-2 --
           if( T_pom < T_OK - (d+1) ) {digitalWrite(relay_2, HIGH);}
          if( T_pom > T_OK + d ) {digitalWrite(relay_2, LOW);}       // реле 1
      //-- реле-3 --
         //  if( T_pom < T_OK - (d+2) ) {digitalWrite(relay_3, HIGH);}
         // if( T_pom > T_OK + d ) {digitalWrite(relay_2, LOW);}     // реле 1
    //-- сброс режима прогрев --
           if( T_pom == T_progr ){R =1 ; }
    //==
    T=0; // если что то изменилось то обнулить  
      }  // если алярм = 0
    }  // период обновления экрана 5сек.
    }//**конец меню №0 **

    /*
    // тут надо написать работу
    // с SIM800 Чтоб при аварии слал СМС.

    // И менюшки аварии
    */








    }//END****
     
  17. mednagolov

    mednagolov Гик

    Плату *промреле* если время будет буду завтра травить.
    К стати о *принтХим* технологии...!
    Когда плату КОНТРОЛЕРА травил, то распечатал плату на фотобумаге на новёхоньком принтере у родствеников. Так замучался на текстолит переводить, половина дорожек остаётся на бумаге и хоть ты тресни !!! Возюкался с пропорциями ацатона - ни фи га ! Убил вечер и ничего не получилось... как я только не изголялся..!
    Покубатурив днём чо за косяпорево такое - дотумкал, что всётаки дело в тонере! И вечером по утверждённым пропорциям ацатона стал переводить с фотобумаги на текстолит, только время пропитки сократил (не нужно долго пропитывать ацатоновой смесью) рисунок четко проявился сквозь фотобумагу - и хорош ! А главнок не надо сильно надавливать при *массаже* .... легонько нужно...ласково пальцами прижимать но нигде ни пропустить...!!!! и всё чётко стало получаться с первого раза !
     
  18. mednagolov

    mednagolov Гик

    и к стати как я и говорил, если глянец остался на дорожках то всеравно хорошо и быстро травится...
    2022-11-19 19.16.25.jpg
    Фотобумага отошла *чисто* все дорожки прилипли к текстолиту.
     
  19. mednagolov

    mednagolov Гик

    вытравилось чётко
    2022-11-19 19.51.58.jpg
     
  20. mednagolov

    mednagolov Гик

    Хочу сделать режим *тест-контроль* для проверки ТЭН. Для этого поставлю на нулевой провод трансформатор тока.
    Думаю действовать это должно примерно так - с трансформатора тока напряжение выпрямляем и ограничиваем стабилитроном далие это напряжение подаём на аналоговый пин дуинки, далие по очереди включаются тены и меряются напруга с трансформатора тока. при пробое тэн напруги будет больше чем должно быть, при сгоревшей тене ничего ни будет приходить.
    ПРИМЕРНО ТАК
    схема 380 в КОНТРОЛЬ ТЭН.jpg