Compare commits

..

6 commits

Author SHA1 Message Date
Imbus
2c4a1b1565 Restructure DHT22 code, move defines to header, remove redundant includes 2025-02-05 14:16:54 +01:00
Imbus
be4b394bed Pull trigger on formatting 2025-02-05 14:14:14 +01:00
Imbus
a770213f69 Clarify that F_CPU is define as a compiler flag 2025-02-05 14:12:32 +01:00
Imbus
f43efe2079 Format target 2025-02-05 14:12:07 +01:00
Imbus
84cd6bf99e More formatting options 2025-02-05 14:08:35 +01:00
Imbus
07ed9f1dcf Formatter + gitignore 2025-02-05 13:57:38 +01:00
13 changed files with 308 additions and 298 deletions

12
.clang-format Normal file
View file

@ -0,0 +1,12 @@
BasedOnStyle: LLVM
IndentWidth: 4 # Use 4 spaces for indentation
TabWidth: 4 # Tab width is also 4 spaces
UseTab: Never # Always use spaces instead of tabs
ColumnLimit: 80 # Wrap lines after 80 characters
AllowShortLoopsOnASingleLine: true
AlwaysBreakTemplateDeclarations: true
BreakConstructorInitializers: BeforeComma
AlignConsecutiveMacros: true
AlignConsecutiveAssignments: AcrossEmptyLines
AlignConsecutiveBitFields: AcrossEmptyLines
AlignConsecutiveDeclarations: AcrossEmptyLines

2
.gitignore vendored
View file

@ -10,12 +10,14 @@
# Build directories # Build directories
build/ build/
bin/ bin/
.cache
# IDE and editor files # IDE and editor files
.vscode/ .vscode/
.idea/ .idea/
*.sublime-project *.sublime-project
*.sublime-workspace *.sublime-workspace
compile_commands.json
# Dependency directories # Dependency directories
lib/ lib/

View file

@ -1,51 +1,53 @@
#include "config.h" #include "config.h"
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h> #include <stdbool.h>
#include <util/delay.h>
// Pin Definitions // Pin Definitions
#define ENCODER_A_PIN PD6 #define ENCODER_A_PIN PD6
#define ENCODER_B_PIN PD5 #define ENCODER_B_PIN PD5
#define ENCODER_C_PIN PD4 #define ENCODER_C_PIN PD4
#define ENCODER_D_PIN PD3 #define ENCODER_D_PIN PD3
#define ENCODER_OE_PIN PD2 #define ENCODER_OE_PIN PD2
#define ENCODER_DA_PIN PD1 #define ENCODER_DA_PIN PD1
void prepare_interrupt() { void prepare_interrupt() {
EICRA |= (1 << ISC00); // Any logical change triggers interrupt EICRA |= (1 << ISC00); // Any logical change triggers interrupt
EIMSK |= (1 << INT0); // INT0 external interrupt EIMSK |= (1 << INT0); // INT0 external interrupt
PCICR |= (1 << PCIE0); PCICR |= (1 << PCIE0);
} }
// Encoder Module // Encoder Module
void encoder_init() { void encoder_init() {
// Set A, B, C, D, and DA pins as inputs // Set A, B, C, D, and DA pins as inputs
DDRD &= ~((1 << ENCODER_A_PIN) | (1 << ENCODER_B_PIN) | (1 << ENCODER_C_PIN) | (1 << ENCODER_D_PIN) | (1 << ENCODER_DA_PIN)); DDRD &=
~((1 << ENCODER_A_PIN) | (1 << ENCODER_B_PIN) | (1 << ENCODER_C_PIN) |
// Set OE as output (1 << ENCODER_D_PIN) | (1 << ENCODER_DA_PIN));
DDRD |= (1 << ENCODER_OE_PIN);
// Set OE as output
// Enable internal pull-up resistors for A, B, C, D, and OE pins DDRD |= (1 << ENCODER_OE_PIN);
PORTD |= (1 << ENCODER_A_PIN) | (1 << ENCODER_B_PIN) | (1 << ENCODER_C_PIN) | (1 << ENCODER_D_PIN) | (1 << ENCODER_DA_PIN);
// Enable internal pull-up resistors for A, B, C, D, and OE pins
PORTD |= (1 << ENCODER_A_PIN) | (1 << ENCODER_B_PIN) |
(1 << ENCODER_C_PIN) | (1 << ENCODER_D_PIN) |
(1 << ENCODER_DA_PIN);
} }
uint8_t encoder_read() { uint8_t encoder_read() {
uint8_t encoder_data = 0; uint8_t encoder_data = 0;
// Set OE (Output Enable) pin low to enable the encoder
PORTD &= ~(1 << ENCODER_OE_PIN);
_delay_us(1);
// Read the state of the encoder // Set OE (Output Enable) pin low to enable the encoder
encoder_data = PIND >> (ENCODER_A_PIN - 3); PORTD &= ~(1 << ENCODER_OE_PIN);
encoder_data &= 0x0F; _delay_us(1);
// Set OE pin high to disable the encoder // Read the state of the encoder
PORTD |= (1 << ENCODER_OE_PIN); encoder_data = PIND >> (ENCODER_A_PIN - 3);
encoder_data &= 0x0F;
return encoder_data;
// Set OE pin high to disable the encoder
PORTD |= (1 << ENCODER_OE_PIN);
return encoder_data;
} }
bool encoder_available() { bool encoder_available() { return (PIND & (1 << ENCODER_DA_PIN)); }
return (PIND & (1 << ENCODER_DA_PIN));
}

View file

@ -1,8 +1,8 @@
#ifndef H74C922_H #ifndef H74C922_H
#define H74C922_H #define H74C922_H
void encoder_init(); void encoder_init();
uint8_t encoder_read(); uint8_t encoder_read();
bool encoder_available(); bool encoder_available();
#endif // 74C922_H #endif // 74C922_H

110
DHT22.c
View file

@ -1,78 +1,62 @@
#include "config.h" #include "DHT22.h"
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h> #include <stdbool.h>
#include <util/delay.h>
#include "GDM1602K.h"
#define DATAPIN PC0
#define PORT PORTC
#define PIN PINC
#define DDR DDRC
bool is_high() {
return (PIN & (1 << DATAPIN));
}
// Function to read data from the DHT22 sensor // Function to read data from the DHT22 sensor
int DHT22_Read(int *temperature, int *humidity) int DHT22_Read(int *temperature, int *humidity) {
{ // Set the data pin as output
// Set the data pin as output DDR |= (1 << DATAPIN);
DDR |= (1 << DATAPIN); PORT |= (1 << DATAPIN); // Set the pin high, if not already pulled up
PORT |= (1 << DATAPIN); // Set the pin high, if not already pulled up
_delay_ms(100); _delay_ms(100);
// Send start signal
PORT &= ~(1 << DATAPIN); // Set the pin low
_delay_us(500); // Hold it for a while
PORT |= (1 << DATAPIN); // Set the pin high
DDR &= ~(1 << DATAPIN); // Data direction in
_delay_us(20); // Wait for 40 microseconds // Send start signal
PORT &= ~(1 << DATAPIN); // Set the pin low
_delay_us(500); // Hold it for a while
PORT |= (1 << DATAPIN); // Set the pin high
DDR &= ~(1 << DATAPIN); // Data direction in
// Sensor should have pulled low here _delay_us(20); // Wait for 40 microseconds
if(PIN & (1 << DATAPIN)) return -2;
_delay_us(80); // Wait for 80 microseconds // Sensor should have pulled low here
if (PIN & (1 << DATAPIN))
return -2;
// Sensor should have pulled high here _delay_us(80); // Wait for 80 microseconds
if(!(PIN & (1 << DATAPIN))) return -1;
// Read data from the sensor // Sensor should have pulled high here
uint8_t data[5] = {0, 0, 0, 0, 0}; if (!(PIN & (1 << DATAPIN)))
uint8_t bitMask = 0x80; // All zeroes with MSB high return -1;
uint8_t byteIndex = 0;
for (byteIndex = 0; byteIndex < 5; byteIndex++) // Read data from the sensor
{ uint8_t data[5] = {0, 0, 0, 0, 0};
for (bitMask = 0x80; bitMask != 0; bitMask >>= 1) uint8_t bitMask = 0x80; // All zeroes with MSB high
{ uint8_t byteIndex = 0;
// Wait for the data bit to go low
while (!(PIN & (1 << PC0)))
;
// Wait for the data bit to go high
_delay_us(20);
if (PIN & (1 << PC0))
data[byteIndex] |= bitMask;
// Wait for the data bit to go low (end of bit)
while (PIN & (1 << PC0))
;
}
}
// Verify checksum for (byteIndex = 0; byteIndex < 5; byteIndex++) {
uint8_t checksum = data[0] + data[1] + data[2] + data[3]; for (bitMask = 0x80; bitMask != 0; bitMask >>= 1) {
if (checksum != data[4]) // Wait for the data bit to go low
return -1; while (!(PIN & (1 << PC0)));
// Extract temperature and humidity // Wait for the data bit to go high
*humidity = ((data[0] << 8) | data[1]); _delay_us(20);
*temperature = ((data[2] << 8) | data[3]); if (PIN & (1 << PC0))
data[byteIndex] |= bitMask;
return 0; // Wait for the data bit to go low (end of bit)
while (PIN & (1 << PC0));
}
}
// Verify checksum
uint8_t checksum = data[0] + data[1] + data[2] + data[3];
if (checksum != data[4])
return -1;
// Extract temperature and humidity
*humidity = ((data[0] << 8) | data[1]);
*temperature = ((data[2] << 8) | data[3]);
return 0;
} }

View file

@ -1,7 +1,12 @@
#ifndef DHT22_H #ifndef DHT22_H
#define DHT22_H #define DHT22_H
int DHT22_Read(int *temperature, int *humidity); #define DATAPIN PC0
#define PORT PORTC
#define PIN PINC
#define DDR DDRC
int DHT22_Read(int *temperature, int *humidity);
void DHT22_Init(); void DHT22_Init();
#endif /* DHT22_H */ #endif /* DHT22_H */

View file

@ -1,141 +1,141 @@
#include "config.h" #include "config.h"
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h> #include <stdbool.h>
#include <util/delay.h>
#define LCD_DATA_PORT PORTB #define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR DDRB #define LCD_DATA_DDR DDRB
#define LCD_RS_PIN PB1 #define LCD_RS_PIN PB1
#define LCD_EN_PIN PB2 #define LCD_EN_PIN PB2
#define LCD_DB4 PB3 #define LCD_DB4 PB3
#define LCD_DB5 PB4 #define LCD_DB5 PB4
#define LCD_DB6 PB5 #define LCD_DB6 PB5
#define LCD_DB7 PB6 #define LCD_DB7 PB6
// Delay constants from the datasheet. These are mostly in nanoseconds // Delay constants from the datasheet. These are mostly in nanoseconds
#define LAG 10 #define LAG 10
#define TW 300 #define TW 300
#define TSU1 100 #define TSU1 100
void lcd_4bit_init() { void lcd_4bit_init() {
LCD_DATA_DDR = 0xFF; LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = (1 << LCD_DB5); LCD_DATA_PORT = (1 << LCD_DB5);
LCD_DATA_PORT &= ~(1 << LCD_RS_PIN); LCD_DATA_PORT &= ~(1 << LCD_RS_PIN);
_delay_us(1); _delay_us(1);
LCD_DATA_PORT |= (1 << LCD_EN_PIN); LCD_DATA_PORT |= (1 << LCD_EN_PIN);
_delay_us(1); _delay_us(1);
LCD_DATA_PORT &= ~(1 << LCD_EN_PIN); LCD_DATA_PORT &= ~(1 << LCD_EN_PIN);
_delay_us(1); _delay_us(1);
LCD_DATA_PORT &= ~(1 << LCD_DB5); LCD_DATA_PORT &= ~(1 << LCD_DB5);
_delay_us(1); _delay_us(1);
} }
void lcd_send(bool rs, uint8_t data) { void lcd_send(bool rs, uint8_t data) {
LCD_DATA_DDR = 0xFF; LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00; LCD_DATA_PORT = 0x00;
LCD_DATA_PORT |= (data >> 4) << 3; LCD_DATA_PORT |= (data >> 4) << 3;
_delay_us(1); _delay_us(1);
// If rs (actual text data), set RS pin high
if(rs == true) LCD_DATA_PORT |= (1 << LCD_RS_PIN);
// Pulse enable // If rs (actual text data), set RS pin high
_delay_ms(2); if (rs == true)
LCD_DATA_PORT |= (1 << LCD_EN_PIN); LCD_DATA_PORT |= (1 << LCD_RS_PIN);
_delay_us(1); // Pulse enable
LCD_DATA_PORT &= ~(1 << LCD_EN_PIN); _delay_ms(2);
LCD_DATA_PORT |= (1 << LCD_EN_PIN);
//_delay_us(1); _delay_us(1);
LCD_DATA_PORT &= ~(1 << LCD_EN_PIN);
// Clear data pins
LCD_DATA_PORT &= ~(0x0F << 3); //_delay_us(1);
// Mask the lower bits and shift accordingly // Clear data pins
LCD_DATA_PORT |= (data & 0x0F) << 3; LCD_DATA_PORT &= ~(0x0F << 3);
_delay_us(1);
// Mask the lower bits and shift accordingly
// Pulse enable LCD_DATA_PORT |= (data & 0x0F) << 3;
LCD_DATA_PORT |= (1 << LCD_EN_PIN); _delay_us(1);
_delay_us(1);
LCD_DATA_PORT &= ~(1 << LCD_EN_PIN); // Pulse enable
_delay_us(1); LCD_DATA_PORT |= (1 << LCD_EN_PIN);
LCD_DATA_PORT &= ~(0x0F << 3); _delay_us(1);
LCD_DATA_PORT &= ~(1 << LCD_EN_PIN);
LCD_DATA_PORT &= ~(1 << LCD_RS_PIN); // RS Low _delay_us(1);
LCD_DATA_PORT &= ~(0x0F << 3);
LCD_DATA_PORT &= ~(1 << LCD_RS_PIN); // RS Low
} }
void lcd_init() { void lcd_init() {
_delay_ms(100); _delay_ms(100);
lcd_4bit_init(); lcd_4bit_init();
//lcd_send(1, 0b01111000); // lcd_send(1, 0b01111000);
lcd_send(0, 0x01); // Clear screen lcd_send(0, 0x01); // Clear screen
lcd_send(0, 0x02); // Return home lcd_send(0, 0x02); // Return home
lcd_send(0, 0b00001100); // Display on, no cursor lcd_send(0, 0b00001100); // Display on, no cursor
lcd_send(0, 0b00101000); lcd_send(0, 0b00101000);
} }
void lcd_clear() { void lcd_clear() { lcd_send(0, 0x01); }
lcd_send(0, 0x01);
}
void test_leds() { void test_leds() {
DDRB |= 0xFF; DDRB |= 0xFF;
PORTB = (1 << LCD_DB4); PORTB = (1 << LCD_DB4);
_delay_us(1); _delay_us(1);
PORTB = (1 << LCD_DB5); PORTB = (1 << LCD_DB5);
_delay_us(1); _delay_us(1);
PORTB = (1 << LCD_DB6); PORTB = (1 << LCD_DB6);
_delay_us(1); _delay_us(1);
PORTB = (1 << LCD_DB7); PORTB = (1 << LCD_DB7);
_delay_us(1); _delay_us(1);
PORTB = (1 << LCD_EN_PIN); PORTB = (1 << LCD_EN_PIN);
_delay_us(1); _delay_us(1);
PORTB = (1 << LCD_RS_PIN); PORTB = (1 << LCD_RS_PIN);
_delay_us(1); _delay_us(1);
PORTB = 0x00; PORTB = 0x00;
} }
void lcd_set_cursor(uint8_t row, uint8_t col) { void lcd_set_cursor(uint8_t row, uint8_t col) {
uint8_t position = 0x80; uint8_t position = 0x80;
if (row == 1) position += 0x40; if (row == 1)
position += 0x40;
position += col;
lcd_send(0, position); position += col;
lcd_send(0, position);
} }
// Takes a string and splits it over two lines if needed. Max length is 32 characters. // Takes a string and splits it over two lines if needed. Max length is 32
void lcd_write_string(const char* string) { // characters.
uint8_t i = 0; void lcd_write_string(const char *string) {
while(string[i]) { uint8_t i = 0;
if(i == 16) { while (string[i]) {
lcd_set_cursor(1, 0); if (i == 16) {
while(string[i] == ' ') i++; // Skip leading spaces on the new line lcd_set_cursor(1, 0);
} while (string[i] == ' ') i++; // Skip leading spaces on the new line
lcd_send(1, string[i]); }
i++; lcd_send(1, string[i]);
} i++;
}
} }
// Takes two separate strings and prints them on their corresponding row // Takes two separate strings and prints them on their corresponding row
void lcd_write_strings(const char* top, const char* bottom) { void lcd_write_strings(const char *top, const char *bottom) {
uint8_t i = 0; uint8_t i = 0;
while (top[i]) { while (top[i]) {
lcd_send(1, top[i]); lcd_send(1, top[i]);
i++; i++;
} }
i = 0; i = 0;
lcd_set_cursor(1, 0); lcd_set_cursor(1, 0);
while(bottom[i]) { while (bottom[i]) {
lcd_send(1, bottom[i]); lcd_send(1, bottom[i]);
i++; i++;
} }
} }

View file

@ -1,8 +1,8 @@
#ifndef GDM1602K_H_ #ifndef GDM1602K_H_
#define GDM1602K_H_ #define GDM1602K_H_
void lcd_write_strings(const char* top, const char* bottom); void lcd_write_strings(const char *top, const char *bottom);
void lcd_write_string(const char* string); void lcd_write_string(const char *string);
void lcd_init(); void lcd_init();
void lcd_clear(); void lcd_clear();

20
LM335.c
View file

@ -1,10 +1,9 @@
#include "LM335.h"
#include "config.h" #include "config.h"
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h> #include <util/delay.h>
#include "LM335.h"
void ADC_Init() void ADC_Init() {
{
// Set AVCC as the voltage reference with external capacitor at AREF pin // Set AVCC as the voltage reference with external capacitor at AREF pin
ADMUX = (1 << REFS0); ADMUX = (1 << REFS0);
@ -15,8 +14,7 @@ void ADC_Init()
ADCSRA |= (1 << ADEN); // | (1 << ADIE); ADCSRA |= (1 << ADEN); // | (1 << ADIE);
} }
uint16_t ADC_Read(uint8_t channel) uint16_t ADC_Read(uint8_t channel) {
{
// Select ADC channel // Select ADC channel
ADMUX = (ADMUX & 0xF8) | (channel & 0x07); ADMUX = (ADMUX & 0xF8) | (channel & 0x07);
@ -24,21 +22,19 @@ uint16_t ADC_Read(uint8_t channel)
ADCSRA |= (1 << ADSC); ADCSRA |= (1 << ADSC);
// Wait for ADC conversion to complete // Wait for ADC conversion to complete
while (ADCSRA & (1 << ADSC)) while (ADCSRA & (1 << ADSC));
;
// Read ADC result // Read ADC result
return ADC; return ADC;
} }
float LM335_ReadTemperature() float LM335_ReadTemperature() {
{
// Read ADC value from LM335 pin (PA0) // Read ADC value from LM335 pin (PA0)
uint16_t adcValue = ADC_Read(0x00); uint16_t adcValue = ADC_Read(0x00);
float vref = 4.64; float vref = 4.64;
int vfactor = 100; int vfactor = 100;
float voltage = (adcValue * vref) / 1024; float voltage = (adcValue * vref) / 1024;
// Calculate temperature in Celsius using LM335 formula // Calculate temperature in Celsius using LM335 formula
float temperature = (voltage - 2.92) * vfactor; float temperature = (voltage - 2.92) * vfactor;

View file

@ -1,13 +1,13 @@
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h> #include <util/delay.h>
#ifndef LM335_H_ #ifndef LM335_H_
#define LM335_H_ #define LM335_H_
#define LM335_PIN PA0 #define LM335_PIN PA0
void ADC_Init(); void ADC_Init();
uint16_t ADC_Read(uint8_t channel); uint16_t ADC_Read(uint8_t channel);
float LM335_ReadTemperature(); float LM335_ReadTemperature();
#endif #endif

View file

@ -1,6 +1,7 @@
#ifndef CONFIG_H #ifndef CONFIG_H
#define CONFIG_H #define CONFIG_H
//#define F_CPU 1600000UL // This is passed as a compiler flag (CFLAGS += -DF_CPU=16000000UL)
// #define F_CPU 1600000UL
#endif // CONFIG_H #endif // CONFIG_H

147
main.c
View file

@ -2,93 +2,98 @@
#include <avr/io.h> #include <avr/io.h>
#include <stdbool.h> #include <stdbool.h>
#include <util/delay.h>
#include <stdio.h> #include <stdio.h>
#include <util/delay.h>
#include "74C922.h" #include "74C922.h"
#include "DHT22.h" #include "DHT22.h"
#include "GDM1602K.h" #include "GDM1602K.h"
#include "LM335.h" #include "LM335.h"
enum DisplayMode {TEMP, AVG}; enum DisplayMode { TEMP, AVG };
bool b = false; bool b = false;
int main() { int main() {
_delay_ms(1000); // Boot up time, let components catch up _delay_ms(1000); // Boot up time, let components catch up
lcd_init(); lcd_init();
encoder_init(); encoder_init();
lcd_clear(); lcd_clear();
lcd_write_string("Hello, world!"); lcd_write_string("Hello, world!");
int temp, hum; int temp, hum;
char celc_str[30]; char celc_str[30];
char temp_with_unit[20] = ""; char temp_with_unit[20] = "";
char hum_str[30]; char hum_str[30];
float celcius = 0.0; float celcius = 0.0;
float humidity = 0.0; float humidity = 0.0;
char temp_unit = 'C'; char temp_unit = 'C';
uint8_t button_data; uint8_t button_data;
char btn_string[30]; char btn_string[30];
bool btn_just_pressed = false; bool btn_just_pressed = false;
long loops = 0; long loops = 0;
while(1) { while (1) {
// If encoder has data available // If encoder has data available
if(encoder_available() == true) { if (encoder_available() == true) {
loops = 0xFFFF; loops = 0xFFFF;
if(!btn_just_pressed) { if (!btn_just_pressed) {
btn_just_pressed = true; btn_just_pressed = true;
button_data = encoder_read(); button_data = encoder_read();
sprintf(btn_string, "Knapp %d", button_data); sprintf(btn_string, "Knapp %d", button_data);
lcd_clear(); lcd_clear();
if(button_data == 11) { if (button_data == 11) {
if(temp_unit == 'C') temp_unit = 'F'; if (temp_unit == 'C')
else if(temp_unit == 'F') temp_unit = 'K'; temp_unit = 'F';
else if(temp_unit == 'K') temp_unit = 'C'; else if (temp_unit == 'F')
loops = 0; temp_unit = 'K';
} else if (temp_unit == 'K')
if(button_data == 3) { temp_unit = 'C';
sprintf(celc_str, "10h Tmp: %s", temp_with_unit); loops = 0;
sprintf(hum_str, "10h Hum: %.1f%%", humidity-1); }
lcd_write_strings(celc_str, hum_str); if (button_data == 3) {
} sprintf(celc_str, "10h Tmp: %s", temp_with_unit);
} sprintf(hum_str, "10h Hum: %.1f%%", humidity - 1);
} else { lcd_write_strings(celc_str, hum_str);
btn_just_pressed = false; }
} }
} else {
if(loops == 0) { btn_just_pressed = false;
loops = 0x2FFFF; }
int result = DHT22_Read(&temp, &hum); if (loops == 0) {
loops = 0x2FFFF;
lcd_clear(); int result = DHT22_Read(&temp, &hum);
if(result == 0) { lcd_clear();
celcius = ((float)temp)/10.0;
humidity = ((float) hum)/10.0; if (result == 0) {
switch(temp_unit) { celcius = ((float)temp) / 10.0;
case 'C': humidity = ((float)hum) / 10.0;
sprintf(temp_with_unit, "%.1f %c", celcius, temp_unit); switch (temp_unit) {
break; case 'C':
case 'F': sprintf(temp_with_unit, "%.1f %c", celcius, temp_unit);
sprintf(temp_with_unit, "%.1f %c", celcius*9/5+32, temp_unit); break;
break; case 'F':
case 'K': sprintf(temp_with_unit, "%.1f %c", celcius * 9 / 5 + 32,
sprintf(temp_with_unit, "%.1f %c", celcius + 273.15, temp_unit); temp_unit);
break; break;
} case 'K':
sprintf(celc_str, "Temp: %s", temp_with_unit); sprintf(temp_with_unit, "%.1f %c", celcius + 273.15,
sprintf(hum_str, "Humidity: %.1f%%", humidity); temp_unit);
break;
lcd_write_strings(celc_str, hum_str); }
} sprintf(celc_str, "Temp: %s", temp_with_unit);
} sprintf(hum_str, "Humidity: %.1f%%", humidity);
loops--;
} lcd_write_strings(celc_str, hum_str);
lcd_write_string("Exited..."); }
}
loops--;
}
lcd_write_string("Exited...");
} }

View file

@ -43,6 +43,9 @@ flash: $(TARGET).hex
qemu: $(TARGET).elf qemu: $(TARGET).elf
qemu-system-avr -machine $(QEMU_MACHINE_NAME) -bios $(TARGET).elf qemu-system-avr -machine $(QEMU_MACHINE_NAME) -bios $(TARGET).elf
format:
find . -type f \( -name "*.c" -o -name "*.h" \) -exec clang-format -i {} +
# Clean # Clean
clean: clean:
rm -f $(OBJS) $(TARGET).elf $(TARGET).hex rm -f $(OBJS) $(TARGET).elf $(TARGET).hex