STM32_10.FullFish_STM32F411Ce

Full Fish Aquarium Controller

Pełny kontroler akwarium z systemem alarmów, konfiguracją i interfejsem użytkownika. Rozszerzenie projektu STM32_11.KMU_FishSTM32G030F6P6.

STM32F4C++HALRTCTemperatureDisplayMenuAlarm

Informacje

  • Repozytorium: STM32_10.FullFish_STM32F411Ce
  • Płytka / obszar: STM32F411CEU6 / RTC / Temperature / Display
  • Kategoria: Automation
  • Status: Public repository

Opis techniczny

  • Projekt jest rozszerzeniem i rozbudowaniem projektu STM32_11.KMU_FishSTM32G030F6P6, który był prostym sterownikiem zabezpieczenia poziomu wody.
  • Nowy projekt oferuje pełny system kontroli akwarium z funkcjami alarmów, konfiguracji i interfejsu użytkownika.
  • System obsługuje czujniki temperatury, sterowanie światłem i grzałką, monitorowanie poziomu wody oraz zarządzanie czasem RTC.
  • Projekt wykorzystuje zaawansowaną strukturę menu z obsługą enkodera i przycisków do konfiguracji systemu.
  • Funkcje alarmowe pozwalają automatycznie włączać/wyłączać światło i grzałkę w zależności od ustawień i temperatury wody.
  • System korzysta z pamięci EEPROM AT24C32 do przechowywania konfiguracji i danych systemowych.

Co dzieje się w kodzie

Wybrane najważniejsze mechanizmy z projektu.

  • Projekt wykorzystuje architekturę opartą na interfejsach (IConfigStorage, IAlarmRTC, ITemperatureSensor) dla lepszej modularności.
  • System alarmów (AlarmRTC) obsługuje automatyczne włączanie/wyłączanie światła i grzałki zgodnie z ustawieniami.
  • Menu system oparty na BuildMenu.cpp umożliwia rozbudowane konfigurowanie systemu z wykorzystaniem enkodera i przycisków.
  • Sterowanie temperaturą realizowane przez DS18B20Sensor z obsługą 1-Wire i timerem do generowania opóźnień.
  • Konfiguracja przechowywana w EEPROM AT24C32 z obsługą ładowania i zapisu danych konfiguracyjnych.
  • Zarządzanie czasem RTC z synchronizacją systemową i funkcjami alarmowymi.

Kluczowe fragmenty kodu

Kod jest skrócony do części istotnych dla zrozumienia projektu.

System alarmów RTC

Core/Src/AlarmRTC.cpp
void alarmRTC::ActionAlarms()
{
	HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
	
	if(_config->lightConfig.PowerOnOffLithtAuto == 1 && _config->lightConfig.PowerOnOffLithtManual == 0)
	{
		if(compareTime(&time, &_config->lightConfig.PowerOnLight) && _config->lightConfig.gpio.Enabled == 0)
		{
			_config->lightConfig.gpio.Enabled = 1;
			HAL_GPIO_WritePin(_config->lightConfig.gpio.port,_config->lightConfig.gpio.pin, GPIO_PIN_RESET);
		}

		if(compareTime(&time, &_config->lightConfig.PowerOffLight) && _config->lightConfig.gpio.Enabled == 1)
		{
			_config->lightConfig.gpio.Enabled = 0;
			HAL_GPIO_WritePin(_config->lightConfig.gpio.port,_config->lightConfig.gpio.pin, GPIO_PIN_SET);
		}
	}

	if(_config->heaterConfig.PowerOnOffHeaterAuto == 1 && _config->heaterConfig.PowerOnOffHeaterManual == 0)
	{
		int16_t temp = (int16_t)lroundf(SensorTemp);

		if((temp < _config->heaterConfig.TempMinONHeater  ) && (_config->heaterConfig.gpio.Enabled == 0))
		{
			_config->heaterConfig.gpio.Enabled = 1;
			HAL_GPIO_WritePin(_config->heaterConfig.gpio.port,_config->heaterConfig.gpio.pin, GPIO_PIN_RESET);
		}

		if((temp >_config->heaterConfig.TempMaxOffHeater  && temp > _config->heaterConfig.TempMinONHeater) && (_config->heaterConfig.gpio.Enabled == 1))
		{
			_config->heaterConfig.gpio.Enabled = 0;
			HAL_GPIO_WritePin(_config->heaterConfig.gpio.port,_config->heaterConfig.gpio.pin, GPIO_PIN_SET);
		}
	}
}

Funkcja ActionAlarms obsługuje automatyczne włączanie/wyłączanie światła i grzałki zgodnie z ustawieniami czasowymi i temperaturą wody. Wykorzystuje RTC do sprawdzania aktualnego czasu.

Konfiguracja menu

Core/Src/BuildMenu.cpp
static MenuItem miLightManualOnOff  {"Manual  wl/wyl ",[](){
	Action_SetOnOff(&aquaConfig.lightConfig.PowerOnOffLithtManual,true);
	if(aquaConfig.lightConfig.PowerOnOffLithtManual == 1)
	{
		aquaConfig.lightConfig.gpio.Enabled = 1;
		HAL_GPIO_WritePin(aquaConfig.lightConfig.gpio.port,aquaConfig.lightConfig.gpio.pin, GPIO_PIN_RESET);
	}
	else
	{
		aquaConfig.lightConfig.gpio.Enabled = 0;
		HAL_GPIO_WritePin(aquaConfig.lightConfig.gpio.port,aquaConfig.lightConfig.gpio.pin, GPIO_PIN_SET);
	}
}, {}};
static MenuItem miLightAutoOnOff  	{"Automat wl/wyl ",[](){Action_SetOnOff(&aquaConfig.lightConfig.PowerOnOffLithtAuto,false);}, {}};

Przykład konfiguracji menu dla sterowania światłem - obsługuje zarówno tryb ręczny, jak i automatyczny z funkcjami ustawiającymi flagi i sterującymi GPIO.

Sterowanie temperaturą DS18B20

Core/Src/TemperatureSensors.cpp
DS18B20Sensor::DS18B20Sensor(GPIO_TypeDef* dqPort, uint16_t dqPin, TIM_HandleTypeDef* htim)
: dqPort_(dqPort), dqPin_(dqPin), htim_(htim)
{
    // Timer do µs powinien już działać (HAL_TIM_Base_Start)
    // Linia 1-Wire w spoczynku ma być "puszczona" (input) + podciągnięta rezystorem 4.7k do 3.3V.
    LineInput();
}

void DS18B20Sensor::DelayUs(uint16_t us)
{
    // Założenie: timer tyka 1 MHz => 1 tick = 1 µs
    __HAL_TIM_SET_COUNTER(htim_, 0);
    while (__HAL_TIM_GET_COUNTER(htim_) < us) { }
}

Klasa DS18B20Sensor implementuje sterowanie czujnikiem temperatury typu DS18B20 z wykorzystaniem magistrali 1-Wire i timerów do generowania opóźnień.