Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <DHT11.h>
- #include <OneWire.h>
- #include <NewPing.h>
- #define ECHO_1 2
- #define TRIG_1 3
- #define ECHO_2 4
- #define TRIG_2 5
- #define DHT11_pin 6
- #define ds_pin 7
- #define humidity_relay_pin 8
- #define water_temp_relay_pin 9
- #define tank_relay_pin 10
- #define humidifier_relay_pin 11
- #define pump1_pin 12
- #define pump2_pin 13
- #define light_relay_pin 51
- #define fan_temp_pin 14
- #define fan_humidity_pin 49
- #define SensorPin A0 //pH meter Analog output to Arduino Analog Input 0
- #define Offset 0.00 //deviation compensate
- #define LED 13
- #define samplingInterval 20
- #define printInterval 800
- #define ArrayLenth 40 //times of collection
- int pHArray[ArrayLenth]; //Store the average value of the sensor feedback
- int pHArrayIndex=0;
- float temp;
- float humidity;
- float water_temp;
- float dist_tank; //расстояние уровня жидкости в баке
- float dist_humidifier; //расстояние уровня в увлажнителе
- float pH;
- float ideal_temp = 25; // в градусах по цельсию
- float ideal_water_temp = 18;
- float ideal_humidity = 51; // в процентах
- float ideal_dist_tank = 23; //в сантиметрах
- float ideal_dist_humidifier = 37; // В сантиметрах
- float ph_min = 5,4;
- float ph_max = 6,0;
- float light_hours = 13,5; //часов в сутки свет включен
- byte fan_speed_temp;
- byte fan_speed_humidity;
- bool temp_relay = false; //ниже управление вентиляторами и реле
- bool humidity_relay = false;
- bool water_temp_relay = false;
- bool tank_relay = false;
- bool humidifier_relay = false;
- bool pump1 = false; // Для ph метра
- bool pump2 = false;
- bool light_realy = true; //свет включается при запуске системы
- unsigned long timer1;
- unsigned long timer2;
- unsigned long measure_timer;
- //bool humidity_fan = false; //чтобы была петля Гистерезиса при управление влажностью
- byte DHT11_pin = 7;
- byte ds_pin = 8;
- OneWire ds(ds_pin);
- DHT11 myDHT11(DHT11_PIN);
- NewPing sonar_tank(TRIG_1, ECHO_1, 400);
- NewPing sonar_humidifier(TRIG_2, ECHO_2, 400);
- void init ()
- {
- pinMode (humidity_relay_pin, OUTPUT);
- pinMode (water_temp_relay_pin, OUTPUT);
- pinMode (tank_relay_pin, OUTPUT);
- pinMode (humidifier_relay_pin, OUTPUT);
- pinMode (pump1_pin, OUTPUT);
- pinMode (pump1_pin, OUTPUT);
- pinMode (light_relay_pin, OUTPUT);
- pinMode (fan_temp_pin, OUTPUT);
- pinmode (fan_humidity_pin);
- }
- float get_water_temp()
- {
- yte data[2]; // Место для значения температуры
- ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
- ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
- ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
- delay(1000); // Микросхема измеряет температуру, а мы ждем.
- ds.reset(); // Теперь готовимся получить значение измеренной температуры
- ds.write(0xCC);
- ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
- // Получаем и считываем ответ
- data[0] = ds.read(); // Читаем младший байт значения температуры
- data[1] = ds.read(); // А теперь старший
- // Формируем итоговое значение:
- // - сперва "склеиваем" значение,
- // - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
- return ((data[1] << 8) | data[0]) * 0.0625;
- }
- void get_data ()
- {
- temp = myDHT11.temperature ();
- water_temp = get_water_temp ();
- humidity = myDHT11.humidity ();
- dist_tank = sonar_tank.ping()/57.5;
- dist_humidifier = sonar_humidifier.ping ()/57.5;
- static unsigned long samplingTime = millis();
- static unsigned long printTime = millis();
- static float pHValue,voltage;
- pHArray[pHArrayIndex++]=analogRead(SensorPin);
- if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
- voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
- pH = 3.5*voltage+Offset;
- }
- }
- void calculating_settings () //управление реле и тд
- {
- if (temp <= ideal_temp)
- {
- fan_speed_temp = 0;
- }
- else if (temp > ideal_temp)
- {
- fan_speed_temp = map (temp*100, ideal_temp*100, ideal_temp*100 + 2, 0, 255); // линейное преобразование
- fan_speed_temp = constrain (fan_speed_temp, 0,255); // чтобы значения ШИМ вентилятора не превышали 255 и не были меньше 0
- if ((ideal_temp - temp) > 5)
- {
- //Error
- }
- }
- if ((ideal_humidity - humidity) > 5)
- {
- humidity_relay = true;
- fan_speed_humidity = 255;
- }
- if (ideal_humidity < humidity)
- {
- humidity_relay = false;
- fan_speed_humidity = 0;
- }
- if ((ideal_water_temp - water_temp) > 1)
- {
- water_temp_relay = true;
- }
- else if ((ideal_water_temp - water_temp) < 1)
- {
- water_temp_relay = false;
- }
- if ((ideal_dist_tank - dist_tank) > 2)
- {
- tank_relay = true;
- }
- if ((ideal_dist_humidifier - dist_humidifier) > 2)
- {
- humidifier_relay = true;
- }
- if ((pH < ph_min) && ((millis () - measure_timer) > 900000))
- {
- pump1 = true;
- measure_timer = millis ();
- }
- if ((pH > ph_max) && ((millis () - measure_timer) > 900000))
- {
- pump1 = true;
- measure_timer = millis ();
- }
- if ((pH > ph_min) && (pH < ph_max) && ((millis () - measure_timer) > 900000))
- {
- pump1 = false;
- pump2 = false;
- }
- if ((millis () - timer1) > (1000*60*60* light_hours))
- {
- light_relay = false;
- }
- if (((millis () - timer1) > (1000*60*60*24) && (!light_relay)) // Прошли сутки
- {
- timer1 = millis(); // Обнуляем таймер
- light_relay = true;
- }
- }
- void set_settings()
- {
- analogWrite (fan_temp_pin, fan_speed_temp);
- analogWrite (fan_humidity_pin, fan_speed_humidity);
- digitalWrite (humidity_relay_pin, humidity_relay_pin);
- digitalWrite (water_temp_relay_pin, water_temp_relay);
- digitalWrite (tank_relay_pin, tank_relay);
- if (tank_relay)
- {
- while ((ideal_dist_tank - sonar_tank.ping()/57.5) > 0,5)
- {
- }
- digitalWrite (tank_relay_pin, false);
- }
- digitalWrite (humidifier_relay_pin, humidifier_relay);
- if (humidifier_relay)
- {
- while ((ideal_dist_humidifier - sonar_humidifier.ping()/57.5) > 0,5)
- {
- }
- digitalWrite (humidifier_relay_pin, false);
- }
- digitalWrite (pump1_pin, pump1);
- digitalWrite (pump2_pin, pump2);
- if ((pump1) || (pump2))
- {
- delay (2000);
- digitalWrite (pump1_pin, false);
- digitalWrite (pump2_pin, false);
- }
- digitalWrite (light_relay_pin, light_relay);
- }
- void setup() {
- // put your setup code here, to run once:
- timer1 = millis ();
- timer2 = millis ();
- init ();
- }
- void loop() {
- // put your main code here, to run repeatedly:
- if ((millis () - timer2) > 3000)
- {
- get_data ();
- calculating_setting ();
- set_settings ();
- timer2 = millis ();
- }
- }
- double avergearray(int* arr, int number){ // Счетчик медианы значений
- int i;
- int max,min;
- double avg;
- long amount=0;
- if(number<=0){
- Serial.println("Error number for the array to avraging!/n");
- return 0;
- }
- if(number<5){ //less than 5, calculated directly statistics
- for(i=0;i<number;i++){
- amount+=arr[i];
- }
- avg = amount/number;
- return avg;
- }else{
- if(arr[0]<arr[1]){
- min = arr[0];max=arr[1];
- }
- else{
- min=arr[1];max=arr[0];
- }
- for(i=2;i<number;i++){
- if(arr[i]<min){
- amount+=min; //arr<min
- min=arr[i];
- }else {
- if(arr[i]>max){
- amount+=max; //arr>max
- max=arr[i];
- }else{
- amount+=arr[i]; //min<=arr<=max
- }
- }//if
- }//for
- avg = (double)amount/(number-2);
- }//if
- return avg;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement