Скетч с включенной отладкой
This commit is contained in:
		
							parent
							
								
									f08ef20e7a
								
							
						
					
					
						commit
						240ab3327d
					
				
							
								
								
									
										138
									
								
								TempRelay.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								TempRelay.ino
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,138 @@ | ||||
| #include <microDS18B20.h> | ||||
| 
 | ||||
| // Отладка вывода
 | ||||
| #define DEBUG 1 | ||||
| // Отладка ввода
 | ||||
| #define DEBUG_INPUT 1 | ||||
| 
 | ||||
| // Пин датчика температуры
 | ||||
| #define PIN_SENSOR 2 | ||||
| // Пин управления реле
 | ||||
| #define PIN_RELAY 5 | ||||
| 
 | ||||
| MicroDS18B20<PIN_SENSOR> sensor;  // датчик на пине D2
 | ||||
| 
 | ||||
| // Лимит таймаутов
 | ||||
| #define MAX_TIMEOUTS 10 | ||||
| 
 | ||||
| // Структура для хранения данных о температуре и таймаутах
 | ||||
| struct | ||||
| { | ||||
|   float temp; | ||||
|   int openTime; | ||||
|   int closeTime; | ||||
| } timeouts[MAX_TIMEOUTS]; | ||||
| 
 | ||||
| int timeouts_count = 0; // Общее количество зарегистрированных данных о тем-ре и таймаутах
 | ||||
| 
 | ||||
| // Макрос для регистрации данных о тем-ре и таймаутах (тем-ра в градусах цельсия, время открытия и закрытия в миллисекундах)
 | ||||
| #define REGISTER_TIMEOUT(temp_C, openTime_ms, closeTime_ms) timeouts[timeouts_count++] = {temp_C, openTime_ms, closeTime_ms};  | ||||
|    | ||||
| // Макрос для удобства записи таймаута в секундах (переводит в мс)
 | ||||
| #define SEC_TO_MSEC(time) time*1000 | ||||
| 
 | ||||
| void setup()  | ||||
| { | ||||
|   // Для отладочной печати
 | ||||
|   #if DEBUG == 1 | ||||
|     Serial.begin(9600); | ||||
|   #endif // DEBUG
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
 | ||||
|   //  НИЖЕ РЕГИСТРИРУЕТСЯ ВРЕМЯ И ТАЙМАУТЫ ОТКРЫТИЯ/ЗАКРЫТИЯ РЕЛЕ  //
 | ||||
|   // ЗНАЧЕНИЯ ДОЛЖНЫ БЫТЬ ОТСОРТИРОВАНЫ ПО ВОЗРАСТАНИЮ ТЕМПЕРАТУРЫ //
 | ||||
|   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
 | ||||
|    | ||||
|   REGISTER_TIMEOUT(83, 300, SEC_TO_MSEC(150)); | ||||
| 
 | ||||
|   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
 | ||||
|   //  ВЫШЕ РЕГИСТРИРУЕТСЯ ВРЕМЯ И ТАЙМАУТЫ ОТКРЫТИЯ/ЗАКРЫТИЯ РЕЛЕ  //
 | ||||
|   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
 | ||||
| 
 | ||||
| 
 | ||||
|   // Проверка что не было зарегистрировано больше данных, чем это возможно
 | ||||
|   if (timeouts_count >= MAX_TIMEOUTS)  | ||||
|   {  | ||||
|     #if DEBUG == 1  | ||||
|       Serial.println("TIMEOUTS LIMIT REACHED ! ! !");  | ||||
|     #endif // DEBUG 
 | ||||
|     while(1); // Программа не запуститься дальше, если допущена ошибка
 | ||||
|   } | ||||
| 
 | ||||
|   // Настройка реле
 | ||||
|   pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
 | ||||
|   digitalWrite(PIN_RELAY, LOW); // Выключаем реле - посылаем сигнал 0
 | ||||
| } | ||||
| 
 | ||||
| void loop()  | ||||
| { | ||||
|   static uint32_t tmr; // Для таймера опроса датчика
 | ||||
|   static uint32_t lastRelayTime = 0; // Для управления реле
 | ||||
|   static float currentTemp = 0; // Текущая температура
 | ||||
|   int relayState; // Значение реле на текущий момент
 | ||||
|   int i; // Счетчик для цикла перебора температур
 | ||||
|   uint32_t current_time = millis(); // Текущее время
 | ||||
|   // конструкция программного таймера на 200 мс
 | ||||
|   if (current_time - tmr >= 200)  | ||||
|   { | ||||
|     // Обновляем переменную для таймера опроса датчика
 | ||||
|     tmr = current_time; | ||||
|     // читаем прошлое значение
 | ||||
|     if (sensor.readTemp())  | ||||
|     { | ||||
|       currentTemp = sensor.getTemp(); | ||||
| #if DEBUG == 1 | ||||
|       Serial.println(currentTemp); | ||||
| #endif // DEBUG
 | ||||
| #if DEBUG_INPUT == 1 | ||||
|       currentTemp = Serial.parseFloat(); | ||||
| #endif // DEBUG_INPUT
 | ||||
|     } | ||||
| #if DEBUG == 1 | ||||
|     else  | ||||
|       Serial.println("error"); | ||||
| #endif // DEBUG
 | ||||
|     // запрашиваем новое измерение
 | ||||
|     sensor.requestTemp(); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   // Подбор подходящих таймаутов по текущей температуре
 | ||||
|   for (i = 0; i < timeouts_count; i++) | ||||
|   { | ||||
|     // Если обнаружили пороговое значение, которое больше текущей температуры - берем предыдущее и прерываем поиск
 | ||||
|     if (timeouts[i].temp > currentTemp) | ||||
|     { | ||||
|       i--; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // Если перебрали все пороги и температура выше - берем последний
 | ||||
|   if (i == timeouts_count) | ||||
|     i--; | ||||
| 
 | ||||
|   // Если значение индекса параметров таймаута для данной температуры неотрицательное, значит нужно произвести работу с реле на текущей температуре
 | ||||
|   if (0 <= i) | ||||
|   { | ||||
|     relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть
 | ||||
|     // Если время открытия ещё не истекло, то открываем реле
 | ||||
|     if (current_time < lastRelayTime + timeouts[i].openTime)   | ||||
|     { | ||||
|       relayState = HIGH;  | ||||
|     } | ||||
|     else // иначе,
 | ||||
|     // Если время привышает время закрытия, то необходимо сбросить время управления реле
 | ||||
|     if (current_time > lastRelayTime + timeouts[i].openTime + timeouts[i].closeTime)  | ||||
|     { | ||||
|       lastRelayTime = current_time;  | ||||
|     } | ||||
|   } | ||||
|   else // иначе, выключить реле
 | ||||
|     relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть
 | ||||
| 
 | ||||
|   digitalWrite(PIN_RELAY, relayState); // Изменяем значение сигнала на пине для управление реле
 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user