반응형
가변 저항 두 개를 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 디지털 온도 센서 인터페이스 (2) | 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 |
더욱 좋은 정보를 제공하겠습니다.~ ^^