Правки по логике
This commit is contained in:
		
							parent
							
								
									02cf73cda7
								
							
						
					
					
						commit
						b514cedf4c
					
				| @ -1,9 +1,9 @@ | ||||
| #include <microDS18B20.h> | ||||
| #include <microDS18B20.h> // Датчик температуры | ||||
| 
 | ||||
| // Отладка вывода
 | ||||
| #define DEBUG 1 | ||||
| // Отладка ввода
 | ||||
| #define DEBUG_INPUT 1 | ||||
| // Отладка ввода температуры
 | ||||
| #define DEBUG_INPUT 0 | ||||
| 
 | ||||
| // Пин датчика температуры
 | ||||
| #define PIN_SENSOR 2 | ||||
| @ -19,8 +19,8 @@ MicroDS18B20<PIN_SENSOR> sensor;  // датчик на пине D2 | ||||
| struct | ||||
| { | ||||
|   float temp; | ||||
|   int openTime; | ||||
|   int closeTime; | ||||
|   uint32_t openTime; | ||||
|   uint32_t closeTime; | ||||
| } timeouts[MAX_TIMEOUTS]; | ||||
| 
 | ||||
| int timeouts_count = 0; // Общее количество зарегистрированных данных о тем-ре и таймаутах
 | ||||
| @ -29,7 +29,7 @@ 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 | ||||
| #define SEC_TO_MSEC(time) (long)time*1000 | ||||
| 
 | ||||
| void setup()  | ||||
| { | ||||
| @ -72,35 +72,44 @@ void setup() | ||||
|   // Настройка реле
 | ||||
|   pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
 | ||||
|   digitalWrite(PIN_RELAY, LOW); // Выключаем реле - посылаем сигнал 0
 | ||||
|    | ||||
|   // запрашиваем новое измерение с датчика
 | ||||
|   sensor.requestTemp();  | ||||
|    | ||||
| } | ||||
| 
 | ||||
| uint32_t tmr; // Для таймера опроса датчика
 | ||||
| uint32_t lastRelayTime = 0; // Для управления реле
 | ||||
| float currentTemp; // Текущая температура
 | ||||
| 
 | ||||
| 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)  | ||||
|    | ||||
| #if DEBUG_INPUT == 1 | ||||
|   byte n = Serial.available(); | ||||
|   if (n == 0)  | ||||
|   { | ||||
|     currentTemp = Serial.parseFloat(); | ||||
|   } | ||||
| #endif // DEBUG_INPUT
 | ||||
|   // конструкция программного таймера на 800 мс
 | ||||
|   if (current_time - tmr >= 800)  | ||||
|   { | ||||
|     // Обновляем переменную для таймера опроса датчика
 | ||||
|     tmr = current_time; | ||||
|     // читаем прошлое значение
 | ||||
|     if (sensor.readTemp())  | ||||
|     { | ||||
| #if DEBUG_INPUT == 0 | ||||
|       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"); | ||||
|       Serial.println("sensor.readTemp error"); | ||||
| #endif // DEBUG
 | ||||
|     // запрашиваем новое измерение
 | ||||
|     sensor.requestTemp(); | ||||
| @ -123,10 +132,27 @@ void loop() | ||||
|   if (i == timeouts_count) | ||||
|     i--; | ||||
| 
 | ||||
|   // Если значение индекса параметров таймаута для данной температуры неотрицательное, значит нужно произвести работу с реле на текущей температуре
 | ||||
|   relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть
 | ||||
|   // Если значение индекса параметров таймаута для данной температуры неотрицательное, значит нужно произвести работу с реле на текущей 
 | ||||
|    | ||||
| #if DEBUG == 1 | ||||
|     Serial.print("Temp: "); | ||||
|     Serial.print(currentTemp); | ||||
|     Serial.print(" Time: "); | ||||
|     Serial.print(current_time); | ||||
|     Serial.print(" Relay: "); | ||||
|     Serial.print(lastRelayTime); | ||||
|     Serial.print(" index: "); | ||||
|     Serial.print(i); | ||||
| #endif // DEBUG
 | ||||
|   if (0 <= i) | ||||
|   { | ||||
|     relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть
 | ||||
| #if DEBUG == 1 | ||||
|     Serial.print(" openTime: "); | ||||
|     Serial.print(timeouts[i].openTime); | ||||
|     Serial.print(" closeTime: "); | ||||
|     Serial.print(timeouts[i].closeTime); | ||||
| #endif // DEBUG
 | ||||
|     // Если время открытия ещё не истекло, то открываем реле
 | ||||
|     if (current_time < lastRelayTime + timeouts[i].openTime)   | ||||
|     { | ||||
| @ -134,13 +160,22 @@ void loop() | ||||
|     } | ||||
|     else // иначе,
 | ||||
|     // Если время привышает время закрытия, то необходимо сбросить время управления реле
 | ||||
|     if (current_time > lastRelayTime + timeouts[i].openTime + timeouts[i].closeTime)  | ||||
|     if (current_time > lastRelayTime + timeouts[i].openTime + timeouts[i].closeTime | ||||
|     ||  !lastRelayTime)  | ||||
|     { | ||||
|       lastRelayTime = current_time;  | ||||
|     } | ||||
|   } | ||||
|   else // иначе, выключить реле
 | ||||
|   { | ||||
|     relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть
 | ||||
|     lastRelayTime = 0; | ||||
|   } | ||||
|    | ||||
| #if DEBUG == 1 | ||||
|   Serial.println(""); | ||||
| #endif // DEBUG
 | ||||
| 
 | ||||
|   digitalWrite(PIN_RELAY, relayState); // Изменяем значение сигнала на пине для управление реле
 | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user