Files
drybox-core/src/main.c

106 lines
2.5 KiB
C

#include "common.h"
#include "bus/usart.h"
#include "bus/mosfet.h"
#include "bus/pwm.h"
#include "bus/i2c.h"
#include <avr/interrupt.h>
// TODO: Get readings from ADC ADS1115 over I2C.
// TODO: Implement optional sensor value check with CRC8.
// TODO: Set timeouts for polling based things like I2C.
// TODO: Write an improved serial parser (low priority).
// TODO: Either implement software PWM for the FAN03 timer
// (which will be quite complicated) or pick a chip with
// more than two 16-bit PWM outputs like the ATmega328PB.
// https://www.mikrocontroller.net/articles/Soft-PWM
int Init(void)
{
// MOSFETS control things like the heating element
// so they are the highest priority to initialize
// to a default state via MOS_Init().
MOS_Init();
// The serial interface is required for output
// functions like Info() and Error() and it uses
// IRQs, so we need to initialize it as soon as
// possible and make sure to enable interrupts.
USART_Init();
sei();
Info("Initializing...");
// There is a possiblity to use interrupt signals
// for I2C communication but only as one large
// branching routine for the whole I2C system.
// The blocking approach used right now is fine.
I2C_Init();
PWM_Init();
MOS_Enable(MOS03);
// MOS_Disable(MOS01);
// Only FAN01 and FAN02 are receiving the correct
// frequency (25 KHz) right now. The 16-bit timer on
// the ATMega32A has two outputs so it would require
// software PWM to have a variable frequency on PD7.
// A simple implementation will take up around 30-50
// percent of CPU time. Faster approaches are quite
// complicated so it might be worth it to switch to
// something like an ATmega328PB.
PWM_SetValue(FAN01, 50); // Fan Peltier Hot side
PWM_SetValue(FAN02, 50); // Fan Peltier Cold Side
// PWM_SetValue(FAN03, 20); // Fan Heating
// The I2C_SetChannel command changes the channel
// setting of the PCA9546 I2C multiplexer. Any
// command after it will be sent to the device
// listening on that channel.
I2C_SetChannel(AHT01);
I2C_AHT20_Init();
I2C_SetChannel(AHT02);
I2C_AHT20_Init();
I2C_SetChannel(AHT03);
I2C_AHT20_Init();
return 0;
}
void Update(void)
{
float temp, rhum;
I2C_SetChannel(AHT01);
if (I2C_AHT20_Read(&temp, &rhum))
Info("TEMP=%.2fC, RHUM=%.2f%", temp, rhum);
I2C_SetChannel(AHT02);
if (I2C_AHT20_Read(&temp, &rhum))
Info("TEMP=%.2fC, RHUM=%.2f%", temp, rhum);
I2C_SetChannel(AHT03);
if (I2C_AHT20_Read(&temp, &rhum))
Info("TEMP=%.2fC, RHUM=%.2f%", temp, rhum);
}
int main(void)
{
Init();
for (;;) {
Update();
Sleep(1000);
}
return 0;
}