개발자/Arduino

가변저항 두 개로 시간을 보여주는 코드

지구빵집 2023. 10. 13. 08:23
반응형

 

가변 저항 두 개를 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");
}

 

 

 

 

 

반응형