1월, 2024의 게시물 표시

python 관련 팁

python 레퍼런스 여기서 보는게 더 편한듯 https://www.w3schools.com/python/python_reference.asp 반올림 할때 python은 오사오입임을 주의 오사오입: 5 미만의 숫자는 버림하며 5 초과의 숫자는 올림.5의 경우에는 5의 앞자리가 홀수인 경우엔 올림을 하고 짝수인 경우엔 버림을 하여 짝수로 만들어준다.  원래 알고 있는 5를 올림하는 반올림은 사사오입 사사오입: 사까지는 버리고 오까지는 들인다

Notification: Push Pull Local System

 "Notification"이라는 용어는 보다 일반적이고 포괄적인 개념입니다. 이는 사용자에게 정보를 전달하는 모든 형태의 알림을 포함합니다. 푸시 알림(Push notification)은 이러한 알림의 한 형태로, 서버에서 직접 사용자의 기기로 정보를 보내는 것을 말합니다. 그러나 "Notification" 자체는 이보다 넓은 범위를 가집니다. Notification은 다음과 같은 형태를 포함할 수 있습니다: 1. **푸시 알림(Push Notification)**: 서버에서 사용자의 기기로 직접 보내는 알림입니다. "Push notification"은 스마트폰, 태블릿, 컴퓨터와 같은 기기에서 사용되는 메시지 시스템입니다. 이 시스템은 앱이나 웹사이트가 사용자에게 직접 메시지를 보낼 수 있게 해줍니다. 예를 들어, 뉴스 앱에서 중요한 소식이 있을 때, 이메일 앱에서 새로운 이메일이 도착했을 때, 또는 소셜 미디어 앱에서 친구의 새로운 활동이 있을 때 이런 알림을 받을 수 있습니다. 이러한 푸시 알림은 사용자가 해당 앱을 열고 있지 않을 때도 정보를 전달할 수 있으며, 사용자가 알림을 클릭하면 관련 앱이나 웹사이트로 이동합니다. 사용자는 이러한 알림을 받을지 여부를 설정에서 조절할 수 있습니다. "Push notification"은 서버에서 직접 사용자의 기기로 보내는 알림을 의미합니다. 이런 방식은 서버 측에서 사용자에게 특정 정보를 전달할 필요가 있을 때 사용됩니다. 예를 들어, 이메일이 도착했을 때, 소셜 미디어에서 새로운 활동이 있을 때, 또는 앱에서 특별한 이벤트나 업데이트가 있을 때 서버는 해당 정보를 사용자의 기기로 직접 전송합니다. 2. **풀 알림(Pull Notification)**: 사용자가 앱을 열거나 웹사이트에 접속하여 새로운 정보를 요청할 때 받는 알림입니다. Pull notification은 사용자가 직접 앱을 열고 서버로부터 최신 정보를 요청할 때 발생합니다....

부품 납땜 준비

  promini soldering https://youtu.be/37mW1i_oEpA?si=A-6QadE6SFJZ-Emn 냉납: 크랙가서 납땜 잘 안된거 https://www.youtube.com/shorts/Wqg84eaaoT0?feature=share 케이블(끼리) 납땜 https://youtu.be/fb2KrEvJCSQ?si=Iz83k8TTpgSlqfdU 납땜의 기초(좋음) https://youtu.be/plVfzJjY-jc?si=7iURl-ngZiaONlNA 인두기 끝이 검게 산화되면 잘 안됨 https://youtu.be/rZRwlET1H-w?si=zYks9hS8jQGJd7NZ 전선 종류 단선 연선 https://www.youtube.com/shorts/UcZX-s3lEN4 엄청 세밀한 납땜 https://youtu.be/i5MNLTc7YhY?si=r5bRkACaqsflYoiB

브레드보드에 컴퓨터 만들기 유튜브

이미지
  Why build an entire computer on breadboards? https://youtu.be/fCbAafKLqC8?si=cRZgrvvD3RxnkVsu

아두이노 Error opening sketch: main file missing from sketch:

[Starting] Verifying sketch 'main.ino' [Warning] Output path is not specified. Unable to reuse previously compiled files. Build will be slower. See README. Error opening sketch: main file missing from sketch: /Users/.../pixel_friend_arduino/pixel_friend_arduino.ino [Warning] Failed to generate IntelliSense configuration. [Error] Verifying sketch 'main.ino': Exit with code=1\ 에러 메시지에 따르면, 여러 가지 문제가 발생하고 있습니다. 다음은 각 문제에 대한 해결책입니다: 1. **Output path is not specified**:    - 이 경고는 컴파일된 파일의 출력 경로가 지정되지 않았음을 나타냅니다. 이 문제는 VS Code의 설정에서 "Arduino: Output" 경로를 지정하여 해결할 수 있습니다.    - VS Code 설정으로 이동하여 "Arduino: Output"에 특정 폴더 경로를 지정하세요. 이렇게 하면 컴파일된 파일이 이 경로에 저장되어 재사용될 수 있습니다. 2. **Error opening sketch: main file missing from sketch**:    - 이 에러는 주 스케치 파일(`.ino` 파일)이 해당 폴더 내에 존재하지 않음을 의미합니다. 아두이노 프로젝트 폴더는 `.ino` 파일을 포함해야 하며, 이 파일 이름은 폴더 이름과 일치해야 합니다.    - `/Users/.../pixel_friend_arduino/` 폴더 안에 `pixel_friend_arduino.ino`라는 이름의 파일이 있는지 확인하세요. 파일 이름이 폴더 이름과 정확히 ...

Adafruit_GFX.h Adafruit_SSD1306.h

 Adafruit의 SSD1306 라이브러리를 사용하는 기본적인 방법을 설명드리겠습니다. 이 라이브러리는 SSD1306 기반의 OLED 디스플레이를 쉽게 제어할 수 있게 해주는 여러 기능을 제공합니다. 먼저, SSD1306 라이브러리와 필요한 Adafruit_GFX 라이브러리를 아두이노 IDE에 설치해야 합니다. **라이브러리 설치 방법:** 1. 아두이노 IDE를 엽니다. 2. 메뉴에서 "스케치" > "라이브러리 포함하기" > "라이브러리 관리..."를 선택합니다. 3. 라이브러리 관리자에서 "SSD1306"을 검색하고, Adafruit SSD1306 라이브러리를 찾아 설치합니다. 4. 동일한 방법으로 "GFX"를 검색하고, Adafruit GFX 라이브러리를 설치합니다. **기본적인 사용법:** ```cpp #include <Wire.h>      // I2C library #include <Adafruit_GFX.h>   // Adafruit 그래픽 핵심 라이브러리 #include <Adafruit_SSD1306.h> // SSD1306 라이브러리 #define SCREEN_WIDTH 128 // OLED 디스플레이 너비, 픽셀 단위 #define SCREEN_HEIGHT 64 // OLED 디스플레이 높이, 픽셀 단위 // SSD1306 디스플레이의 I2C 주소 (대부분 0x3D 또는 0x3C입니다) #define OLED_RESET     -1 // 리셋 핀이 필요 없으면 -1로 설정 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() {   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 디스플레이 초기화     Serial.println(F("SSD...

아두이노 관련 초급 정보

## 저항 필요 이유 저항을 사용하는 주된 이유는 회로에서 전류를 제한하고, 다양한 전자 부품을 보호하기 위함입니다. 버튼과 같은 입력 장치에 저항을 사용하는 구체적인 상황은 다음과 같습니다: 1. **풀업 또는 풀다운 저항**: 버튼을 사용할 때 풀업 또는 풀다운 저항을 사용하는 것이 일반적입니다. 이는 버튼이 눌리지 않았을 때 입력 핀의 상태를 안정적으로 유지하기 위함입니다.        - **풀업 저항**: 버튼이 눌리지 않았을 때 입력 핀을 높은 전압(보통 VCC)으로 유지합니다. 버튼이 눌리면 회로가 닫히고 입력 핀이 접지로 떨어집니다.    - **풀다운 저항**: 반대로, 버튼이 눌리지 않았을 때 입력 핀을 접지로 유지합니다. 버튼이 눌리면 회로가 닫히고 입력 핀이 높은 전압으로 올라갑니다. 2. **노이즈 방지**: 저항 없이 버튼을 연결하면, 버튼이 눌리지 않았을 때의 입력 핀 상태가 불안정해져서 노이즈로 인한 가짜 신호가 발생할 수 있습니다. 이는 버튼을 누르지 않았는데 누른 것처럼 인식되는 현상을 초래할 수 있습니다. 3. **회로 보호**: 저항은 또한 회로를 보호하는 역할을 합니다. 예를 들어, 과도한 전류가 부품을 통과하는 것을 방지하여 부품이 손상되는 것을 막습니다. 회로가 작동하는 것처럼 보이더라도, 저항을 사용하지 않으면 장기적으로 불안정성이나 부품 손상의 위험이 있습니다. 따라서 안정적인 작동을 위해 적절한 저항의 사용이 권장됩니다. 풀업(pull-up)과 풀다운(pull-down) 저항은 전자 회로에서 버튼이나 스위치 같은 입력 장치의 상태를 명확하게 정의하기 위해 사용됩니다. 각각은 다음과 같은 역할을 합니다: 1. **풀업 저항(Pull-up Resistor)**:    - 버튼이나 스위치가 눌리지 않았을 때, 입력 핀을 높은 전압 상태(보통 VCC, 즉 전원 공급 전압)로 유지합니다.    - 버튼을 누르면, 회로가 닫히고 입력 핀이...

일본어 공부 자료 블로그

  우연히 발견한 블로그인데 흥미로운 일본어 자료 많음 https://m.blog.naver.com/yukine0131

쇼트 나는 것 단락 주의

 전자전기 분야에서 "쇼트 나는 것"은 일반적으로 "단락(Short Circuit)"을 의미합니다. 단락은 전기 회로에서 전류가 의도하지 않은 경로를 통해 흐르는 현상을 말합니다. 이는 회로의 두 점이 부적절하게 연결되어 전기 저항이 비정상적으로 낮아질 때 발생합니다. 단락이 발생하면 다음과 같은 문제가 생길 수 있습니다: 1. **과도한 전류**: 단락으로 인해 회로를 통과하는 전류가 과도하게 증가하여, 전선이 과열되거나 녹아서 손상될 수 있습니다. 2. **장비 손상**: 전자 장비나 회로 자체가 과열되거나 과전류로 인해 손상될 수 있습니다. 3. **화재 위험**: 과도한 전류와 과열로 인해 화재가 발생할 위험이 있습니다. 단락을 방지하고 안전을 유지하기 위해서는 다음과 같은 조치를 취할 수 있습니다: - **회로 보호 장치 사용**: 퓨즈나 차단기 같은 회로 보호 장치를 사용하여 과도한 전류가 흐를 때 회로를 자동으로 차단합니다. - **적절한 배선과 절연**: 전선이 적절히 배치되고 절연되어야 합니다. - **정기적인 검사 및 유지보수**: 전기 설비와 회로의 정기적인 검사와 유지보수를 통해 단락의 위험을 최소화할 수 있습니다. 단락은 전자전기 분야에서 중요한 안전 이슈이며, 적절한 설계와 관리를 통해 예방할 수 있습니다. 배터리의 양극(+)과 음극(-)을 동시에 자르면서 두 선이 서로 접촉하게 되었다면, 이는 직접적인 단락 상태를 만들어낸 것입니다. 이렇게 되면 배터리의 전기가 매우 낮은 저항을 통해 순간적으로 큰 전류가 흘러, 불꽃이 튀거나 심한 경우에는 화재나 폭발의 위험도 발생할 수 있습니다. 이런 상황을 방지하기 위해서는 전기 회로나 배터리를 다룰 때 항상 주의해야 합니다. 특히 배터리의 양극과 음극을 동시에 접촉시키지 않도록 조심해야 하며, 필요하다면 절연 테이프나 기타 보호 장비를 사용하는 것이 좋습니다. 또한, 배터리나 전기 회로를 다룰 때는 항상 전문 지식과 안전 수칙을 숙지하고 작업해야 합니다.

프로그레시브 웹 앱(Progressive Web Apps, PWA)

 웹을 앱처럼 만드는 기술로는 주로 "프로그레시브 웹 앱(Progressive Web Apps, PWA)"가 있습니다. PWA는 웹 기술(HTML, CSS, JavaScript)을 사용하여 만든 애플리케이션으로, 전통적인 웹사이트와는 달리 모바일 앱과 유사한 사용자 경험을 제공합니다. 이 기술은 웹사이트가 오프라인에서도 작동하게 하고, 푸시 알림과 같은 모바일 앱의 기능을 사용할 수 있게 해줍니다. PWA의 주요 특징은 다음과 같습니다: 1. **응답성**: 다양한 디바이스와 화면 크기에 맞게 콘텐츠가 조정됩니다. 2. **오프라인 작동**: 서비스 워커(Service Workers)를 사용하여 네트워크 연결이 없어도 기본적인 기능을 사용할 수 있습니다. 3. **앱처럼 느껴지는 인터랙션**: 사용자는 웹사이트를 모바일 앱처럼 홈 화면에 추가하고 전체 화면 모드로 사용할 수 있습니다. 4. **푸시 알림**: 모바일 앱처럼 푸시 알림을 통해 사용자와 소통할 수 있습니다. 이러한 PWA 기술 덕분에 사용자들은 별도의 앱 다운로드 없이 웹 브라우저를 통해 앱과 유사한 경험을 할 수 있게 되었습니다. 프로그레시브 웹 앱(PWA)에서 푸시 알림을 구현하는 것은 몇 가지 주요한 기술 요소를 포함합니다. 이 기능을 구현하기 위해 주로 사용되는 기술은 서비스 워커(Service Worker), 웹 푸시 API(Web Push API), 그리고 알림 API(Notification API)입니다. 아래에 각 기술 요소에 대해 간략히 설명드리겠습니다: 1. **서비스 워커(Service Worker)**:    - 서비스 워커는 웹 페이지와 별개로 백그라운드에서 실행되는 스크립트입니다.    - 네트워크 요청을 가로채고, 캐싱 및 오프라인 기능을 제공합니다.    - 푸시 알림을 받기 위한 핵심 요소로, 서버에서 보내는 푸시 메시지를 수신합니다. 2. **웹 푸시 API(Web Push API)**:   ...

아두이노 프로 미니 사용하기

 아두이노 프로 미니(Arduino Pro Mini)는 아두이노 우노(Arduino Uno)와 많은 부분에서 호환됩니다. 아두이노 프로 미니는 아두이노 우노와 동일한 마이크로컨트롤러(ATmega328)를 사용합니다. 그래서 대부분의 경우, 아두이노 우노용으로 작성된 코드와 라이브러리는 프로 미니에서도 작동합니다. ### 호환성 측면 - **마이크로컨트롤러**: 우노와 프로 미니 모두 ATmega328 마이크로컨트롤러를 사용합니다. - **핀 아웃**: 프로 미니의 핀 아웃(Pinout)은 우노와 유사합니다. 그러나 물리적 크기와 핀의 배치가 다를 수 있으므로, 이를 확인해야 합니다. - **기능**: 프로 미니는 아두이노 우노의 기능을 대부분 지원하지만, 프로 미니는 USB-to-Serial 변환기가 내장되어 있지 않아 별도의 USB-to-Serial 어댑터가 필요합니다. ### 주의사항 - **USB-to-Serial 변환**: 프로 미니에는 USB 포트가 없으므로, 컴퓨터에 연결하기 위해서는 USB-to-Serial 어댑터가 필요합니다. - **전원 공급**: 프로 미니는 별도의 전원 연결 지점을 가지고 있으며, 일반적으로 3.3V 또는 5V에서 작동합니다. 우노와 다르게 내장된 전원 규제가 없을 수 있으니, 전원 공급에 주의가 필요합니다. - **크기 및 폼 팩터**: 프로 미니는 우노보다 훨씬 작고, 일부 기본적인 연결이 빠져 있을 수 있습니다 (예: 전원 잭, 표준 USB 연결 등). 프로젝트를 프로 미니로 옮기는 경우, 이러한 차이점들을 고려하여 필요한 수정을 해야 할 수도 있습니다. 기본적으로, 프로그래밍 로직과 대부분의 라이브러리는 호환될 것입니다. 아두이노 프로 미니에 배터리를 연결하는 방법은 간단합니다. 아두이노 프로 미니는 일반적으로 3.3V 또는 5V 버전으로 제공되며, 배터리 연결 방법은 선택한 프로 미니의 버전에 따라 달라집니다. ### 3.3V 프로 미니 - **배터리 연결**: 3.3V 프로 미니의 경우, 일반적으로 3.7V...

아두이노 메모리 관리

아두이노 IDE에서 스케치를 업로드할 때 표시되는 "dynamic memory" 사용량은 프로그램이 시작할 때 이미 할당된 글로벌 변수와 정적 변수에 대한 메모리 사용량을 나타냅니다. 이는 프로그램 실행 전에 미리 계산되는 고정된 값입니다. 실행 중에 추가적으로 RAM을 사용하는 것은 다음과 같은 경우에 발생할 수 있습니다: 1. **로컬 변수**: 함수 내부에서 선언된 로컬 변수는 함수가 호출될 때 스택 메모리에 할당됩니다. 함수가 종료되면 이 메모리는 해제됩니다. 2. **동적 할당**: `malloc()`, `calloc()`, `new` 같은 함수를 사용하는 동적 메모리 할당은 실행 중에 RAM을 추가로 사용합니다. 이 메모리는 `free()`나 `delete`를 통해 명시적으로 해제해야 합니다. 3. **재귀 호출**: 재귀 함수는 각 호출마다 스택 메모리를 사용합니다. 너무 깊은 재귀 호출은 스택 오버플로를 일으킬 수 있습니다. 4. **String과 기타 동적 객체**: 아두이노의 `String` 객체는 내부적으로 동적 할당을 사용합니다. 문자열 연산(결합, 추가, 수정 등)은 실행 중에 추가 메모리를 사용할 수 있으며, 이는 메모리 단편화를 일으킬 수 있습니다. ### 실시간 메모리 사용 모니터링 아두이노에서 실시간으로 메모리 사용량을 모니터링하는 것은 기본적으로 간단하지 않습니다. 하지만, 몇 가지 방법으로 현재 사용 가능한 메모리의 양을 추정할 수 있습니다: - **자유 메모리 계산 함수**: 사용 가능한 힙(Heap)과 스택(Stack) 메모리 사이의 간격을 계산하는 함수를 작성하여 현재 남은 메모리의 양을 추정할 수 있습니다. - **외부 라이브러리 사용**: 메모리 사용을 모니터링하는 데 도움이 되는 여러 아두이노 라이브러리가 있습니다. 예를 들어, `MemoryFree` 라이브러리 등이 있습니다. ### 주의사항 - 동적 메모리 할당은 메모리 누수와 단편화를 일으킬 위험이 있으므로, 가능한 한 피하는 것이 좋습니다. ...

마법의 숫자(Magic Number)

 "마법의 숫자(Magic Number)"는 프로그래밍에서 코드 내에서 직접적으로 표현된 숫자를 의미합니다. 이러한 숫자들은 코드를 읽는 사람에게 그 의미가 명확하지 않으며, 변경이 필요할 때 여러 곳에서 일일이 수정해야 하는 문제가 있습니다. ### 마법의 숫자의 문제점 1. **가독성 저하**: 숫자가 코드 내에서 직접적으로 사용될 때, 그 숫자가 무엇을 의미하는지 명확하지 않아 코드의 이해가 어려워집니다. 2. **유지보수 어려움**: 같은 숫자가 프로그램 전체에 걸쳐 여러 번 사용되면, 이 숫자를 변경해야 할 경우 모든 부분을 찾아서 일일이 수정해야 합니다. 3. **오류 발생 용이**: 숫자를 직접 사용하면 실수로 잘못된 값을 사용할 위험이 높아집니다. ### 해결 방법 - **상수 사용**: 마법의 숫자 대신 명확한 이름을 가진 상수를 정의하여 사용합니다. 예를 들어, `const int MAX_SIZE = 100;`과 같이 사용합니다. - **열거형 사용**: 관련된 숫자들은 열거형(enum)을 사용하여 그룹화할 수 있습니다. - **구성 파일 또는 정의 파일 사용**: 프로그램 설정이나 중요한 값을 별도의 파일에 정의하여 사용합니다. ### 예시 ```cpp // 마법의 숫자 사용 예 int volume = 100; // 상수 사용 예 const int MAX_VOLUME = 100; int volume = MAX_VOLUME; ``` 이러한 방식을 사용하면 프로그램의 가독성과 유지보수성이 크게 향상됩니다.

아두이노 버전 확인

아두이노 IDE에서 사용되는 C++ 표준 버전을 확인하려면, 아두이노 보드에 작은 스케치를 업로드하여 `__cplusplus` 매크로의 값을 출력해보면 됩니다. 이 값은 사용 중인 C++ 표준 버전을 나타냅니다. 다음과 같은 간단한 스케치를 사용하여 확인할 수 있습니다: ```cpp void setup() {     Serial.begin(9600);     while (!Serial) {} // 시리얼 포트가 연결될 때까지 기다립니다.     Serial.println(__cplusplus); // C++ 표준 버전을 출력합니다. } void loop() {} ``` 이 스케치를 아두이노에 업로드한 후, 9600의 보드 레이트로 시리얼 모니터를 열어보세요. 출력된 숫자는 C++ 표준 버전을 나타냅니다: - `199711L`: C++98 또는 C++03 - `201103L`: C++11 - `201402L`: C++14 - `201703L`: C++17 이 버전은 사용하고 있는 아두이노 보드와 아두이노 IDE의 버전에 따라 다를 수 있습니다. 아두이노 IDE는 일반적으로 가장 최근의 C++ 표준을 사용하지 않고, 다양한 마이크로컨트롤러 아키텍처에 걸쳐 안정성과 호환성을 우선시합니다. --- 참고로 내꺼 201103 c++11사용

콜백 함수(callback function)란

 콜백 함수(callback function)는 어떤 함수에 인자로 전달되어, 그 함수 내부에서 호출되는 함수입니다. 콜백 함수는 보통 비동기적 처리, 이벤트 처리, 또는 다른 함수의 동작을 사용자 정의하는 데 사용됩니다. 즉, 콜백 함수는 특정 작업이 완료됐을 때 실행되거나, 특정 이벤트(예: 사용자 입력, 타이머 만료 등)가 발생했을 때 호출됩니다. ### 콜백 함수의 특징과 사용 사례 1. **사용자 정의 동작**: 콜백 함수를 사용하면 라이브러리나 API 사용자가 특정 이벤트에 대한 반응을 정의할 수 있습니다. 2. **비동기 처리**: 네트워크 요청, 파일 I/O 작업 등 비동기적으로 처리되는 작업의 완료 시 콜백 함수를 호출하여 결과를 처리할 수 있습니다. 3. **이벤트 리스너**: 사용자 인터페이스의 버튼 클릭, 키보드 입력 등의 이벤트에 대해 콜백 함수를 할당하여 해당 이벤트가 발생했을 때 실행되도록 할 수 있습니다. 4. **고차 함수(Higher-order function)의 인자**: 다른 함수의 인자로 콜백 함수를 전달하여, 그 함수 내에서 특정 조건이나 상황에 따라 콜백 함수를 호출합니다. ### 예시: 아두이노에서 콜백 함수 사용 ```cpp void myCallback() {     // 콜백 함수에서 수행할 작업 } void setup() {     // 콜백 함수를 설정     attachInterrupt(digitalPinToInterrupt(pin), myCallback, CHANGE); } void loop() {     // 메인 루프 } ``` 이 예제에서, `attachInterrupt` 함수는 아두이노 핀의 상태 변화에 대한 인터럽트를 설정하는 데 사용되며, `myCallback` 함수는 해당 핀의 상태가 변했을 때 호출됩니다. 콜백 함수는 프로그램의 흐름을 더 유연하게 만들고, 특정 작업에 대한 사용자 정의 반응을 가능하게 하는 중요한 ...

c++ 문자열 함수

 아두이노에서 문자열(String) 비교를 수행하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 `String` 클래스에 내장된 `==` 연산자를 사용하는 것입니다. 또한 `equals()` 메서드나 C 스타일 문자열을 위한 `strcmp()` 함수도 사용할 수 있습니다. ### `String` 객체 사용하기 아두이노의 `String` 클래스는 `==` 연산자를 오버로드하여 문자열 비교를 쉽게 수행할 수 있게 합니다. ```cpp String str1 = "Hello"; String str2 = "World"; String str3 = "Hello"; if (str1 == str3) {     // str1과 str3는 같습니다. } if (str1 != str2) {     // str1과 str2는 다릅니다. } ``` `equals()` 메서드를 사용하는 방법도 있습니다. 이 메서드는 두 `String` 객체가 같은지 비교하고, 결과를 불리언 값으로 반환합니다. ```cpp if (str1.equals(str3)) {     // str1과 str3는 같습니다. } ``` ### C 스타일 문자열 비교하기 C 스타일 문자열(즉, `char` 배열)의 경우 `strcmp()` 함수를 사용할 수 있습니다. 이 함수는 두 문자열이 같으면 0을 반환합니다. ```cpp char charStr1[] = "Hello"; char charStr2[] = "World"; char charStr3[] = "Hello"; if (strcmp(charStr1, charStr3) == 0) {     // charStr1과 charStr3는 같습니다. } if (strcmp(charStr1, charStr2) != 0) {     // charStr1과 charStr2는 다릅니다. } ``` `strcmp()` 함수는 문자열이 정확히 같은 경우 0을 반환하며, 다...

XBM (X BitMap) vs Bitmap

  `XBM` (X BitMap) 형식과 일반 `Bitmap` 형식 사이에는 몇 가지 주요 차이점이 있습니다. ### XBM (X BitMap) - **텍스트 기반**: XBM 형식은 주로 텍스트 파일로 저장되며, C 언어 스타일의 구문으로 표현됩니다. 이는 배열 형태로 데이터가 저장되어 있으며, 이를 통해 비트맵 이미지가 표현됩니다. - **모노크롬**: XBM은 모노크롬 이미지를 위한 형식으로, 각 픽셀은 1비트로 표현됩니다 (켜짐 또는 꺼짐). - **프로그래밍 용이성**: XBM 형식은 프로그래밍에서 직접적으로 사용하기 쉬운 형태를 가지고 있습니다. C나 C++ 코드에 쉽게 포함시킬 수 있으며, 아두이노와 같은 마이크로컨트롤러 프로그래밍에서 자주 사용됩니다. ### Bitmap - **바이너리 기반**: 일반 `Bitmap` 파일은 바이너리 형식으로 저장됩니다. 이 형식은 이미지의 픽셀 데이터를 포함하며, 색상 정보, 해상도, 이미지의 크기 등 추가적인 메타데이터도 포함할 수 있습니다. - **컬러 및 그레이스케일 지원**: Bitmap 형식은 모노크롬뿐만 아니라 컬러 및 그레이스케일 이미지도 지원합니다. 각 픽셀은 여러 비트를 사용하여 색상을 표현할 수 있습니다. - **일반적인 이미지 형식**: Bitmap은 널리 사용되는 이미지 파일 형식으로, 많은 그래픽 편집 도구와 뷰어에서 지원됩니다. ### 결론 - `XBM`은 프로그래밍에서 사용하기 쉬운 텍스트 기반의 모노크롬 이미지 형식입니다. - 일반 `Bitmap`은 보다 복잡한 바이너리 기반 형식으로, 다양한 색상을 지원하며 일반적인 이미지 파일 형식으로 사용됩니다. 이 두 형식은 사용 목적과 요구 사항에 따라 선택될 수 있으며, 특히 임베디드 시스템이나 마이크로컨트롤러 프로그래밍에서는 XBM 형식이 더 적합할 수 있습니다.

#include "filename vs #include

C와 C++ 언어에서 `#include "filename"`와 `#include <filename>` 사이의 차이는 헤더 파일을 포함하는 방식에 대한 컴파일러의 검색 경로에 관한 규칙을 정의합니다. ### `#include "filename"` - 컴파일러는 먼저 소스 코드 파일이 있는 현재 디렉토리에서 `"filename"`을 찾습니다. - 만약 거기에 없다면, 표준 라이브러리 경로와 같은 시스템 포함 경로를 검색합니다. - 이 방식은 주로 사용자 정의 헤더 파일이나 프로젝트 내부에 있는 헤더 파일을 포함할 때 사용됩니다. ### `#include <filename>` - 컴파일러는 표준 라이브러리 경로와 같은 시스템 포함 경로에서 `"filename"`을 검색합니다. - 이 방식은 주로 표준 라이브러리 헤더 파일이나 외부 라이브러리의 헤더 파일을 포함할 때 사용됩니다. ### 적용 - C나 C++ 프로그래밍에서, 표준 라이브러리(예: `iostream`, `stdio.h`)나 외부 라이브러리 헤더 파일을 포함할 때는 `<>`를 사용하는 것이 일반적입니다. - 프로젝트 내부의 사용자 정의 헤더 파일을 포함할 때는 `""`를 사용합니다. 이러한 규칙은 컴파일러가 헤더 파일을 더 효율적으로 찾을 수 있도록 도와주며, 표준 라이브러리와 사용자 정의 코드 사이의 구분을 명확하게 합니다.

blogger contempo 템플릿 목록에서 태그 추가

이미지
 blogger contempo 템플릿 목록에서 태그 추가하기 contempo는 블로거에서 만든 템플릿이고 오래되어서 검색하면 편집 방법이 좀 나온다. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiuW6-XPXYFePBQg3eEtcwTBNjNSQFb62wcWqm6CF7FhTi_wmph97AumNUiOLwuoFyGb8-G2NmxZRE6y7FHfhVBy-nU_woofrGwS9ZJv3a0EHiHb8UsWef53K6kjsjHRsG3uZUBTGYmfQXnSAbAOeMIFC2PiHW79LPzrMFUPWXU-OmZqyn4fOrOtMUMvSxK" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="340" data-original-width="1684" height="130" src="https://blogger.googleusercontent.com/img/a/AVvXsEiuW6-XPXYFePBQg3eEtcwTBNjNSQFb62wcWqm6CF7FhTi_wmph97AumNUiOLwuoFyGb8-G2NmxZRE6y7FHfhVBy-nU_woofrGwS9ZJv3a0EHiHb8UsWef53K6kjsjHRsG3uZUBTGYmfQXnSAbAOeMIFC2PiHW79LPzrMFUPWXU-OmZqyn4fOrOtMUMvSxK=w640-h130" width="640" /></a></div> 줄 부분 추가해서 글 안들어가도 포스트의 태그를 볼 수 있게함. 변수명 웃기게 지었네 <div class=...

unsigned int signed int

 unsigned int signed int 옛날에 배울때는 감흥이 없었는데 이걸 어디다 쓰지 이런 기분이었는데 아두이노 공간 줄이면서 적절한걸로 맞춰 쓰니까 뭔가 딱 떨어지는 쾌감과 두근거림이 있다

멋진 led 디스플레이 + 회전 조합

 멋지다 https://youtu.be/HKpBhE7QVAI?si=6VIH1XuIGPFyXrgS

xbm 아두이노용 에디터

 xbm 아두이노용 에디터 https://xbm.jazzychad.net/? 이런게 있는줄 몰랐다

아두이노 랜덤 함수 random()

 랜덤 함수 사용법 https://www.arduino.cc/reference/en/language/functions/random-numbers/random/ long randNumber; void setup() { Serial.begin(9600); // if analog input pin 0 is unconnected, random analog // noise will cause the call to randomSeed() to generate // different seed numbers each time the sketch runs. // randomSeed() will then shuffle the random function. randomSeed(analogRead(0)); ////여기서 시드 생성인데 아날로그 연결 안해도 지정해주면 //거기서 나오는 전기 신호로 랜덤 값으로 시드 지정 } void loop() { // print a random number from 0 to 299 randNumber = random(300); Serial.println(randNumber); // print a random number from 10 to 19 randNumber = random(10, 20); Serial.println(randNumber); delay(50); } `randomSeed(analogRead(0));`는 아두이노에서 `random()` 함수의 난수 생성 패턴을 더 무작위로 만드는 데 사용됩니다. `randomSeed()` 함수는 난수 생성기에 "시드(seed)" 값을 제공하여 난수 생성의 시작점을 설정합니다. 이 시드 값에 따라 생성되는 난수의 시퀀스가 결정됩니다. ### 왜 필요한가? - **동일한 시퀀스 방지**: 아두이노를 리셋하거나 새로 시작할 때마다 같은 난수 시퀀스가 반복되는 것을 방지합니다. `random()` 함수는 기본적으로 동일한 시드 값을...

아두이노 포럼

 아두이노 포럼에는 유독 날선 댓글이 많아 보인다 검색하다가 여러개 봤는데 영어라서 이게 날선 글인지 아님 영어로 말하면 그런건지 애매했는데 이글 보니까 확실히 다투고 있는게 보인다 https://forum.arduino.cc/t/c-11-support/549237/7 ->  dont help me in this way!!! you are wasting my and your time. -> Clearly. Well, don't worry, I won't waste my time trying to provide free assistance to such an ungrateful jerk as you ever again. 뭔가 흥미로웠다

아두이노 ram dynamic memory 절약 팁

Progmem에 스트링 옮기기  https://www.arduino.cc/reference/en/language/variables/utilities/progmem/ string 보다는 char string으로 길이 고정해서 사용하기

납땜 팁

 점퍼선 탈피하고 납땜하기 https://youtu.be/PuY9kKn4zWM?si=ghuycpcL0fX6yOpQ

u8g2 사용하기

이미지
# 용량관리 아두이노에서 "Global variables use 1669 bytes (81%) of dynamic memory"라는 메시지는 사용 중인 글로벌 변수가 동적 메모리(RAM)의 상당 부분을 차지하고 있음을 나타냅니다. 이는 메모리 부족 문제로 이어질 수 있으므로, 메모리 사용량을 최적화하는 것이 중요합니다. 메모리 사용량을 줄이기 위해 시도할 수 있는 몇 가지 방법은 다음과 같습니다: 1. **변수 크기 최적화**: 변수를 선언할 때 필요한 최소 크기의 데이터 타입을 사용합니다. 예를 들어, `int` 대신 `byte`나 `uint8_t`를 사용할 수 있습니다. 2. **정적 메모리 사용**: 가능하면 `PROGMEM`을 사용하여 상수 데이터(예: 문자열, 설정값)를 플래시 메모리에 저장합니다. 이렇게 하면 이러한 데이터가 RAM을 차지하지 않습니다. 3. **로컬 변수 사용**: 글로벌 변수 대신 함수 내부에 로컬 변수를 사용합니다. 로컬 변수는 해당 함수가 실행될 때만 메모리를 차지하고 함수가 종료되면 메모리가 해제됩니다. 4. **동적 할당 최소화**: `malloc`이나 `new`를 사용하는 동적 메모리 할당을 최소화합니다. 동적 할당은 메모리 관리를 복잡하게 만들고 메모리 누수의 위험을 증가시킵니다. 5. **불필요한 라이브러리 제거**: 사용하지 않는 라이브러리를 코드에서 제거합니다. 라이브러리는 종종 추가적인 메모리를 사용하기 때문입니다. 6. **배열 크기 조정**: 배열을 사용하는 경우, 배열의 크기를 실제로 필요한 최소한으로 조정합니다. 7. **싱글턴 패턴 사용**: 여러 인스턴스가 필요하지 않은 객체에 대해 싱글턴 패턴을 사용하여 단 하나의 인스턴스만을 유지합니다. 8. **코드 최적화**: 불필요한 코드를 제거하고, 효율적인 알고리즘을 사용하여 메모리 사용을 줄입니다. 9. **디버깅 메시지 최소화**: 시리얼 통신을 통한 디버깅 메시지는 문자열을 많이 사용할 수 있으므로, 이를 최소화합니다. 메모리 사용량...

어떤 유튜버가 올린 oled 판매, 관련 링크들

이미지
투명 디스플레이 8000원, 큰 디스플레이 만원대 등등 흥미로운거 많아서 저장 출처 https://youtu.be/K5e0lFRvZ2E?si=A8fnJ7EI8-DPEzvT WOKWI start project progress bar - https://wokwi.com/projects/300867986768527882 128x64 SSD1306 OLED Display: https://ko.aliexpress.com/item/1005001621832273.html?aff_fcid=975b01c50b74468aab8cf879b0136550-1705823866754-00327-_DCKdvnh&tt=CPS_NORMAL&aff_fsk=_DCKdvnh&aff_platform=shareComponent-detail&sk=_DCKdvnh&aff_trace_key=975b01c50b74468aab8cf879b0136550-1705823866754-00327-_DCKdvnh&terminal_id=b9decb3559d445a9a2cd02964f62a465&afSmartRedirect=y&gatewayAdapt=glo2kor Transparent OLED display: https://ko.aliexpress.com/item/1005003461591174.html?aff_fcid=83403d6870ee424db343c1190dc50288-1705824435442-09001-_Dns6eLz&tt=CPS_NORMAL&aff_fsk=_Dns6eLz&aff_platform=shareComponent-detail&sk=_Dns6eLz&aff_trace_key=83403d6870ee424db343c1190dc50288-1705824435442-09001-_Dns6eLz&terminal_id=b9decb3559d445a9a2cd02964f62a465&afSmartRedirect=y Ar...