Шести канальный измеритель регулятор с независимыми входами-выходами.

Тема в разделе "Глядите, что я сделал", создана пользователем olegoriy, 31 май 2015.

  1. olegoriy

    olegoriy Гик

    Добрый день.
    1)Хочу представить очередной проект: "Измеритель регулятор".


    Так случилось что я работаю электронщиком на кондитерском предприятии. У нас большое и современное производство с итальянскими и немецкими линиями. Но есть и небольшие цеха с мягко сказать устаревшим оборудованием, которое постоянно ломается и за частую нуждается в доработке.
    В общем существует глазировочная машина без схем и инструкций и даже без названия:). У этой машины существует шесть зон где должна поддерживаться определенная температура, четыре на нагрев и две на охлаждение. С ТЕНами и насосами подающими холодную воду проблем не возникает, а все проблемы только с контроллерами.
    Изначально в машине стоял заграничный контроллер на шесть каналов, но с подорожанием доллара, уменьшением финансирования или просто экономией, контролер тансформировался в шесть разных русских контроллеров типа таких:
    [​IMG]

    Цель у всех контроллеров одна: " Достигли температуры выключить реле - не достигли включить и наоборот.
    Так вот. Была поставлена задача минимизировать количество контроллеров.Но так как тот же ОВЕН на шесть каналов за 14 т.р не кто покупать не хотел было предложено что нибудь изобрести.
    Еще не маловажной задачей стояло минимизировать количество кнопок. Чтобы не добросовестные рабочие не чего не нажимали, и только смотрели температуру.
    2) Встречайте регулятор " Название еще не придумано ":
    [​IMG]
    В проектировании Не чего особо интересного. Две макетные планки, четыре сдвиговых регистра, шесть реле и светодиодов, индикатор и ардуино нано. Так же шесть километров проводов, три километра термоусадки и куча нервов все припаять.
    [​IMG]
    [​IMG]
    С кодом тоже все достаточно просто. Возникли только несколько трудностей с выводом температуры на дисплей и с исключением delay. Но вроде во всем разобрался.
    Код (Text):
      long p = 0;                // Исходное значение для таймера.
      long i = 1000;              // Интервал для таймера.
      int dat1 = A1;              // Входы датчиков.
      int dat2 = A2;
      int dat3 = A3;
      int dat4 = A4;
      int dat5 = A5;
      int dat6 = A6;
      int rele1 = 6;              // Выходы на реле.
      int rele2 = 4;
      int rele3 = 3;
      int rele4 = 2;
      int rele5 = 13;
      int rele6 = 5;
      int z = 1;                  // Переменная для переключения индикации датчиков.
      int t11;                    // Переменные индикации цифр.
      int t12;
      int t13;
      #define latch_Pin  7
      #define CLOCK_PIN  8
      #define data_Pin  9
      #define knopka1  10
        // Масив цифр.
      byte segments[12] = {                                                
      0b10001000, 0b11101101, 0b10100010, 0b10100100, 0b11000101, 0b10010100,
      0b10010000, 0b10101101, 0b10000000, 0b10000100, 0b11111111, 0b11110111
      }; // Масив цифр с точкой.
      byte segment[12] = {
      0b00001000, 0b01101101, 0b00100010, 0b00100100, 0b01000101, 0b00010100,
      0b00010000, 0b00101101, 0b00000000, 0b00000100, 0b11111111, 0b11110111
      }; // Масив светодиодов.
      byte segmen[8] = {
      0b01111110, 0b00100000, 0b00001000, 0b00010000, 0b00000100, 0b00000010,
      0b01000000, 0b01111110
      };
     

    void setup() {

      pinMode(dat1, INPUT);
      pinMode(dat2, INPUT);
      pinMode(dat3, INPUT);
      pinMode(dat4, INPUT);
      pinMode(dat5, INPUT);
      pinMode(dat6, INPUT);
      pinMode(rele1, OUTPUT);
      pinMode(rele2, OUTPUT);
      pinMode(rele3, OUTPUT);
      pinMode(rele4, OUTPUT);
      pinMode(rele5, OUTPUT);
      pinMode(rele6, OUTPUT);
      pinMode(latch_Pin, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
      pinMode(data_Pin, OUTPUT);
      pinMode(knopka1, INPUT_PULLUP);
      }
    void loop() {
      int t1 = ((737.7 - analogRead(dat1))/ 6.552)*10; // Формулы вичисления температуры датчиков.
      int t2 = ((737.7 - analogRead(dat2))/ 6.552)*10;
      int t3 = ((737.7 - analogRead(dat3))/ 6.552)*10;
      // Формулы преобразования температуры в цифры на дисплей.
      if(z == 1){
      t11 = (t1/10)/10;
      t12 = (t1/10)%10;
      t13 = t1-(t11*100)-(t12*10);
      }
      if(z == 2){
      t11 = (t2/10)/10;
      t12 = (t2/10)%10;
      t13 = t2-(t11*100)-(t12*10);
      }
      if(z == 3){
      t11 = (t3/10)/10;
      t12 = (t3/10)%10;
      t13 = t3-(t11*100)-(t12*10);
      }
      if(z == 4) {
      t11 = 11;
      t12 = 11;
      t13 = 11;
      }
      if(z ==5) {
      t11 = 11;
      t12 = 11;
      t13 = 11;
      }
      if(z ==6) {
      t11 = 11;
      t12 = 11;
      t13 = 11;
      }
      unsigned long r = millis();  // Таймер исполняюший функции ниже раз  200 м.с
      if(r - p > i){
        p = r;
      digitalWrite(latch_Pin, LOW);                            // Загрузка в регистры.
      shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[t11]);    
      shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[t12]);    
      shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[t13]);
      shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segmen[z]);
      digitalWrite(latch_Pin, HIGH);
     
    if(t1 < 350 ) {digitalWrite(rele1, HIGH);} else {digitalWrite(rele1, LOW);}    // Логика срабатывания реле.
    if(t1 < 470 ) {digitalWrite(rele2, HIGH);} else {digitalWrite(rele2, LOW);}
    if(t2 < 370 ) {digitalWrite(rele3, HIGH);} else {digitalWrite(rele3, LOW);}
    if(t2 < 440 ) {digitalWrite(rele4, HIGH);} else {digitalWrite(rele4, LOW);}
    if(t3 > 320 ) {digitalWrite(rele5, HIGH);} else {digitalWrite(rele5, LOW);}
    if(t3 > 380 ) {digitalWrite(rele6, HIGH);} else {digitalWrite(rele6, LOW);}
      }                        // Окончание таймера.
     
      // Кнопка для переключения между датчиками.
    if (!digitalRead(knopka1)) {
    z = z + 1;
    delay(200);
    if(z == 7) z = 1;
    }
    }
     
     
    Конечно на данный момент точность измерений скорее всего не выдержит не какой критики, но с использованием более качественных датчиков думаю все получиться:) и я заменю: "это на это - см. фото"
    [​IMG]
    Всем спасибо за внимание.;););)
     
    ИгорьК, iglooshtosser, Megakoteyka и 3 другим нравится это.
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Разводка и травление платы помогут сохранить кучу нервов и сильно упростить в дальнейшем поиск неисправностей и ремонт.
     
  3. olegoriy

    olegoriy Гик

    Думал об этом. Но почему-то решил что кернение, сверление и лужение платы будет более трудной задачей. Могу ошибаться так как не когда не делал. В следующем проекте постараюсь попробовать.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Попробуйте интереса ради. Текстолит и реактивы (чаще всего используют хлорное железо или персульфат аммония, есть и другие варианты) стоят копейки. Для сверления продаются наборы - мелкий патрон и сверла от 0,3 до 1 мм, это можно прицепить к любому моторчику или купить готовую сверлилку.
    Для рисования платы можно использовать SprintLayout или DipTrace (просты и бесплатны, есть и более продвинутый софт). Картинка переносится на текстолит утюгом (гуглите ЛУТ). Травление занимает 10-30 минут, лужение делается без проблем любым паяльником. Толщину дорожек для первого раза можно ставить 0,8 мм, но технология позволяет без проблем делать 0,5 мм. При некоторой сноровке можно и 0,3 мм получить. При должной аккуратности можно делать двухсторонние платы с переходными отверстиями. В сети куча статей и инструкций с картинками, сложностей возникнуть не должно.
    Когда сделаете первую плату, забудете километры проводов как страшный сон.
     
  5. olegoriy

    olegoriy Гик

    Большое спасибо за совет. Обязательно попробую.