Buzzer와 부저 모듈

왼쪽에 그냥 부저만 있고 가운데 있는게 부저 모듈입니다. 둘 다 passive 이지만 모듈에는 “2TY” 마킹 되어 있는 S8550 칩이 들어가 있어서 이게 소리를 크게 만듭니다. 삐소리를 3초 이상 듣고 있기 힘듭니다.

const int buzzer = 10;

void setup(){
  pinMode(buzzer, OUTPUT);
}

void loop(){
  tone(buzzer, 1000);
  delay(50);
  noTone(buzzer);
  delay(2000);
}
const int buzzerModule = 9;

void setup(){
  pinMode(buzzerModule, OUTPUT);
  digitalWrite(buzzerModule, HIGH); // no sound
}

void loop(){
  analogWrite(buzzerModule, 250); // PWM: 0 - 255
  delay(100);
  digitalWrite(buzzerModule, HIGH);
  delay(1000);
}

250으로 analogWrite 하면 소리가 그나마 작아서 들을 수 있겠네요.

Light sensors – LDR, Temt6000, BH1750

3가지 Light sensors에 대해 알아봅니다.

1. LDR

2. Temt6000

3. BH1750

위에 1번은 레지스터로 Voltage Divider 방식으로 빛의 강도를 체크하고 2번은 트랜지스터인데 이것도 안에 10k 레지스터가 포함되어 있어 1번과 같은 방식입니다. 3번은 I2C 방식으로 Lux 데이터를 바로 받을 수 있고 0-54612로 범위도 넓어서 사용하기 제일 좋네요. 

1번은 저항을 추가해서 그냥 막 사용하기에는 좋은데 작업이 필요하다는 것

2번은 1번에 저항만 추가되었다고 보시면 될정도의 수준이네요. 사용하기 편하지만 range가 넓지가 않네요.

3번은 I2C 방식이고 범위도 넓어서 좋은데 가격이 3개 중에서 제일 비싸다는 것이 단점이네요.

APDS-9960 센서

I2C로 연결하면 됩니다. 칩 자체는 3.3V용으로 만들어져 있지만 아래 모듈은 5V로 연결 가능합니다.

1. Gesture Detection

2. Proximity Detection

3. Ambient Light Sense

4. RGBC (Color Sense)

4가지 기능을 가진 센서입니다.

NeoPixel 테스트

네오픽셀 테스트입니다. 픽셀하나에 평균 20mA이고 최대 60mA까지 사용합니다. 8개짜리 네오픽셀이라고 해도 최대 480mA나 사용 가능하기 때문에 USB의 최대 허용 500mA 를 고려하면 아래 그림처럼 네오픽셀 전원 공급은 따로 하는게 좋겠지요.

#include <Adafruit_NeoPixel.h>

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(50);
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

아두이노 시계 Pro Micro용 PCB 제작

시계용 PCB를 제작해서 와이어 연결할 필요없이 소켓에 꽂기만 하면 시계 구성이 됩니다. LDR센서를 넣어서 주변 밝기에 따라 LED가 조정되게 만들었습니다. 만들고 나니깐 깔끔하네요.