#1 Проекти » Контроллер воздушного солнечного коллектора. Нужен совет. » 2017-03-05 12:08:58

Evgen
відповідей: 0

Привет всем любителям Ардуино. Решил сделать контроллер для управления воздушным коллектором. Из железа купил: Arduino Uno,
датчик ds18b20 в герметичном корпусе-3 шт, одноканальный модуль реле для вентилятора-1 шт, восьмизначный  семисегментный модуль индикации на MAX7219 для индикации температуры с датчиков-1 шт, и сервоприводы TowerPro MG996-3 шт. для управления заслонками вентканалов. Скетч писал сам вспоминая вузовский курс программирования так, что если он кривой сильно не кричите.
Проблема в том, что на столе все работало замечательно, но после монтажа начались проблемы. Модуль индикации при включении сервоприводов или реле или Х.З. засвечивается всеми сегментами и перестает реагировать аж до перезапуска контроллера. Но и после перезапуска может показать температуру и через 1-2сек. опять уйти в засвет, и снова до перезапуска. Датчики иногда показывают -125, а иногда 85. Может я где то набокопорил в схеме при сборке? Провода датчиков допаяны до 7 метров проводом 3х0,5мм.кв Между контроллером и модулем индикации примерно 12 метров сигнального экранированного провода 6х0,22. К контроллеру сейчас все припаяно напрямую(резистор на 4.7 ком есть). Блоки питания разные. На контроллер 12v 1.25А снял с лед. подсветки, для серв- старый трансформатор 20В и dc-dc понижающий преобразователь  LM2596 3А.
Это первый мой проект подобного рода, поэтому буду благодарен за любой совет. 

#include <LedControl.h>
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire OneWire_sensors(13);
DallasTemperature sensors(&OneWire_sensors);
Servo myservo1;
Servo myservo2;
Servo myservo3;
int time_d;
LedControl lc = LedControl(7,5,6,1);

void setup() {
  pinMode(4, OUTPUT);
  Serial.begin(9600);
  sensors.begin();
  lc.shutdown(0,false);    // выключаем спящий режим функция lc.shutdown(0,true); снова его включит
  lc.setIntensity(0,8);    // яркость свечения, доступные значения от 0 до 15
  lc.clearDisplay(0);
 
}

void loop() {
   Serial.print("Please wait...");
   Serial.println(time_d);
   sensors.requestTemperatures(); // Команда опроса температуры.
   int t0=sensors.getTempCByIndex(0);
   int t1=sensors.getTempCByIndex(1);
   int t2=sensors.getTempCByIndex(2);
   int kollektop=t0;
   int podacha=t1;
   int obratka=t2;
   if(t0<0){t0=t0*-1;}
   if(t1<0){t1=t1*-1;}
   if(t2<0){t2=t2*-1;}
   int t0_tens=t0/10;
   int t0_ones=t0-t0_tens*10;
   int t1_tens=t1/10;
   int t1_ones=t1-t1_tens*10;
   int t2_tens=t2/10;
   int t2_ones=t2-t2_tens*10;
   Serial.print("kollektop=");
   Serial.println(kollektop);
   Serial.print("podacha=");
   Serial.println(podacha);
   Serial.print("obratka=");
   Serial.println(obratka);
   if(kollektop<0||podacha<0||obratka<0){
    if(kollektop<0){
       lc.setChar(0,7,'-',false);
         if(t0<-9){
           lc.setDigit(0,6,t0_ones,true);
         }
         else {
           lc.setDigit(0,6,t0_ones,false);
           }
      lc.setDigit(0,4,t1_tens,false);
      lc.setDigit(0,3,t1_ones,false);
      lc.setDigit(0,1,t2_tens,false);
      lc.setDigit(0,0,t2_ones,false);
     }
    if(podacha<0){
      lc.setChar(0,4,'-',false);
        if(t1<-9){
          lc.setDigit(0,3,t1_ones,true);
        }
        else {
          lc.setDigit(0,3,t1_ones,false);
          }
      lc.setDigit(0,7,t0_tens,false);
      lc.setDigit(0,6,t0_ones,false);
      lc.setDigit(0,1,t2_tens,false);
      lc.setDigit(0,0,t2_ones,false);
     }
    if(obratka<0){
      lc.setChar(0,1,'-',false);
        if(t2<-9){
          lc.setDigit(0,0,t2_ones,true);
        }
        else {
          lc.setDigit(0,0,t2_ones,false);
          }
      lc.setDigit(0,4,t1_tens,false);
      lc.setDigit(0,3,t1_ones,false);
      lc.setDigit(0,7,t0_tens,false);
      lc.setDigit(0,6,t0_ones,false);
     }
   }
    else{
    lc.setDigit(0,7,t0_tens,false);
    lc.setDigit(0,6,t0_ones,false);
    lc.setDigit(0,4,t1_tens,false);
    lc.setDigit(0,3,t1_ones,false);
    lc.setDigit(0,1,t2_tens,false);
    lc.setDigit(0,0,t2_ones,false);
    }
                                  //проверяем режим
   if(time_d==1 && t0>=60){time_d=0;
    Serial.println("utro");
   }
                                 //утро                                                       
   if(time_d==0 && t0>=60){
     Serial.println("utro vhod");
                                 //открываем первую серву канала продувки
     myservo1.attach(11);
     myservo1.write(170);
     delay(1000);
     myservo1.detach();
                                //открываем вторую серву подачи
     myservo2.attach(10);
     myservo2.write(25);
     delay(1000);
     myservo2.detach();
                                //открываем третью серву обратки
     myservo3.attach(9);
     myservo3.write(42);
     delay(1000);
     myservo3.detach();
                                //включаем вентилятор на продувку
     digitalWrite(4,LOW);   
                                   //переход на день
     if((t1-t2)>=5){
       Serial.println("prodyvka");
                                   //закрываем канал продувки-вентиляции
       myservo1.attach(11);
       myservo1.write(170);
       delay(1000);
       myservo1.detach();
                                   //маркер режима в ночь
       time_d=2;
       }
      }
                                  //проверяем маркер режима и температуру на коллекторе
  else if(time_d==0 && t0<60){
     Serial.println(2);
                                  //если на коллекторе <30 и текущий день то маркер в ночь
         time_d=2;
      }   
                                  //переход на ночь
                                  //проверяем маркер и температуру
  if(time_d==2 && t0<60){
     Serial.println("noch");
                                 //выключаем вентилятор
       digitalWrite(4,HIGH);
       delay(250);
                                  //открываем канал продувки-вентиляции
       myservo1.attach(11);
       myservo1.write(170);
       delay(1000);
       myservo1.detach();
                                  //закрываем подачу 
       myservo2.attach(10);
       myservo2.write(88);
       delay(1000);
       myservo2.detach();
                                  //закрываем обратку
       myservo3.attach(9);
       myservo3.write(132);
       delay(1000);   
       myservo3.detach();
                                  //меняем маркер на утро
       time_d=1;
       }
     delay(10000);
     lc.clearDisplay(0);
}

Підвал форуму