본문 바로가기

개발자/Arduino

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

반응형

 

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

 

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩