반응형
가변 저항 두 개를 A0(시간 설정), A1(분을 설정)연결하여 시간과 분을 설정하면 SSD1306 OLED에 표시한다. 코드가 좀 지저분 하지만 사용자 값을 설정할 때 얼마든지 활용 가능한 아이디어로 올려둔다.
회로도 참고

/*
server address: http://api.sleep-doc.com/sleepq2/578f38a45732416d3ceb7899/2023/09/05
https://fishpoint.tistory.com/5156
*/
#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4 // define display reset pin
Adafruit_SSD1306 display(OLED_RESET);
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key index number (needed only for WEP)
int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)
char server[] = "api.sleep-doc.com"; // name address for Google (using DNS)
// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiClient client;
const int light_pwm_pin = 5;
unsigned long past = 0; // 과거 시간 저장 변수
int flag = 0;
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
initial_oled();
pinMode(light_pwm_pin, OUTPUT);
start_ledblink();
}
void loop() {
int alam_hour = getAlarm_hour();
int alam_minutr = getAlarm_minute();
Serial.println(alam_hour);
Serial.println(alam_minutr*5);
//fade_in();
delay(500);
}
void fade_in()
{
//if time changed set pwm
for(int i=0; i < 255; i++){
setLight(i);
delay(300);
}
setLight(255);
delay(900000);
}
void setLight(int strength)
{
analogWrite(light_pwm_pin, strength);
}
void start_ledblink() //only
{
setLight(100);
delay(100);
setLight(0);
delay(100);
setLight(100);
delay(100);
setLight(0);
}
int getAlarm_hour()
{
int intervalIndex = 0;
// 분할된 구간 수 설정
int numIntervals = 24;
// 숫자 범위 설정
int minValue = 0;
int maxValue = 4095; // 1024가 아니라 1023을 기준으로 나눕니다.
// 각 구간의 길이 계산 - 42
int intervalLength = (maxValue - minValue + 1) / numIntervals; // +1을 추가하여 올림 처리
// 각 구간의 범위 계산
int intervalStart[numIntervals];
int intervalEnd[numIntervals];
intervalStart[0] = 0 * intervalLength + minValue;
intervalEnd[0] = 1 * intervalLength + minValue;
for (int i = 1; i < numIntervals; i++) {
intervalStart[i] = intervalEnd[i-1] + 1;
intervalEnd[i] = intervalStart[i] + intervalLength + minValue;
}
// 입력 숫자 설정 (예: 512)
analogReadResolution(12);
int inputNumber = analogRead(A0);
//Serial.println(inputNumber);
if (inputNumber < minValue || inputNumber > maxValue) {
Serial.println("입력한 숫자는 범위를 벗어납니다.");
}
else
{
// 입력한 숫자가 어떤 구간에 속하는지 찾기
intervalIndex = -1;
for (int i = 0; i < numIntervals; i++) {
if (inputNumber >= intervalStart[i] && inputNumber <= intervalEnd[i]) {
intervalIndex = i;
break;
}
}
display.setCursor(23, 10); //hour
if(intervalIndex < 10)
display.print("0" + String(intervalIndex)+" :");
else display.print(String(intervalIndex)+" :");
display.display();
}
return intervalIndex;
}
int getAlarm_minute()
{
int intervalIndex = 0;
// 분할된 구간 수 설정
int numIntervals = 12;
// 숫자 범위 설정
int minValue = 0;
int maxValue = 4095; // 1024가 아니라 1023을 기준으로 나눕니다.
// 각 구간의 길이 계산 - 42
int intervalLength = (maxValue - minValue + 1) / numIntervals; // +1을 추가하여 올림 처리
// 각 구간의 범위 계산
int intervalStart[numIntervals];
int intervalEnd[numIntervals];
intervalStart[0] = 0 * intervalLength + minValue;
intervalEnd[0] = 1 * intervalLength + minValue;
for (int i = 1; i < numIntervals; i++) {
intervalStart[i] = intervalEnd[i-1] + 1;
intervalEnd[i] = intervalStart[i] + intervalLength + minValue;
}
// 입력 숫자 설정 (예: 512)
analogReadResolution(12);
int inputNumber = analogRead(A1);
//Serial.println(inputNumber);
if (inputNumber < minValue || inputNumber > maxValue) {
Serial.println("입력한 숫자는 범위를 벗어납니다.");
} else {
// 입력한 숫자가 어떤 구간에 속하는지 찾기
intervalIndex = -1;
for (int i = 0; i < numIntervals; i++) {
if (inputNumber >= intervalStart[i] && inputNumber <= intervalEnd[i]) {
intervalIndex = i;
break;
}
}
display.setCursor(75, 10);
if(intervalIndex == 0)
display.print("0" + String(intervalIndex));
else if(intervalIndex == 1)
display.print("0" + String(intervalIndex*5));
else display.print(String(intervalIndex*5));
display.display();
}
//delay(500);
return intervalIndex;
}
void currentTimetoOLED()
{
display.setTextSize(1);
display.setCursor(23, 10);
display.print("06:00:00");
display.setCursor(33, 20);
display.print("Alarm!");
//display.drawCircle(76, 12, 2, WHITE);
//display.drawCircle(60, 32, 2, WHITE);
//display.drawCircle(70, 42, 2, WHITE);
display.display();
}
void initial_oled()
{
//initialize the SSD1306 OLED display with I2C address = 0x3D
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// clear the display buffer.
display.clearDisplay();
display.setTextSize(1); // text size = 1
display.setTextColor(WHITE, BLACK); // set text color to white and black background
display.setCursor(20, 0); // move cursor to position (15, 0) pixel
display.print("Light Control");
display.display(); // update the display
display.setTextSize(2); // text size = 2
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
반응형
'개발자 > Arduino' 카테고리의 다른 글
| Arduino와 DS18B20 1-Wire 디지털 온도 센서 인터페이스, 온도표시 (2) | 2024.09.05 |
|---|---|
| Arduino와 여러 개 DS18B20 디지털 온도 센서 인터페이스 (3) | 2024.09.05 |
| 아두이노 짧은 시간 Delay 사용 하지 않는 코드 (1) | 2023.10.18 |
| nano 33 iot 1초 타이머 작동 - delay 사용 금지 (1) | 2023.10.13 |
| nano 33 IoT 보드 ADC 12bit 설정 (0) | 2023.10.05 |
| 0부터 1023 까지 숫자를 12시간중 어떤 구간인지 알아내는 코드 (1) | 2023.10.05 |
| PIR 센서를 이용한 보안 경보 시스템 (0) | 2023.08.28 |
| 아두이노 ADC 모듈 ADS1115 ADS1015 (0) | 2023.05.02 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩