Compare commits

..

No commits in common. "2c4a1b15652453363850bfc41611ab696450de57" and "f6b4a91e7197a6283383889d7e89f857b11fcf1b" have entirely different histories.

13 changed files with 298 additions and 308 deletions

View file

@ -1,12 +0,0 @@
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,14 +10,12 @@
# Build directories
build/
bin/
.cache
# IDE and editor files
.vscode/
.idea/
*.sublime-project
*.sublime-workspace
compile_commands.json
# Dependency directories
lib/

View file

@ -1,7 +1,7 @@
#include "config.h"
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
#include <stdbool.h>
// Pin Definitions
#define ENCODER_A_PIN PD6
@ -20,17 +20,13 @@ void prepare_interrupt() {
// Encoder Module
void encoder_init() {
// 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) | (1 << ENCODER_D_PIN) | (1 << ENCODER_DA_PIN));
// Set OE as output
DDRD |= (1 << ENCODER_OE_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);
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() {
@ -50,4 +46,6 @@ uint8_t encoder_read() {
return encoder_data;
}
bool encoder_available() { return (PIND & (1 << ENCODER_DA_PIN)); }
bool encoder_available() {
return (PIND & (1 << ENCODER_DA_PIN));
}

38
DHT22.c
View file

@ -1,10 +1,23 @@
#include "DHT22.h"
#include "config.h"
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
#include <stdbool.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
int DHT22_Read(int *temperature, int *humidity) {
int DHT22_Read(int *temperature, int *humidity)
{
// Set the data pin as output
DDR |= (1 << DATAPIN);
PORT |= (1 << DATAPIN); // Set the pin high, if not already pulled up
@ -20,24 +33,25 @@ int DHT22_Read(int *temperature, int *humidity) {
_delay_us(20); // Wait for 40 microseconds
// Sensor should have pulled low here
if (PIN & (1 << DATAPIN))
return -2;
if(PIN & (1 << DATAPIN)) return -2;
_delay_us(80); // Wait for 80 microseconds
// Sensor should have pulled high here
if (!(PIN & (1 << DATAPIN)))
return -1;
if(!(PIN & (1 << DATAPIN))) return -1;
// Read data from the sensor
uint8_t data[5] = {0, 0, 0, 0, 0};
uint8_t bitMask = 0x80; // All zeroes with MSB high
uint8_t byteIndex = 0;
for (byteIndex = 0; byteIndex < 5; byteIndex++) {
for (bitMask = 0x80; bitMask != 0; bitMask >>= 1) {
for (byteIndex = 0; byteIndex < 5; byteIndex++)
{
for (bitMask = 0x80; bitMask != 0; bitMask >>= 1)
{
// Wait for the data bit to go low
while (!(PIN & (1 << PC0)));
while (!(PIN & (1 << PC0)))
;
// Wait for the data bit to go high
_delay_us(20);
@ -45,7 +59,8 @@ int DHT22_Read(int *temperature, int *humidity) {
data[byteIndex] |= bitMask;
// Wait for the data bit to go low (end of bit)
while (PIN & (1 << PC0));
while (PIN & (1 << PC0))
;
}
}
@ -60,3 +75,4 @@ int DHT22_Read(int *temperature, int *humidity) {
return 0;
}

View file

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

View file

@ -1,8 +1,8 @@
#include "config.h"
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
#include <stdbool.h>
#define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR DDRB
@ -39,8 +39,7 @@ void lcd_send(bool rs, uint8_t data) {
_delay_us(1);
// If rs (actual text data), set RS pin high
if (rs == true)
LCD_DATA_PORT |= (1 << LCD_RS_PIN);
if(rs == true) LCD_DATA_PORT |= (1 << LCD_RS_PIN);
// Pulse enable
_delay_ms(2);
@ -72,14 +71,16 @@ void lcd_init() {
_delay_ms(100);
lcd_4bit_init();
// lcd_send(1, 0b01111000);
//lcd_send(1, 0b01111000);
lcd_send(0, 0x01); // Clear screen
lcd_send(0, 0x02); // Return home
lcd_send(0, 0b00001100); // Display on, no cursor
lcd_send(0, 0b00101000);
}
void lcd_clear() { lcd_send(0, 0x01); }
void lcd_clear() {
lcd_send(0, 0x01);
}
void test_leds() {
DDRB |= 0xFF;
@ -102,21 +103,19 @@ void test_leds() {
void lcd_set_cursor(uint8_t row, uint8_t col) {
uint8_t position = 0x80;
if (row == 1)
position += 0x40;
if (row == 1) position += 0x40;
position += col;
lcd_send(0, position);
}
// Takes a string and splits it over two lines if needed. Max length is 32
// characters.
void lcd_write_string(const char *string) {
// Takes a string and splits it over two lines if needed. Max length is 32 characters.
void lcd_write_string(const char* string) {
uint8_t i = 0;
while (string[i]) {
if (i == 16) {
while(string[i]) {
if(i == 16) {
lcd_set_cursor(1, 0);
while (string[i] == ' ') i++; // Skip leading spaces on the new line
while(string[i] == ' ') i++; // Skip leading spaces on the new line
}
lcd_send(1, string[i]);
i++;
@ -124,7 +123,7 @@ void lcd_write_string(const char *string) {
}
// 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;
while (top[i]) {
@ -134,8 +133,9 @@ void lcd_write_strings(const char *top, const char *bottom) {
i = 0;
lcd_set_cursor(1, 0);
while (bottom[i]) {
while(bottom[i]) {
lcd_send(1, bottom[i]);
i++;
}
}

View file

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

14
LM335.c
View file

@ -1,9 +1,10 @@
#include "LM335.h"
#include "config.h"
#include <avr/io.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
ADMUX = (1 << REFS0);
@ -14,7 +15,8 @@ void ADC_Init() {
ADCSRA |= (1 << ADEN); // | (1 << ADIE);
}
uint16_t ADC_Read(uint8_t channel) {
uint16_t ADC_Read(uint8_t channel)
{
// Select ADC channel
ADMUX = (ADMUX & 0xF8) | (channel & 0x07);
@ -22,13 +24,15 @@ uint16_t ADC_Read(uint8_t channel) {
ADCSRA |= (1 << ADSC);
// Wait for ADC conversion to complete
while (ADCSRA & (1 << ADSC));
while (ADCSRA & (1 << ADSC))
;
// Read ADC result
return ADC;
}
float LM335_ReadTemperature() {
float LM335_ReadTemperature()
{
// Read ADC value from LM335 pin (PA0)
uint16_t adcValue = ADC_Read(0x00);

View file

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

41
main.c
View file

@ -2,15 +2,15 @@
#include <avr/io.h>
#include <stdbool.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdio.h>
#include "74C922.h"
#include "DHT22.h"
#include "GDM1602K.h"
#include "LM335.h"
enum DisplayMode { TEMP, AVG };
enum DisplayMode {TEMP, AVG};
bool b = false;
@ -36,27 +36,24 @@ int main() {
long loops = 0;
while (1) {
while(1) {
// If encoder has data available
if (encoder_available() == true) {
if(encoder_available() == true) {
loops = 0xFFFF;
if (!btn_just_pressed) {
if(!btn_just_pressed) {
btn_just_pressed = true;
button_data = encoder_read();
sprintf(btn_string, "Knapp %d", button_data);
lcd_clear();
if (button_data == 11) {
if (temp_unit == 'C')
temp_unit = 'F';
else if (temp_unit == 'F')
temp_unit = 'K';
else if (temp_unit == 'K')
temp_unit = 'C';
if(button_data == 11) {
if(temp_unit == 'C') temp_unit = 'F';
else if(temp_unit == 'F') temp_unit = 'K';
else if(temp_unit == 'K') temp_unit = 'C';
loops = 0;
}
if (button_data == 3) {
if(button_data == 3) {
sprintf(celc_str, "10h Tmp: %s", temp_with_unit);
sprintf(hum_str, "10h Hum: %.1f%%", humidity - 1);
sprintf(hum_str, "10h Hum: %.1f%%", humidity-1);
lcd_write_strings(celc_str, hum_str);
}
}
@ -64,27 +61,25 @@ int main() {
btn_just_pressed = false;
}
if (loops == 0) {
if(loops == 0) {
loops = 0x2FFFF;
int result = DHT22_Read(&temp, &hum);
lcd_clear();
if (result == 0) {
celcius = ((float)temp) / 10.0;
humidity = ((float)hum) / 10.0;
switch (temp_unit) {
if(result == 0) {
celcius = ((float)temp)/10.0;
humidity = ((float) hum)/10.0;
switch(temp_unit) {
case 'C':
sprintf(temp_with_unit, "%.1f %c", celcius, temp_unit);
break;
case 'F':
sprintf(temp_with_unit, "%.1f %c", celcius * 9 / 5 + 32,
temp_unit);
sprintf(temp_with_unit, "%.1f %c", celcius*9/5+32, temp_unit);
break;
case 'K':
sprintf(temp_with_unit, "%.1f %c", celcius + 273.15,
temp_unit);
sprintf(temp_with_unit, "%.1f %c", celcius + 273.15, temp_unit);
break;
}
sprintf(celc_str, "Temp: %s", temp_with_unit);

View file

@ -43,9 +43,6 @@ flash: $(TARGET).hex
qemu: $(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:
rm -f $(OBJS) $(TARGET).elf $(TARGET).hex