Skip to content

lovelyPuppies/fanProject

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Fan Project

πŸ“… Written at 2025-01-03 09:44:20

Project Introduction

Features

  • 전원 μ œμ–΄: 선풍기 전원을 μΌœκ±°λ‚˜ 끌 수 있음.
  • 팬 속도 쑰절: 저속, 쀑속, κ³ μ†μœΌλ‘œ 팬 속도λ₯Ό λ³€κ²½ κ°€λŠ₯.
  • λͺ¨λ“œ μ „ν™˜: μˆ˜λ™ λͺ¨λ“œμ™€ μžλ™ λͺ¨λ“œ κ°„ μ „ν™˜ κ°€λŠ₯.
  • 타이머 μ„€μ •: 3, 5, 7λΆ„ 타이머 μ„€μ •μœΌλ‘œ μžλ™ μ’…λ£Œ.
  • μƒνƒœ ν‘œμ‹œ: LCD 및 FND둜 ν˜„μž¬ λͺ¨λ“œ, 속도, 타이머 μƒνƒœ ν‘œμ‹œ.

🎯 Purposes

  • C μ–Έμ–΄ μ½”λ“œ λͺ¨λ“ˆν™” 및 ꡬ쑰화

    • λͺ…ν™•ν•œ 디렉터리 ꡬ쑰 섀계 (app -> peripheral (device) -> driver)
    • ꡬ쑰체와 ν•¨μˆ˜ 포인터λ₯Ό ν™œμš©ν•˜μ—¬ 객체지ν–₯적 섀계 κ΅¬ν˜„
    • μ½”λ“œ 일관성을 μœ„ν•œ λͺ…λͺ… κ·œμΉ™(Naming Convention) μ„€μ •
    • μž¬μ‚¬μš©μ„±μ„ κ³ λ €ν•œ Utility 라이브러리 μ œμž‘
  • λ””μžμΈ νŒ¨ν„΄ ν•™μŠ΅ 및 ν™œμš©

    • πŸͺ± Model-View-Presenter (MVP) + Service νŒ¨ν„΄μ„ μ μš©ν•˜μ—¬ μ‹œμŠ€ν…œμ˜ λͺ¨λ“ˆν™”와 μœ μ§€λ³΄μˆ˜μ„±μ„ κ°•ν™”
    • ꡬ쑰적 섀계λ₯Ό 톡해 μ½”λ“œ μž¬μ‚¬μš©μ„± 및 ν™•μž₯μ„± μ¦λŒ€
  • μ™ΈλΆ€ μž₯치 μ œμ–΄ 기술 μˆ™λ ¨

    • LCD, Buzzer, FND, Motor λ“± λ‹€μ–‘ν•œ μž₯치λ₯Ό μ œμ–΄ν•˜λ©° ν•˜λ“œμ›¨μ–΄μ™€ μ†Œν”„νŠΈμ›¨μ–΄ 톡합 기술 ν–₯상
    • UART 톡신 ν”„λ‘œν† μ½œ 이해 및 κ΅¬ν˜„μ„ ν†΅ν•œ μž₯치 κ°„ 데이터 κ΅ν™˜ ν•™μŠ΅
    • FND λ””μŠ€ν”Œλ ˆμ΄λ₯Ό 톡해 좜λ ₯ 데이터λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 기술 ν•™μŠ΅
  • 데이터 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜ ν•™μŠ΅

    • UART μˆ˜μ‹  데이터 μ²˜λ¦¬μ—μ„œ πŸͺ± μ›ν˜• 큐(Circular Queue)λ₯Ό ν™œμš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±, 데이터 흐름 관리 ν–₯상 및 데이터 손싀 방지
  • λ°μ΄ν„°μ‹œνŠΈ 뢄석 λŠ₯λ ₯ ν–₯상

    • λ°μ΄ν„°μ‹œνŠΈλ₯Ό 기반으둜 μž₯치 νŠΉμ„±μ„ νŒŒμ•…ν•˜κ³  이λ₯Ό κ΅¬ν˜„μ— λ°˜μ˜ν•˜λŠ” 기술 κ°•ν™”

πŸ–ΌοΈ Hardware Setup

Breadboard Setup

Breadboard Setup


πŸŽ₯ Fan Machine Demo

Fan Machine Demo

Click on the image above to watch the full demo on YouTube.


🌐 Project Overview

FSM (Finite State Machine)

πŸ“ μ°Έκ³ : λͺ…μ‹œμ μΈ μ „ν™˜μ΄ μ •μ˜λ˜μ§€ μ•ŠλŠ” ν•œ μƒνƒœλŠ” λ³€κ²½λ˜μ§€ μ•ŠμŒ.

πŸ•ΉοΈ Inputs (Button Definitions)

λ²„νŠΌ κΈ°λŠ₯
B1 μ‹œμŠ€ν…œ 전원 ν† κΈ€ (켜기/끄기)
B2 팬 속도 μ‘°μ • (μˆ˜λ™ λ˜λŠ” μžλ™ λͺ¨λ“œ)
B3 μžλ™ λͺ¨λ“œμ™€ μˆ˜λ™ λͺ¨λ“œ κ°„ ν† κΈ€ (μ§„μž… 지점)
B4 μ’…λ£Œ 타이머 μ„€μ • (μ—†μŒ, 3λΆ„, 5λΆ„, 7λΆ„)

πŸ“Š Diagram

stateDiagram-v2

  [*] --> Off
  state "On" as On {
    [*] --> On_Manual

    state "Manual" as On_Manual {

      state "Speed" as On_Manual_Speed {
        direction LR
        [*] --> Low

        Low: Low
        Medium: Medium
        High: High


        Low --> Medium: B2 | USART
        Medium --> High: B2 | USART
        High --> Low: B2 | USART
      }

    }

    state "Auto" as On_Auto {
      direction LR
      [*] --> Type1
      Type1: Type1
      Type2: Type2

      Type1 --> Type2: B2 | USART
      Type2 --> Type1: B2 | USART

    }

    On_Manual --> On_Auto: B3 | UART
    On_Auto --> On_Manual: B3 | UART
  }
  On --> Off: B1 | B4 | USART
  Off --> On: B1 | USART
Loading

πŸ› οΈ Tools

πŸ§‘β€πŸ’» Software

  • IDE: Microchip Studio
  • Programming Language: C

πŸ–₯️ Hardware

  • Processor: AVR Atmega128/A (RISC) (1 EM)
  • LCD Module: TC1602A-01T (1 EM)
  • Button (Pull-up Circuit): CL5642AH30 (4 EM)
  • FND (Common-Cathode Type): - (1 EM)
  • Buzzer: - (1 EM)
  • Motor: - (1 EM)

πŸ“ Directory Structure

β”œβ”€β”€ πŸ“‚ app
│    └── πŸ“‚ fanMachine
β”‚Β Β Β Β Β Β Β Β β”œβ”€β”€ fanMachinApp.c
β”‚Β Β Β Β Β Β Β Β β”œβ”€β”€ πŸ“‚ listener
│        │    └── fanListener.c
β”‚Β Β Β Β Β Β Β Β β”œβ”€β”€ πŸ“‚ model
│        │    └── fanModel.c
β”‚Β Β Β Β Β Β Β Β β”œβ”€β”€ πŸ“‚ presenter
│        │    └── fanPresenter.c
│        └── πŸ“‚ service
│            └── fanService.c
β”œβ”€β”€ πŸ“‚ driver
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ gpio
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ pwm
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ timer
│    └── πŸ“‚ uart
β”œβ”€β”€ main.c
β”œβ”€β”€ πŸ“‚ peripheral
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ button
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ buzzer
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ fnd
β”‚Β Β Β Β β”œβ”€β”€ πŸ“‚ lcd
│    └── πŸ“‚ motor
β”œβ”€β”€ πŸ“‚ resource
β”‚Β Β Β Β β”œβ”€β”€ fan_machine-breadboard_setup.jpg
└── πŸ“‚ utility
Β Β Β Β β”œβ”€β”€ bitmask.h
Β Β Β Β β”œβ”€β”€ boolean.h
    └── clockTimer.h


πŸ“– Design Patterns and Benefits

Layer Overview

Layer Description Matching Directory
Application Layer μ‚¬μš©μž μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직. μž₯μΉ˜μ™€ μ‹œμŠ€ν…œ 흐름 μ œμ–΄ app/
OS/RTOS 운영 체제 λ˜λŠ” μ‹€μ‹œκ°„ OS (Optional). <None>
Devices Layer μ™ΈλΆ€ μž₯치 관리 (λͺ¨ν„°, 버저, λ²„νŠΌ, LCD, FND) peripheral/ (motor, buzzer, button, lcd, fnd)
HAL/Drivers ν•˜λ“œμ›¨μ–΄ μ΄ˆκΈ°ν™” 및 MCU μ£Όλ³€ μž₯치 μ œμ–΄ (GPIO, 타이머, UART λ“±) driver/ (gpio, timer, uart, pwm)
Hardware 물리적 ν•˜λ“œμ›¨μ–΄ (MCU, μ„Όμ„œ λ“±) AVR Atmega128/A, TC1602A-01T, etc.

Applied Design Pattern

app/fanMachine λ””λ ‰ν„°λ¦¬μ—μ„œ λͺ¨λΈ-λ·°-ν”„λ ˆμ  ν„°(MVP) + μ„œλΉ„μŠ€ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ„ κ΅¬μ‘°ν™”ν•˜κ³  쑰직화.

  1. λͺ¨λΈ (model/):

    • 팬의 μƒνƒœμ™€ 데이터(예: 속도, μ œμ–΄ λͺ¨λ“œ, μ’…λ£Œ 타이머)λ₯Ό μΊ‘μŠν™”.
    • λ‚΄λΆ€ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ getter 및 setter λ©”μ„œλ“œλ₯Ό 제곡.
    • 예:
      uint8_t getFanSpeedState() {
          return _fanSpeedState;
      }
      void setFanSpeedState(uint8_t fanSpeedState) {
          _fanSpeedState = fanSpeedState;
      }
    • μ±…μž„: 쀑앙 집쀑식 μƒνƒœ 관리.
  2. λ·° (listener/):

    • μ‚¬μš©μž μž…λ ₯(예: λ²„νŠΌ λˆ„λ¦„, UART λͺ…λ Ή)을 λͺ¨λ‹ˆν„°λ§ν•˜κ³  Presenter에 λ³€κ²½ 사항을 μ•Œλ¦Ό.
    • μ™ΈλΆ€ μƒν˜Έμž‘μš©μ„ μœ„ν•œ 이벀트 λ¦¬μŠ€λ„ˆ μ—­ν• .
    • 예:
      static void _fanListener_checkButtonEvent() {
          switch (releasedBtnPinNum) {
              case BUTTON_FAN_SPEED_PIN_NUM:
                  setFanSpeedStateToNext();
                  break;
              case BUTTON_FAN_CONTROL_MODE_PIN_NUM:
                  setFanControlModeStateNext();
                  break;
          }
      }
    • μ±…μž„: μ‚¬μš©μž μž…λ ₯을 κ°μ§€ν•˜κ³  λͺ¨λΈμ˜ μƒνƒœκ°’μ„ μ—…λ°μ΄νŠΈ.
  3. ν”„λ ˆμ  ν„° (presenter/):

    • λͺ¨λΈκ³Ό λ·° κ°„μ˜ 톡신을 μ‘°μ •.
    • μ‚¬μš©μž μž…λ ₯ λ˜λŠ” μ‹œμŠ€ν…œ μ΄λ²€νŠΈμ— 따라 λͺ¨λΈμ„ μ—…λ°μ΄νŠΈν•˜κ³  ν‘œμ‹œν•  데이터λ₯Ό μ€€λΉ„.
    • 예:
      void fanPresenter_displaytoLcd(uint8_t minute, uint8_t second) {
          char buff[30];
          sprintf(buff, "%02d:%02d", minute, second);
          lcd.writeLcdStringToXy(&lcd, buff, 1, 2);
      }
    • μ±…μž„: μ„œλΉ„μŠ€λ‘œλΆ€ν„° 받은 데이터λ₯Ό 뷰에 μ „λ‹¬ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ ν‘œμ‹œ.
  4. μ„œλΉ„μŠ€ (service/):

    • 타이머 관리, λͺ¨ν„° 속도 μ œμ–΄, UART 톡신 λ“±μ˜ μž¬μ‚¬μš© κ°€λŠ₯ν•œ λ‘œμ§μ„ μΊ‘μŠν™”.
    • μžλ™ λͺ¨λ“œ μˆœν™˜ 및 μ’…λ£Œ 타이머 μ²˜λ¦¬μ™€ 같은 κ³ κΈ‰ κΈ°λŠ₯을 제곡.
    • 예:
      void _fanService_updateByCurrentState() {
          if (fanControlModeState == FAN_CONTROL_MODE_AUTO && fanControlAutoModeTimer.second >= fanControlModeAutoCycleSecond) {
              uint16_t randomDutyCycle = (rand() % 10 + 1) * 10;
              motor.setFanSpeed(&motor, randomDutyCycle);
          }
      }
    • μ±…μž„: 핡심 μž¬μ‚¬μš© 둜직 및 κ³ κΈ‰ κΈ°λŠ₯. λͺ¨λΈμ˜ μƒνƒœκ°’μ„ 주기적으둜 ν™•μΈν•˜κ³  λ‘œμ§μ„ μ²˜λ¦¬ν•˜μ—¬ ν”„λ ˆμ  ν„°λ‘œ 전달

❗ Advantages of MVP + Service Pattern

  1. κ΄€μ‹¬μ‚¬μ˜ 뢄리:

    • 각 ꡬ성 μš”μ†Œ(λͺ¨λΈ, λ·°, ν”„λ ˆμ  ν„°, μ„œλΉ„μŠ€)λŠ” λͺ…ν™•ν•œ μ±…μž„μ„ 가지며 λ³΅μž‘μ„±μ„ μ€„μž„.
  2. λͺ¨λ“ˆμ„±:

    • 독립적인 ꡬ성 μš”μ†ŒλŠ” μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ λ˜λŠ” κ°œλ³„ 계측 ꡐ체λ₯Ό μ‰½κ²Œ λ§Œλ“¦.
  3. ν…ŒμŠ€νŠΈ κ°€λŠ₯μ„±:

    • μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ 핡심 둜직과 λͺ¨λΈ κ³„μΈ΅μ˜ μƒνƒœ κ΄€λ¦¬λŠ” λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯.
  4. μž¬μ‚¬μš©μ„±:

    • fanService와 같은 μ„œλΉ„μŠ€λŠ” μœ μ‚¬ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ˜λŠ” κΈ°κ³„μ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯.
  5. ν™•μž₯μ„±:

    • μΆ”κ°€ 팬 λͺ¨λ“œ λ˜λŠ” κ³ κΈ‰ 타이머와 같은 μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€κ°€ κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜ 덕뢄에 간단.

Retrospective

πŸ“Œ Key Learnings and Improvements

  1. ν•˜λ“œμ›¨μ–΄ λ¬Έμ„œν™”

    ➑️ ν•˜λ“œμ›¨μ–΄ λͺ¨λΈμ— λŒ€ν•œ 포괄적인 λ¬Έμ„œ μž‘μ„±, λ°μ΄ν„°μ‹œνŠΈ 링크 포함, νŒ€μ˜ μ ‘κ·Όμ„±κ³Ό 이해λ₯Ό ν–₯μƒμ‹œν‚€λŠ” μž‘μ—….

    • ν•˜λ“œμ›¨μ–΄ λͺ¨λΈκ³Ό κ·Έ 사양이 잘 λ¬Έμ„œν™”λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” μž‘μ—….
  2. 디렉터리 λͺ…λͺ… κ·œμΉ™

    ➑️ ν–₯ν›„ ν”„λ‘œμ νŠΈμ—μ„œ 일관적이고 ν‘œμ€€ν™”λœ μš©μ–΄ μ‚¬μš©μœΌλ‘œ λͺ…확성을 κ°œμ„ ν•˜λŠ” μž‘μ—….

    • 이 ν”„λ‘œμ νŠΈμ—μ„œ "peripheral"μ΄λΌλŠ” 디렉터리 이름이 μ‚¬μš©λ˜μ—ˆμœΌλ‚˜, μž„λ² λ””λ“œ μ‹œμŠ€ν…œμ—μ„œ μ’…μ’… ν•˜λ“œμ›¨μ–΄ λ ˆμ§€μŠ€ν„°λ₯Ό μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— ν˜Όλž€μ„ μ΄ˆλž˜ν•¨.
    • ν–₯ν›„ ν”„λ‘œμ νŠΈμ—μ„œλŠ” ❗ **"device"**와 같은 더 ν‘œμ€€μ μ΄κ³  널리 μ‚¬μš©λ˜λŠ” μš©μ–΄λ₯Ό 채택해야 함.
      • μ˜ˆμ‹œ (Wiktionary μ°Έμ‘°):
        • Device: μ£Όλ³€ μž₯치; ν•˜λ“œμ›¨μ–΄ ν•­λͺ©.
        • Peripheral Device: μ»΄ν“¨ν„°μ—μ„œ μ‚¬μš©ν•˜λŠ” μ™ΈλΆ€ μ „μž μž₯치.
  3. Cμ—μ„œμ˜ OOP κ°œλ…μ„ μœ„ν•œ λͺ…λͺ… κ·œμΉ™

    ➑️ μž„λ² λ””λ“œ μ‹œμŠ€ν…œμ—μ„œ μ‚°μ—… ν‘œμ€€ λͺ…λͺ… κ·œμΉ™μ„ μ‘°μ‚¬ν•˜μ—¬ λͺ¨λ²” 사둀λ₯Ό ν™•λ³΄ν•˜λŠ” μž‘μ—….

    • Cμ—μ„œ OOP 원칙을 λ”°λ₯΄λ €λŠ” μ‹œλ„λŠ” 특히 ꡬ쑰체의 μΊ‘μŠν™” λΆ€μ‘±μœΌλ‘œ 인해 어렀움이 μžˆμ—ˆμŒ.
    • 🚣 λͺ¨λ“ˆ 이름(PascalCase)을 ν•¨μˆ˜ 이름(camelCase)에 μ ‘λ‘μ–΄λ‘œ λΆ™μ—¬ OOP ꡬ쑰λ₯Ό λͺ¨λ°©ν•˜λŠ” λͺ…λͺ… κ·œμΉ™ 채택.
    • μ˜ˆμ‹œ:
      static void _Fnd_setFndNum(fnd_t* fnd, uint16_t value) {
          fnd->value = value;
      }
  4. FSM 섀계 과제

    ➑️ κΈ°λŠ₯을 μœ μ§€ν•˜λ©΄μ„œ FSM 섀계λ₯Ό λ”μš± κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€ λŒ€μ•ˆμ„ νƒμƒ‰ν•˜λŠ” μž‘μ—….

    • 초기 FSM μ„€κ³„λŠ” μ§€λ‚˜μΉ˜κ²Œ λ³΅μž‘ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μ–΄λ €μ› μŒ(μ°Έμ‘°: 이전 FSM λ‹€μ΄μ–΄κ·Έλž¨).
    • 섀계λ₯Ό μž¬ν‰κ°€ν•œ ν›„, 더 직관적이고 λ‹¨μˆœν•œ ꡬ쑰가 κ°€λŠ₯함이 λ“œλŸ¬λ‚¨.
    • κ΅ν›ˆ: κ΅¬ν˜„ 전에 더 λ§Žμ€ μ‹œκ°„μ„ λ“€μ—¬ μ‹ μ€‘ν•˜κ²Œ μ„€κ³„ν•˜λŠ” μž‘μ—…. κ°œμ„ λ˜κ³  κ°„κ²°ν•œ FSM은 πŸ”— "[FSM (Finite State Machine)]"μ—μ„œ μ°Έμ‘° κ°€λŠ₯.
  5. μΈν„°λŸ½νŠΈ μ²˜λ¦¬μ™€ λ””μŠ€ν”Œλ ˆμ΄ 효율 κ°œμ„ 

    • FND λ””μŠ€ν”Œλ ˆμ΄ νš¨μœ¨μ„±κ³Ό κ΄€λ ¨ν•˜μ—¬ μ›μžμ„± 문제 및 λΆˆν•„μš”ν•œ 계산과 같은 μ΄μŠˆκ°€ λ°œμƒν•¨.
    • πŸ’‘ μΈν„°λŸ½νŠΈ λ‚΄λΆ€μ—μ„œμ˜ 계산 μ΅œμ†Œν™” 및 λ³΅μž‘ν•œ 계산이 ν•„μš”ν•œ 경우 간격을 늘렀 λ‹€λ₯Έ μ‹œκ°„μ— λ―Όκ°ν•œ μž‘μ—…κ³Όμ˜ 간섭을 λ°©μ§€ν•˜λŠ” μž‘μ—….

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published