#include "main.h"
#include "ssd1306.h"
#include "fonts.h"
// ---------------------- Pin Mapping -----------------------
#define RELAY_PIN GPIO_PIN_3 // PB3
#define BUZZER_PIN GPIO_PIN_4 // PB4
#define RELAY_PORT GPIOB
#define BUZZER_PORT GPIOB
ADC_HandleTypeDef hadc1;
I2C_HandleTypeDef hi2c1;
// ---------------------- Function Prototypes -----------------------
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_I2C1_Init(void);
// ---------------------- MAIN PROGRAM -----------------------
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_I2C1_Init();
SSD1306_Init();
uint32_t adc_raw;
uint16_t adc_10bit;
uint32_t relay_start = 0;
uint8_t relay_on = 0;
while (1)
{
// ------------ Read ADC (12-bit) ------------
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
adc_raw = HAL_ADC_GetValue(&hadc1);
// Convert 12-bit (0–4095) → 10-bit (0–1023)
adc_10bit = adc_raw >> 2;
// ------------ Relay 1-minute Timer ------------
if (!relay_on)
{
HAL_GPIO_WritePin(RELAY_PORT, RELAY_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET);
relay_on = 1;
relay_start = HAL_GetTick();
}
if (relay_on && (HAL_GetTick() - relay_start >= 60000))
{
HAL_GPIO_WritePin(RELAY_PORT, RELAY_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
relay_on = 0;
}
// ------------ I2C OLED Display ------------
SSD1306_Fill(SSD1306_COLOR_BLACK);
SSD1306_GotoXY(0, 0);
SSD1306_Puts("STM32 Relay Sys", &Font_7x10, 1);
SSD1306_GotoXY(0, 20);
SSD1306_Puts("ADC(10-bit):", &Font_7x10, 1);
char buffer[20];
sprintf(buffer, "%d", adc_10bit);
SSD1306_GotoXY(90, 20);
SSD1306_Puts(buffer, &Font_7x10, 1);
SSD1306_GotoXY(0, 40);
SSD1306_Puts(relay_on ? "Relay: ON" : "Relay: OFF", &Font_7x10, 1);
SSD1306_UpdateScreen();
HAL_Delay(200);
}
}
// ---------------------- GPIO -----------------------
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = RELAY_PIN | BUZZER_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
// ---------------------- ADC -----------------------
static void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 12-bit
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
HAL_ADC_Init(&hadc1);
}
// ---------------------- I2C -----------------------
static void MX_I2C1_Init(void)
{
__HAL_RCC_I2C1_CLK_ENABLE();
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
HAL_I2C_Init(&hi2c1);
}
// ---------------------- System Clock -----------------------
void SystemClock_Config(void)
{
// Using Nucleo default
}