Advertisement
zhora_15

Untitled

Jun 19th, 2018
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.93 KB | None | 0 0
  1. #include <DHT11.h>
  2. #include <OneWire.h>
  3. #include <NewPing.h>
  4.  
  5.  
  6. #define ECHO_1 2
  7. #define TRIG_1 3
  8. #define ECHO_2 4
  9. #define TRIG_2 5
  10. #define DHT11_pin 6
  11. #define ds_pin 7
  12. #define humidity_relay_pin 8
  13. #define water_temp_relay_pin 9
  14. #define tank_relay_pin 10
  15. #define humidifier_relay_pin 11
  16. #define pump1_pin 12
  17. #define pump2_pin 13
  18. #define light_relay_pin 51
  19. #define fan_temp_pin 14
  20. #define fan_humidity_pin 49
  21.  
  22. #define SensorPin A0            //pH meter Analog output to Arduino Analog Input 0
  23. #define Offset 0.00            //deviation compensate
  24. #define LED 13
  25. #define samplingInterval 20
  26. #define printInterval 800
  27. #define ArrayLenth  40    //times of collection
  28. int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
  29. int pHArrayIndex=0;  
  30.  
  31. float temp;
  32. float humidity;
  33. float water_temp;
  34. float dist_tank; //расстояние уровня жидкости в баке
  35. float dist_humidifier; //расстояние уровня в увлажнителе
  36. float pH;
  37.  
  38. float ideal_temp = 25; // в градусах по цельсию
  39. float ideal_water_temp = 18;
  40. float ideal_humidity = 51; // в процентах
  41. float ideal_dist_tank = 23; //в сантиметрах
  42. float ideal_dist_humidifier = 37; // В сантиметрах
  43. float ph_min = 5,4;
  44. float ph_max = 6,0;
  45. float light_hours = 13,5; //часов в сутки свет включен
  46.  
  47. byte fan_speed_temp;
  48. byte fan_speed_humidity;
  49.  
  50. bool temp_relay = false; //ниже управление вентиляторами и реле
  51. bool humidity_relay = false;
  52. bool water_temp_relay = false;
  53. bool tank_relay = false;
  54. bool humidifier_relay = false;
  55. bool pump1 = false; // Для ph метра
  56. bool pump2 = false;
  57. bool light_realy = true; //свет включается при запуске системы
  58.  
  59. unsigned long timer1;
  60. unsigned long timer2;
  61. unsigned long measure_timer;
  62. //bool humidity_fan = false; //чтобы была петля Гистерезиса при управление влажностью
  63. byte DHT11_pin = 7;
  64. byte ds_pin = 8;
  65.  
  66. OneWire ds(ds_pin);
  67. DHT11 myDHT11(DHT11_PIN);
  68. NewPing sonar_tank(TRIG_1, ECHO_1, 400);
  69. NewPing sonar_humidifier(TRIG_2, ECHO_2, 400);
  70.  
  71. void init ()
  72. {
  73.     pinMode (humidity_relay_pin, OUTPUT);
  74.     pinMode (water_temp_relay_pin, OUTPUT);
  75.     pinMode (tank_relay_pin, OUTPUT);
  76.     pinMode (humidifier_relay_pin, OUTPUT);
  77.     pinMode (pump1_pin, OUTPUT);
  78.     pinMode (pump1_pin, OUTPUT);
  79.     pinMode (light_relay_pin, OUTPUT);
  80.     pinMode (fan_temp_pin, OUTPUT);
  81.     pinmode (fan_humidity_pin);
  82. }
  83. float get_water_temp()
  84. {
  85.   yte data[2]; // Место для значения температуры
  86.   ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
  87.   ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
  88.   ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
  89.    
  90.   delay(1000); // Микросхема измеряет температуру, а мы ждем.  
  91.    
  92.   ds.reset(); // Теперь готовимся получить значение измеренной температуры
  93.   ds.write(0xCC);
  94.   ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
  95.  
  96.   // Получаем и считываем ответ
  97.   data[0] = ds.read(); // Читаем младший байт значения температуры
  98.   data[1] = ds.read(); // А теперь старший
  99.  
  100.   // Формируем итоговое значение:
  101.   //    - сперва "склеиваем" значение,
  102.   //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
  103.   return  ((data[1] << 8) | data[0]) * 0.0625;
  104. }
  105. void get_data ()
  106. {
  107.     temp = myDHT11.temperature ();
  108.     water_temp = get_water_temp ();
  109.     humidity = myDHT11.humidity ();
  110.     dist_tank = sonar_tank.ping()/57.5;
  111.     dist_humidifier = sonar_humidifier.ping ()/57.5;
  112.     static unsigned long samplingTime = millis();
  113.     static unsigned long printTime = millis();
  114.     static float pHValue,voltage;
  115.     pHArray[pHArrayIndex++]=analogRead(SensorPin);
  116.     if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
  117.     voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
  118.     pH = 3.5*voltage+Offset;
  119.   }
  120. }
  121. void calculating_settings () //управление реле и тд
  122. {
  123.     if (temp <= ideal_temp)
  124.     {
  125.         fan_speed_temp = 0;
  126.     }
  127.     else if (temp > ideal_temp)
  128.     {
  129.         fan_speed_temp = map (temp*100, ideal_temp*100, ideal_temp*100 + 2, 0, 255); // линейное преобразование
  130.         fan_speed_temp = constrain (fan_speed_temp, 0,255); // чтобы значения ШИМ вентилятора не превышали 255 и не были меньше 0
  131.         if ((ideal_temp - temp) > 5)
  132.         {
  133.             //Error
  134.         }
  135.     }
  136.     if ((ideal_humidity - humidity) > 5)
  137.     {
  138.         humidity_relay = true;
  139.         fan_speed_humidity = 255;
  140.     }  
  141.     if (ideal_humidity < humidity)
  142.     {
  143.         humidity_relay = false;
  144.         fan_speed_humidity = 0;
  145.     }
  146.     if ((ideal_water_temp - water_temp) > 1)
  147.     {
  148.         water_temp_relay = true;
  149.     }
  150.     else if ((ideal_water_temp - water_temp) < 1)
  151.     {
  152.         water_temp_relay = false;
  153.     }
  154.     if ((ideal_dist_tank - dist_tank) > 2)
  155.     {
  156.         tank_relay = true;
  157.     }
  158.     if ((ideal_dist_humidifier - dist_humidifier) > 2)
  159.     {
  160.         humidifier_relay = true;
  161.     }
  162.     if ((pH < ph_min) && ((millis () - measure_timer) > 900000))
  163.     {
  164.         pump1 = true;
  165.         measure_timer = millis ();
  166.     }
  167.     if ((pH > ph_max) && ((millis () - measure_timer) > 900000))
  168.     {
  169.         pump1 = true;
  170.         measure_timer = millis ();
  171.     }
  172.     if ((pH > ph_min) && (pH < ph_max) && ((millis () - measure_timer) > 900000))
  173.     {
  174.         pump1 = false;
  175.         pump2 = false;
  176.     }
  177.     if ((millis () - timer1) > (1000*60*60* light_hours))
  178.     {
  179.         light_relay = false;
  180.     }
  181.     if (((millis () - timer1) > (1000*60*60*24) && (!light_relay)) // Прошли сутки
  182.     {
  183.         timer1 = millis(); // Обнуляем таймер
  184.         light_relay = true;
  185.     }    
  186. }
  187. void set_settings()
  188. {
  189.     analogWrite (fan_temp_pin, fan_speed_temp);
  190.     analogWrite (fan_humidity_pin, fan_speed_humidity);
  191.     digitalWrite (humidity_relay_pin, humidity_relay_pin);
  192.     digitalWrite (water_temp_relay_pin, water_temp_relay);
  193.     digitalWrite (tank_relay_pin, tank_relay);
  194.     if (tank_relay)
  195.     {
  196.         while ((ideal_dist_tank - sonar_tank.ping()/57.5) > 0,5)
  197.         {
  198.      
  199.         }
  200.         digitalWrite (tank_relay_pin, false);
  201.     }
  202.     digitalWrite (humidifier_relay_pin, humidifier_relay);
  203.     if (humidifier_relay)
  204.     {
  205.         while ((ideal_dist_humidifier - sonar_humidifier.ping()/57.5) > 0,5)
  206.         {
  207.            
  208.         }
  209.         digitalWrite (humidifier_relay_pin, false);
  210.     }
  211.     digitalWrite (pump1_pin, pump1);
  212.     digitalWrite (pump2_pin, pump2);
  213.     if ((pump1) || (pump2))
  214.     {
  215.         delay (2000);
  216.         digitalWrite (pump1_pin, false);
  217.         digitalWrite (pump2_pin, false);
  218.     }
  219.     digitalWrite (light_relay_pin, light_relay);
  220. }
  221. void setup() {
  222.     // put your setup code here, to run once:
  223.     timer1 = millis ();
  224.     timer2 = millis ();
  225.     init ();
  226. }
  227.  
  228. void loop() {
  229.     // put your main code here, to run repeatedly:
  230.     if ((millis () - timer2) > 3000)
  231.     {
  232.         get_data ();
  233.         calculating_setting ();
  234.         set_settings ();
  235.         timer2 = millis ();
  236.     }
  237. }
  238.  
  239. double avergearray(int* arr, int number){ // Счетчик медианы значений
  240.   int i;
  241.   int max,min;
  242.   double avg;
  243.   long amount=0;
  244.   if(number<=0){
  245.     Serial.println("Error number for the array to avraging!/n");
  246.     return 0;
  247.   }
  248.   if(number<5){   //less than 5, calculated directly statistics
  249.     for(i=0;i<number;i++){
  250.       amount+=arr[i];
  251.     }
  252.     avg = amount/number;
  253.     return avg;
  254.   }else{
  255.     if(arr[0]<arr[1]){
  256.       min = arr[0];max=arr[1];
  257.     }
  258.     else{
  259.       min=arr[1];max=arr[0];
  260.     }
  261.     for(i=2;i<number;i++){
  262.       if(arr[i]<min){
  263.         amount+=min;        //arr<min
  264.         min=arr[i];
  265.       }else {
  266.         if(arr[i]>max){
  267.           amount+=max;    //arr>max
  268.           max=arr[i];
  269.         }else{
  270.           amount+=arr[i]; //min<=arr<=max
  271.         }
  272.       }//if
  273.     }//for
  274.     avg = (double)amount/(number-2);
  275.   }//if
  276.   return avg;
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement