Пишите

Тема в разделе "Сделаю проект", создана пользователем ostrov, 18 мар 2017.

  1. ostrov

    ostrov Гуру

    Всвязи с ломкой, вызванной временным отсутствием заданий, сделаю что нибудь полезное. Так как основным источником дохода эта работа не является, делаю относительно недорого. Но качественно. И довольно быстро, но от заказчика для этого потребуется четкое ТЗ. Выдавать результат предпочитаю в "железе".
     
  2. Здравствуйте.
    Нужна разработка (думаю на нано) контроллера.
    1. Включение контроллера при замыкании контактов водой.
    2. При включении (замыкание водой) плавный пуск двигателя постоянного тока (шим) двигатель дворников пусковой ток промерял около 4А. В рабочем режиме около 1А.
    3. При включении (замыкание водой) включение реле насоса. Коммутация 220 не более 5А. Вообще двигатель (водяной насос) планируется ватт на 500 - 800.
    4. При понижении уровня воды (размыкание контактов воды) таймер на выключение с регулировкой задержки от 3 сек до 30 сек.
    5. При выключении (размыкание водой) после отработки таймера. Отключение реле коммутации насоса 220 после полной плавной остановки двигателя DC.
    6. В двигателях дворников есть контакт который размыкается при каждом обороте. Есть задумка считать, и если например в течении 3х секунд нет отсчёта, то включается сигнал и светодиод (нет вращения барабана) типа обратная связь.

    Первый раз пишу подобное задание, если что не обессудьте. Может что упустил.
    Нужна схема и скетч.
    Возможность? Стоимость? Сроки?
    С уважением, Александр. почта если нужно mirvie@mail.ru
     
  3. ostrov

    ostrov Гуру

    Возможно. По ценам и срокам пока сказать не могу, нужно уточнить подробности, но не вижу ничего сверхсложного и сверхдорогого. Детали сами найдете? Драйвер двигателя DC например. Где находитесь географически?
     
  4. Детали есть. А что за драйвер? Нахожусь в Барнауле.
     
  5. Ещё нужна информация?
     
  6. ostrov

    ostrov Гуру

    Драйвер это такая микросхема с обвязкой, которая формирует для двигателя нужное напряжение руководимое ШИМом и прочими параметрами. Классический пример Монстр мотошилд, он крут но дорог, есть варианты попроще.
     
  7. ostrov

    ostrov Гуру

    У меня в наличии есть например такой:

    MonsterMoto одноканальный 1300 руб. Vmax=16V, Inom= 14A, Imax=30A, PWM ≤20KHz
     
  8. Всё понял. Почитал. А нормальный подешевле посоветуете? Придётся купить.
     
  9. Понял. Возьму если договоримся. А вы далеко территориально?
     
  10. ostrov

    ostrov Гуру

    Написал в личку.
     
  11. freebie

    freebie Нуб

    привет! помоги плиз! необходимо что бы реле с 1 включалась при превышении температуры 28, например на 20 сек и потом вырубалась! и если теппература превысит 29 то по такому же алгоритму включается реле3.

    и если тепрература ниже 27,5 то на эти же 20 сек включается реле 2 и если температура ниже 28,5 то включается на 20 сек реле4

    у меня в скетче сделан таймер, но он сволочь в loop и каждый раз мне включает реле....

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

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

    такое решение необходимо только для реле 1 2 3 4

    ниже скетч
    Код (C++):
    #include "DHT.h"

    #define RELAY1   4
    #define RELAY2   5
    #define RELAY3   6
    #define RELAY4   7
    #define RELAY5   8
    #define RELAY6   9
    #define RELAY7  10
    #define RELAY8  11
    //значения времени
    #define ONTIME 20000 //если реле включено более чем
    #define OFFTIME 100
    #define PAUSE 1000
    #define ON  0      // если реле управляются высоким уровнем то ON= 1 OFF=0
    #define OFF 1      // если реле управляется низким уровнем то поставить ON=0 OFF=1

    //датчик температуры
    #define DHTPIN 3     // what digital pin we're connected to
    #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
    DHT dht(DHTPIN, DHTTYPE);
    unsigned long timeRelay1 = -99999;
    unsigned long timeRelay2 = -99999;
    unsigned long timeRelay3 = -99999;
    unsigned long timeRelay4 = -99999;
    boolean relay1 = false;
    boolean relay2 = false;
    boolean relay3 = false;
    boolean relay4 = false;
    boolean relay5 = false;
    boolean relay6 = false;
    boolean relay7 = false;
    boolean relay8 = false;

    void setup() {
      Serial.begin(9600);
      Serial.println("DHTxx test!");
      dht.begin();
     
      pinMode(RELAY1, OUTPUT);
      pinMode(RELAY2, OUTPUT);
      pinMode(RELAY3, OUTPUT);
      pinMode(RELAY4, OUTPUT);
      pinMode(RELAY5, OUTPUT);
      pinMode(RELAY6, OUTPUT);
      pinMode(RELAY7, OUTPUT);
      pinMode(RELAY8, OUTPUT);
      digitalWrite(RELAY1, OFF);
      digitalWrite(RELAY2, OFF);
      digitalWrite(RELAY3, OFF);
      digitalWrite(RELAY4, OFF);
      digitalWrite(RELAY5, OFF);
      digitalWrite(RELAY6, OFF);
      digitalWrite(RELAY7, OFF);
      digitalWrite(RELAY8, OFF);

    }
    void loop() {
      delay(2000);
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();
      // Read temperature as Fahrenheit (isFahrenheit = true)
      float f = dht.readTemperature(true);

      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
      float hif = dht.computeHeatIndex(f, h);
      float hic = dht.computeHeatIndex(t, h, false);
      Serial.print("TEMP:     ");
      Serial.print(t);
      Serial.println(" *C ");
      //Serial.print("HUM:     ");
      //Serial.print(h);
      //Serial.println(" %\t");
      //Serial.print(f);
      //Serial.print(" *F\t");
      //Serial.print("Heat index: ");
      //Serial.print(hic);
      //Serial.println(" *C ");
      //Serial.print(hif);
      //Serial.println(" *F");

             if (t>28){ //окно 1
      digitalWrite (RELAY1, ON);
      Serial.println("WINDOW_1: OPEN");
      digitalWrite (RELAY2, OFF);
      if ( digitalRead(RELAY1) == ON){
        if ( millis()-timeRelay1 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
          digitalWrite(RELAY1, OFF);
          timeRelay1 = millis();
    }}} else
      if (t<27.5){
      digitalWrite (RELAY1, OFF);
      digitalWrite (RELAY2, ON);
      if ( digitalRead(RELAY2) == ON){
        if ( millis()-timeRelay2 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
          digitalWrite(RELAY2, OFF);
          timeRelay2 = millis();
    }}
      }
             if (t>29){ //окно 2
      digitalWrite (RELAY3, ON);
      Serial.println("WINDOW_2: OPEN");
      digitalWrite (RELAY4, OFF);
      if ( digitalRead(RELAY3) == ON){
        if ( millis()-timeRelay3 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
          digitalWrite(RELAY3, OFF);
          timeRelay3 = millis();
    }}
    } else
      if (t<28.5){
      digitalWrite (RELAY3, OFF);
      digitalWrite (RELAY4, ON);
      if ( digitalRead(RELAY4) == ON){
        if ( millis()-timeRelay4 >= ONTIME){ // если реле 1 вкл проверяем время 1 с и отключаем по истечении 1 сек
          digitalWrite(RELAY4, OFF);
          timeRelay4 = millis();
    }}
      }
             if (t>27){ //вентилятор1
      digitalWrite (RELAY7, LOW);
      Serial.println("VENT_1:   ON");
    } else
      if (t<26.5){
      digitalWrite (RELAY7, HIGH);
      }
             if (t>27.5){ //вентилятор2
      digitalWrite (RELAY8, LOW);
      Serial.println("VENT_2:   ON");
    } else
      if (t<27){
      digitalWrite (RELAY8, HIGH);
      }
             if (t<25){ //обогрев 1-2
      digitalWrite (RELAY5, LOW);
      digitalWrite (RELAY6, LOW);
      Serial.println("HEAT:     ON");
    } else
      if (t>25.5){
      digitalWrite (RELAY5, HIGH);
      digitalWrite (RELAY6, HIGH);
      }

    }
     
  12. ostrov

    ostrov Гуру

    То есть, если температура 28 включится реле 1 и 4? Нужно четко определить диапазон температур для каждого реле и чтобы они не пересекались. А так же учесть гистерезис, то есть от и до.

    Как включение реле влияет на температуру? Если никак, то можно и по таймеру, если влияет, то надо следить чтобы это изменение достигло заданного уровня. Например при 28 градусах включается вентилятор и работает пока температура не упадет до 27. И так для каждого.
     
  13. freebie

    freebie Нуб

    <28гр реле1 вкл 20 сек
    >27,5 реле2 вкл 20 сек
    <29гр реле3 вкл 20 сек
    >28,5 реле4 вкл 20 сек

    если коротко то так... гистерезис пока-что 0,5гр дальше буду смотреть при монтаже в парник... возможно я его увеличу...

    в том то все и дело, что привязка управления двигателями идет именно с градусника, так что по таймеру здесь никак нельзя...
     
  14. freebie

    freebie Нуб

    то есть если температура в парнике превышает 26гр то включается вытяжка, если более 27 то вторая вытяжка(но с ними все просто), а вот если превышение более 28гр то открывается окно 1 и если превышает 29 то окно 2, и закрываются они если гистерезис идет в -0,5 от заданного... и так же если температура падает ниже 25гр то все закрыто и работают только обогреватели
     
  15. ostrov

    ostrov Гуру

    Что не работает то?

    Кстати, при работе с переменными float надо писать так:
    Код (C++):
    if (t<25.0){ //обогрев 1-2
     
  16. freebie

    freebie Нуб

    спасибо за замечания исправлю
     
  17. freebie

    freebie Нуб

    суть в том что на данный момент реле у меня включаются на 20 сек так как надо и потом вырубаются, но вот когда цикл повторяется, то программа видит что температура превышена и повторно включает снова на 20 сек те же самые реле.... с задержкой в 2 секунды, так как в самом начале loop у меня установлен delay 2000

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

    ostrov Гуру

    Тогда нужен триггер, включающийся после отработки 20 сек и выключающийся после падения температуры ниже заданной. А вообще это и есть гистерезис а не допуск, как понимаете его вы. То есть некое пространство между верхней и нижней планкой, в котором происходит событие зависящее от того с в каком направлении это пространство проходится. Вверх идет - ждет включение вентилятора при верней планке. Вниз идет - ждет переключения триггера (и включения другого реле, нагрева там и т.п.).
     
  19. Здравствуйте! Поможете за плату с проектиком.
     
  20. ostrov

    ostrov Гуру

    Хотелось бы больше информации. Есть готовое ТЗ? Или своими словами хотя бы.