티스토리 뷰
아두이노 메인 함수에서 Preference를 정의하고 begin()한 다음에 .h 및 .cpp 클래스 파일 내에서 preference를 저장하고 불러오는 예제 코드를 작성하시오.
아두이노(ESP32 등)에서 Preferences 라이브러리를 사용할 때, 메인 파일(.ino)에서 객체를 초기화하고 이를 별도의 클래스(.h, .cpp)에서 공유하여 사용하는 가장 깔끔한 방법은 클래스 생성자에 Preferences 객체의 주소(포인터)를 전달하는 방식입니다.
이 방식을 사용하면 메인에서 관리하는 설정을 클래스 내부에서 자유롭게 읽고 쓸 수 있습니다.
1. 클래스 헤더 파일 (MySettings.h)
클래스 내부에서 Preferences 객체에 접근할 수 있도록 포인터 변수를 선언합니다.
C++
#ifndef MY_SETTINGS_H
#define MY_SETTINGS_H
#include <Arduino.h>
#include <Preferences.h>
class MySettings {
public:
// 생성자: Preferences 객체의 주소를 받습니다.
MySettings(Preferences* prefs);
void saveSystemMode(int mode);
int loadSystemMode();
private:
Preferences* _prefs; // 메인의 객체를 가리킬 포인터
};
#endif
2. 클래스 소스 파일 (MySettings.cpp)
생성자에서 전달받은 주소를 저장하고, 각 함수에서 -> 연산자를 사용하여 데이터를 저장하고 불러옵니다.
C++
#include "MySettings.h"
MySettings::MySettings(Preferences* prefs) {
_prefs = prefs; // 주소 복사
}
void MySettings::saveSystemMode(int mode) {
// 이미 메인에서 begin() 되었으므로 바로 사용 가능
_prefs->putInt("sysMode", mode);
Serial.printf("클래스: 모드 %d 저장 완료\n", mode);
}
int MySettings::loadSystemMode() {
int mode = _prefs->getInt("sysMode", 0); // 기본값 0
Serial.printf("클래스: 모드 %d 불러오기 완료\n", mode);
return mode;
}
3. 메인 파일 (Main.ino)
메인에서 Preferences 객체를 생성하고 begin()을 호출한 뒤, 클래스 객체에 해당 주소를 넘겨줍니다.
C++
#include <WiFi.h>
#include <Preferences.h>
#include "MySettings.h"
Preferences preferences;
MySettings* mySettings;
void setup() {
Serial.begin(115200);
// 1. Preferences 정의 및 시작 (네임스페이스: "my-app")
// false는 읽기/쓰기 모드임을 의미합니다.
preferences.begin("my-app", false);
// 2. 클래스 인스턴스 생성 시 Preferences의 주소(&)를 전달
mySettings = new MySettings(&preferences);
// 3. 테스트: 데이터 저장 및 로드
mySettings->saveSystemMode(5);
int currentMode = mySettings->loadSystemMode();
Serial.print("메인 루프 확인: ");
Serial.println(currentMode);
}
void loop() {
// 생략
}
💡 핵심 포인트 요약
- 포인터 활용 (Preferences* _prefs): 클래스 내부에서 새로운 Preferences 객체를 또 만드는 것이 아니라, 메인에 있는 객체의 메모리 주소만 참조합니다. 이렇게 해야 메모리 낭비가 없고 begin() 상태를 공유할 수 있습니다.
- begin()의 위치: Preferences는 네임스페이스(파일 시스템의 폴더 개념)를 열어야 하므로, 클래스의 메서드를 호출하기 전 메인 setup()에서 begin()을 먼저 호출해야 안전합니다.
- 데이터 저장 방식: putInt, putString, getBool 등 데이터 타입에 맞는 메서드를 사용하며, 키(Key)값은 15자 이내여야 합니다.
이 구조는 코드의 의존성을 명확하게 관리하면서도 여러 클래스에서 공통된 설정값을 안전하게 공유할 수 있는 표준적인 패턴입니다.
'SWDesk > Firmware' 카테고리의 다른 글
| [Pyduino] OTA(over-the-air) 예제 코드 (2) | 2026.04.11 |
|---|---|
| [Arduino] 가변 주파수를 갖는 GPIO 출력 (0) | 2025.04.20 |
| [Arduino] 클래스(Class) 활용 예제 (0) | 2025.03.16 |
| [Arduino] ESP32 nano, FreeRTOS 실행 시 메모리 충돌 방지 대책 (2) | 2025.03.14 |
| [Arduino] ESP32 nano에서 WiFi 전송과 GPIO 컨트롤을 동시에 하는 방법 (0) | 2025.03.13 |
- Total
- Today
- Yesterday
- 전압
- 아두이노
- 오블완
- DYOV
- 혁신과허들
- 허들
- image
- Hurdles
- 절연형
- 빌리언트
- 치매
- BSC
- 심심풀이치매방지기
- 심심풀이
- Video
- 혁신
- 빌리칠드
- 티스토리챌린지
- ServantClock
- bilient
- 전류
- arduino
- Decorator
- 둎
- Innovations&Hurdles
- Innovations
- 치매방지
- Innovation&Hurdles
- BiliChild
- 배프
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |

