일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프리미어
- 3D모델링
- Premiere
- FUSION 360
- ChatGPT
- suno
- 레이저커팅
- lasercutting
- 3D modeling
- fusion360
- 3d
- 구루미비즈
- 무드등
- seoulmysoul
- 구루미 고객센터
- 3dmodeling
- 서울마이소울
- 3Dprinting
- 구루미 장애사항
- 구루미biz(gooroomeebiz)
- BrainCar
- 구루미biz
- 22ww.tistory.com
- 3D PRINTING
- laserutting
- 3D 모델링
- 볼트 모델링
- micro-bit
- LayerCutting
- 3D프린팅
- Today
- Total
CodingMaker
15 Final Project 본문
Final Project
프로젝트 구상
겨울철 더 심하게 찾아오는 미세먼지, 사진처럼 이런 날들이 이제는 일상이 되어가고 있다.
오른쪽 사진의 남산은 그날 그날의 공기질을 나타내준다. 미세먼지가 심하면 빨강, 깨끗하면 파랑,
미세먼지가 좋지 않다는 건 알지만 미세먼지가 심한 날도 마스크를 한 사람은 많이 볼수 없다.
눈으로 직접 수치를 보거나 색으로 미세먼지의 심한 정도를 표현해주면 조금은 더 신경쓰지 않을까 생각해서 미세먼지 측정기를 만들어 보기로 한다.
아이디어 스케치
준비물
미세먼지 센서 |
mini led Matrix |
arduino nano |
led(빨,노,초,파) |
온 습도센서 |
|||||
|
|
|
|
|
그외 아두이노 브레드보드 케이블 등
Sensor Test
센서들을 적용하기전 각각 테스트를 해본다.
온도,습도 센서 & 앱인벤터
온습도 센서의 값을 스마트폰으로 확인할수 있는 장치를 미세먼지 측정기에 추가하려고 한다.
먼저 온도습도 센서를 아두이노에 연결한다.
VCC |
5V |
OUT |
Digital 4 pin |
GND |
GND |
회로도
코드 - 온습도 센서만 연결된 상태에서 시리얼 모니터를 통해 값의 변화를 살펴본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <DHT11.h> // 온 습도 센서의 해당 라이브러리를 가져온다 int pin=5; // 디지털 5번핀에 연결한다. DHT11 dht11(pin); void setup() { Serial.begin(9600); while (!Serial) { ; } } void loop() { int err; float temp, humi; if((err=dht11.read(humi, temp))==0) { Serial.print("temperature:"); Serial.print(temp); //*** 온도 Serial.print(" humidity:"); Serial.print(humi); // *** 습도 Serial.println(); } else { Serial.println(); Serial.print("Error No :"); Serial.print(err); Serial.println(); } delay(DHT11_RETRY_DELAY); //delay for reread } |
시리얼 모니터 실행 영상 - 온 습도가 실시간 변화하는 것을 볼 수 있다.
블루투스도 연결한다. 블루투스의 초기 비밀번호는 1234
아래와 같이 선을 연결한다.
왼쪽 온습도 센서 |
오른쪽 블루투스 |
||
VCC |
5V |
RXD |
D6 |
OUT |
D5 |
TXD |
D7 |
GND |
GND |
GND |
GND |
|
VCC |
5V |
회로도
블루투스와 온습도 센서를 연결한다.
라이브러리 관리에 들어가서 라이브러리를 추가한다. 3번째의 SimpleDHT 를 설치한다.
예제파일을 불러온다.
코드 : 코드에서 추가하거나 변경한다. 블루투스로 연결하기 위해서다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <SoftwareSerial.h> // 라이브러리 포함하기 #include <SimpleDHT.h> // DHT11 온습도센서, VCC: 5V or 3V,GND: GND, DATA: D5 // 블루투스 RXD:D6, TXD:D7, GND:GND, VCC:5V int pinDHT11 = 5; // D5번 핀으로 변경하기 SimpleDHT11 dht11; SoftwareSerial BTSerial(7,6); void setup() { Serial.begin(9600); BTSerial.begin(9600); } void loop() { // start working... Serial.println("================================="); Serial.println("Sample DHT11..."); // read without samples. byte temperature = 0; byte humidity = 0; int err = SimpleDHTErrSuccess; if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000); return; } Serial.print("Sample OK: "); Serial.print((int)temperature); Serial.print(" *C, "); Serial.print((int)humidity); Serial.println(" H"); BTSerial.print((char)temperature); BTSerial.print((char)humidity); // DHT11 sampling rate is 1HZ. delay(1500); } |
앱 인벤터를 실행한 후에 새로운 프로젝트를 시작한다.
ListPicker나 Label, 블루투스, 시간등의 필요한 것들을 Designer에서 꺼내놓는다.
앱 인벤터에서 아래와 같이 블록코딩을 한다.
스마트폰으로 블루투스를 연결한다. 맨 위의 블루투스가 해당 블루투스이므로 20:16:10:10:72:06 buni 선택하고 연결한다.
스마트폰에서 블루투스가 잘 연결이 되면 true 값을 보여준다.
실행동영상
앱인벤터에서 연결하고 온도와 습도의 변화를 실시간으로 스마트폰에서 확인할수 있는 동영상
Mini 8*8 LED Matrix
https://www.adafruit.com/product/872
라이브러리 두개를 추가한다.
Adafruit LED Backpack Library 추가, Adafruit GFX 추가
라이브러리 포함하기 --> 라이브러리 관리를 클릭하고 Adafruit LED Backpack Library, Adafruit GFX를 설치한다.
그러면 아래 그림과 같이 라이브러리가 생긴다.
아래 표와 같이 핀을 연결한다.
VCC |
5V |
GND |
GND |
SDA |
A4(아날로그 4번핀에 연결한다) |
SCM |
A5(아날로그 5번핀에 연결한다) |
회로도
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <Wire.h> #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" Adafruit_8x8matrix matrix = Adafruit_8x8matrix(); void setup() { matrix.begin(0x70); // pass in the address } static const uint8_t PROGMEM smile_bmp[] = //웃는 표정 { B00111100, B01000010, B10100101, B10000001, B10100101, B10011001, B01000010, B00111100 }, neutral_bmp[] = //so so 표정 { B00111100, B01000010, B10100101, B10000001, B10111101, B10000001, B01000010, B00111100 }, frown_bmp[] = // 화난 표정 { B00111100, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100 }, frown2_bmp[] = // 많이 화가나서 뿔도 난 표정 { B10111101, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100 }; void loop() { matrix.clear(); matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON); //웃는 표정 matrix.writeDisplay(); delay(500); matrix.clear(); matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_ON); //so so 표정 matrix.writeDisplay(); delay(500); matrix.clear(); matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON); // 화난 표정 matrix.writeDisplay(); delay(500); matrix.clear(); matrix.drawBitmap(0, 0, frown2_bmp, 8, 8, LED_ON); // 많이 화가나서 뿔도 난 표정 matrix.writeDisplay(); delay(500); } |
실행동영상
LCD
LCD가 4핀과 16핀 두가지가 있는데 4핀을 선택하지 못한 이유는 mini LED Matrix와 4핀 LCD가 모두 A4번과 A5번 핀을 사용해야하기 때문에 이 둘중 하나를 포기했어야했다.
그래서 두가지 모듈을 모두 사용하기 위해 16핀의 LCD 모듈을 사용하였다.
모듈이 바뀌면 사용하는 라이브러리가 바뀌고 코드도 조금씩 달라진다.
4핀 |
16핀 |
|
|
<LiquidCrystal_I2C.h> |
<LiquidCrystal.h> |
https://electrosome.com/interfacing-lcd-arduino-uno/
AutoCAD로 도면 작성
미세먼지 측정기에 들어갈 각종 센서와 보드가 들어갈 수 있도록 사이즈가 적당한 도면을 1차적으로 작성해 보았다. 1차적인 구상은 LCD를 통해서 미세먼지의 양을 측정하고 보여준다. 그리고 미세먼지 양에 따라 4단계의 표정이 나타나는데 각 표정에 RGB LED로 좋음(파랑), 보통(하늘색), 나쁨(주황), 위험(빨강 + 버저음) 단계로 표현이 되며 각 단계가 되면 상태를 LCD 모니터로 알려주고 표정에 LED 불빛이 켜지거나 소리가 나며 알려준다.
여기에 온도 습도 센서를 추가하여 온도와 습도를 알려주는 기능을 추가한다.
정면도와 좌측면도 우측면도 등을 작성한다.
Fusion 360 에서 모델링 작업
AutoCAD에서 2D도면을 그린후 DXF로 저장하고 Fusion 360에서 INSERT 메뉴를 눌러 DXF파일을 불러온다. 그런다음 편집이나 EXTRUDE 명령 등을 이용하여 3Dprinting할 3D 도면을 작성한다.
각각의 아두이노 모듈들이 들어갈 부분을 정한후 1차 모델링 작성을 했다. 앞부분에 대한 부분과 뒷부분에 대해 STL로 저장한다.
Cura 로 gcode 만들기
Cura를 열었다. 파일에서 모델불러오기를 한다.
오브젝트를 한번에 두개 모두 넣어 프린팅을 설정했더니 5시간가량 시간이 소요된다고 뜬다.
설정을 맞춘후 Gcode로 저장한다.
3D Printing
1차 모델링에서는 사이즈가 작아서 센서가 들어가지 않고 전원 케이블 꽂는 위치도 바뀌고 글자들도 뭉게져서 나와서 모델링이 좀 아쉬웠다.
사이즈 수정후 다시 모델링하고 3D 프린팅을 했다.
Fusion 360 에서 2차 모델링 수정 보완 작업
모델링의 뒷부분은 먼지 센서가 잘 고정될수 있게 작은 코너 기둥을 먼지센서의 크기에 맞게 추가하였다.
앞부분도 마찬가지로 LED끼리 거리가 가깝기 떄문에 벽을 만들어 해당 표정의 빛이 많이 퍼져 나가지 안하게 수정하였다. 케이블 구멍의 위치도 브레드보드와 나노보드가 합쳐진 높이를 계산하여 수정하였다.
모델링이 끝난 STL 파일을 다시 CURA를 열어 Gcode로 변경하여 3D 프린팅 하였다.
LED를 대략적으로 자리를 잡아 보았다. LED가 고정될수 있고 빛이 옆으로 확산되는걸 방지하기 위해 미리 모델링에서 벽을 만들었다. 그리고 빛이 은은하게 확산되게 하기위해 스티로폼으로 LED와 벽 사이를 한겹 넣어주었다.
LCD 모니터 하나의 선만 16개나 되니 각종 선들이 엄청 많아졌다. 두번째 모델링 수정으로 인해 딱 맞게 모든 선들이 잘 들어갔다. 임시로 일단 3M으로 고정시켰다. LED의 경우 LED가 위치할 부분은 모델링에서 미리 자리를 잡아주는 벽을 만들어줬다.
마지막으로 먼지센서까지 모두 쏙 들어갔다. 먼지 센서는 사진과 같이 뒷부분의 구멍을 종이나 검은 테이프 등으로 막아주어야 정확한 미세먼지를 측정할수 있다.
회로 연결이 모두 끝이 나고 3단계로 하나하나 코딩을 시작해 보았다.
처음 LED에 미세먼지 수치를 나오게 하기위해서 하던 테스트 수행중 LCD글자가 나오지 않아 많은 시행착오를 겪기도 했다. 다행히 원인은 너무도 간단했다. 가변저항을 돌려 맞추면 되었던 것이다. 그걸 모르고 회로를 수십번 다시 연결하는 수고를 하기도 했다.
이 모든 과정 덕분에 많이 공부하게 되기도 했다.
Fritzing 회로도
코딩하기
항목 |
핀번호 |
blue_LED |
A0 |
yellow_LED |
A1 |
green_LED |
A2 |
red_LED |
A3 |
미세먼지 센서 |
D8 |
buzzer |
D13 |
LED Matrix SDA |
A4 |
LED Matrix SCM |
A5 |
코딩은 4개의 단계를 거치며 하나씩 추가하는 방식으로 코딩을 진행하였다.
part 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //part 1 ----> LCD가 nano보드에서 잘 작동하는지 테스트 #include <LiquidCrystal.h> const int rs = 11, en = 10, d4 = 9, d5 = 4, d6 = 3, d7 = 2; // 필요한 LCD 인터페이스 핀을 연결하여 라이브러리 초기화 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // 연결된 arduino 핀 번호로 void setup() { lcd.begin(16, 2); // LCD의 열과 행 수를 설정합니다. lcd.print("hello, world!"); // LCD에 메시지를 출력한다. } void loop() { lcd.noDisplay(); // Turn off the display delay(500); lcd.display(); // Turn on the display delay(500); } |
part 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | //part 2 ----> 먼지 센서 값의 범위 4단계에 맞게 LED 불 켜고 끄기 #include <Wire.h> // ** LCD I2C 통신 사용 #include <LiquidCrystal.h> #include "sound_effect.h" // **사운드 이펙트 사용(음원효과) const int rs = 11, en = 10, d4 = 9, d5 = 4, d6 = 3, d7 = 2; // 필요한 LCD 인터페이스 핀을 연결하여 라이브러리 초기화 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // 연결된 arduino 핀 번호로 int blue_pin = A0; //**블루 LED int yellow_pin = A1; //**옐로우 LED int green_pin = A2; //**그린 LED int red_pin = A3; //**레드 LED int pin = 8; //먼지센서 int buzzer_pin = 13; //부저 unsigned long duration; //지속 시간 unsigned long starttime; //시작 시간 unsigned long sampletime_ms = 5000; //샘플시간 5초 마다 업데이트 unsigned long lowpulseoccupancy = 0; //Low 신호가 지속된 시간을 초기화 float ratio = 0; //비율 float concentration = 0; //입자 농도 0으로 초기화 float pcsPerCF = 0; //한 입자당 CF를 0으로 초기화 float ugm3 = 0; //최종 값으로 세제곱미터 당 마이크로 그램(㎍/㎥) uint8_t clock[8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0}; // 시계 이모티콘 void setup() { // lcd.begin(16, 2); // LCD의 열과 행 수를 설정합니다. // lcd.print("hello, world!"); // LCD에 메시지를 출력한다. Serial.begin(9600); //시리얼 통신 시작 pinMode(8,INPUT); //미세먼지 센서 입력 pinMode(A0,OUTPUT); //2 블루 LED 출력 pinMode(A1,OUTPUT); //2 블루 LED 출력 pinMode(A2,OUTPUT); //3 그린 LED 출력 pinMode(A3,OUTPUT); //4 레드 LED 출력 pinMode(13,OUTPUT); //부저 출력 digitalWrite(blue_pin, LOW); //애노드 RGB LED 이므로 HIGH이면 꺼진다.(이하 2개 동일) digitalWrite(green_pin, LOW); digitalWrite(red_pin, LOW); starttime = millis(); //현재 시간 대입 lcd.begin(16,2); //LCD 시작 // lcd.backlight(); //백라이트 ON lcd.clear(); //LCD 초기화 lcd.print("Hello!"); //다음 문자를 LDC에 출력 lcd.setCursor(0, 1); //두 번째 줄로 커서 이동 lcd.print("I will find DUST"); lcd.createChar(1, clock); //시계 이모티콘 출력 seSqueak(13); //초기시작 음원효과 delay(5000); // 5초 대기 if ( ugm3 == 0) { //만약 결과값이 0보다 작으면 아래를 LCD에 출력한다. lcd.clear(); lcd.print("Analysing Data"); lcd.write(1); lcd.setCursor(0, 1); lcd.print("................"); lowpulseoccupancy = 0; starttime = millis(); } } void loop() { duration = pulseIn(pin, HIGH); //**원래는 LOW이었슴 lowpulseoccupancy = lowpulseoccupancy+duration; if ((millis()-starttime) >= sampletime_ms) { //만약 샘플 시간이 5초라면(위에서 정한 샘플 시간) ratio = lowpulseoccupancy/(sampletime_ms*10.0); // 정수 백분율 concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; //미세먼지 센서 사양 시트 곡선 사용 pcsPerCF = concentration * 100; // 입자 농도에 100을 곱하면 입자당 CF값 ugm3 = pcsPerCF / 13000; //입자당 CF를 13000으로 나누면 미터세제곱당 마이크로그람의 미세먼지 측정값 if (ugm3 > 0.01 ) { // 만약에 결과값이 0.01보다 크면 미세먼지 값을 출력하라 lcd.clear(); lcd.print("Dust:"); lcd.print(ugm3); lcd.print("ug/m3"); lowpulseoccupancy = 0; starttime = millis(); } if (ugm3 > 0.01 && ugm3 <= 30) { //만약 미세먼지 값이 0.01 보다 크고 30이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Good! ^v^"); digitalWrite(red_pin, LOW); digitalWrite(yellow_pin, LOW); digitalWrite(green_pin, LOW); //만약에 RGB LED 애노드를 했을 경우 LOW가 켜진다. digitalWrite(blue_pin, HIGH); // 파랑색 //setColor(0, 0, 225); //블루 noTone(13); //소리 끔 } else if (ugm3 > 30 && ugm3 <= 80) { //만약 미세먼지 값이 30보다 크고 80이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("SoSo! ^ ^;"); digitalWrite(red_pin, LOW); digitalWrite(yellow_pin, LOW); digitalWrite(green_pin, HIGH); //초록 digitalWrite(blue_pin, LOW); //setColor(0, 255, 225); //블루그린 noTone(13); //소리 끔 } else if (ugm3 > 80 && ugm3 <= 150) { //만약 미세먼지 값이 80보다 크고 150이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Bad! T.T"); digitalWrite(red_pin, LOW); digitalWrite(yellow_pin, HIGH); digitalWrite(green_pin, LOW); //초록 digitalWrite(blue_pin, LOW); // setColor(255, 120, 0); //오렌지 noTone(13); //소리 끔 } else if (ugm3 > 150) { //만약 미세먼지 값이 150 보다 크면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Be Careful @.@"); digitalWrite(red_pin, HIGH); digitalWrite(yellow_pin, LOW); digitalWrite(green_pin, LOW); //초록 digitalWrite(blue_pin, LOW); // setColor(255, 0, 0); //레드 tone(13, 500); //500Hz로 소리 재생 } } } |
part 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | //part 3 ----> MIni 8*8 LED Matrix 추가한 코드 #include <Wire.h> // ** LCD I2C 통신 사용 #include <LiquidCrystal.h> #include "sound_effect.h" // **사운드 이펙트 사용(음원효과) //***********MIni 8*8 LED Matrix*************** #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" Adafruit_8x8matrix matrix = Adafruit_8x8matrix(); //***********MIni 8*8 LED Matrix*************** const int rs = 11, en = 10, d4 = 9, d5 = 4, d6 = 3, d7 = 2; //필요한 LCD 인터페이스 핀을 연결하여 라이브러리 초기화 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // 연결된 arduino 핀 번호로 int blue_pin = A0; //**블루 LED int yellow_pin = A1; //**레드 LED int green_pin = A2; //**그린 LED int red_pin = A3; //**레드 LED int pin = 8; //먼지센서 int buzzer_pin = 13; //부저 unsigned long duration; //지속 시간 unsigned long starttime; //시작 시간 unsigned long sampletime_ms = 5000; //샘플시간 5초 마다 업데이트 unsigned long lowpulseoccupancy = 0; //Low 신호가 지속된 시간을 초기화 float ratio = 0; //비율 float concentration = 0; //입자 농도 0으로 초기화 float pcsPerCF = 0; //한 입자당 CF를 0으로 초기화 float ugm3 = 0; //최종 값으로 세제곱미터 당 마이크로 그램(㎍/㎥) uint8_t clock[8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0}; // 시계 이모티콘 void setup() { matrix.begin(0x70); // ******MIni 8*8 LED Matrix**** Serial.begin(9600); //시리얼 통신 시작 pinMode(8,INPUT); //미세먼지 센서 입력 pinMode(A0,OUTPUT); //2 블루 LED 출력 pinMode(A1,OUTPUT); //2 블루 LED 출력 pinMode(A2,OUTPUT); //3 그린 LED 출력 pinMode(A3,OUTPUT); //4 레드 LED 출력 pinMode(13,OUTPUT); //부저 출력 digitalWrite(blue_pin, LOW); //애노드 RGB LED 이므로 HIGH이면 꺼진다.(이하 2개 동일) digitalWrite(green_pin, LOW); digitalWrite(red_pin, LOW); starttime = millis(); //현재 시간 대입 lcd.begin(16,2); //LCD 시작 // lcd.backlight(); //백라이트 ON lcd.clear(); //LCD 초기화 lcd.print("Hello!"); //다음 문자를 LDC에 출력 lcd.setCursor(0, 1); //두 번째 줄로 커서 이동 lcd.print("I will find DUST"); lcd.createChar(1, clock); //시계 이모티콘 출력 seSqueak(13); //초기시작 음원효과 delay(5000); // 5초 대기 if ( ugm3 == 0) { //만약 결과값이 0보다 작으면 아래를 LCD에 출력한다. lcd.clear(); lcd.print("Analysing Data"); lcd.write(1); lcd.setCursor(0, 1); lcd.print("................"); lowpulseoccupancy = 0; starttime = millis(); } } //***********MIni 8*8 LED Matrix*************** static const uint8_t PROGMEM smile_bmp[] = //웃는 표정 { B00111100, B01000010, B10100101, B10000001, B10100101, B10011001, B01000010, B00111100 }, neutral_bmp[] = //so so 표정 { B00111100, B01000010, B10100101, B10000001, B10111101, B10000001, B01000010, B00111100 }, frown_bmp[] = // 화난 표정 { B00111100, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100 }, frown2_bmp[] = // 많이 화가나서 뿔도 난 표정 { B10111101, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100 }; //***********MIni 8*8 LED Matrix*************** void loop() { duration = pulseIn(pin, HIGH); //**원래는 LOW이었슴 lowpulseoccupancy = lowpulseoccupancy+duration; if ((millis()-starttime) >= sampletime_ms) { //만약 샘플 시간이 5초라면(위에서 정한 샘플 시간) ratio = lowpulseoccupancy/(sampletime_ms*10.0); // 정수 백분율 concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // 미세먼지 센서 사양 시트 곡선 사용 pcsPerCF = concentration * 100; // 입자 농도에 100을 곱하면 입자당 CF값 ugm3 = pcsPerCF / 13000; //입자당 CF를 13000으로 나누면 미터세제곱당 마이크로그람의 미세먼지 측정값 if (ugm3 > 0.01 ) { // 만약에 결과값이 0.01보다 크면 미세먼지 값을 출력하라 lcd.clear(); lcd.print("Dust:"); lcd.print(ugm3); lcd.print("ug/m3"); lowpulseoccupancy = 0; starttime = millis(); } if (ugm3 > 0.01 && ugm3 <= 30) { //만약 미세먼지 값이 0.01 보다 크고 30이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Good! ^v^"); digitalWrite(red_pin, LOW); digitalWrite(yellow_pin, LOW); digitalWrite(green_pin, LOW); //만약에 RGB LED 애노드를 했을 경우 LOW가 켜진다. digitalWrite(blue_pin, HIGH); // 파랑색 matrix.clear(); //***********MIni 8*8 LED Matrix***** matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON); //웃는 표정 matrix.writeDisplay(); noTone(13); //소리 끔 } else if (ugm3 > 30 && ugm3 <= 80) { //만약 미세먼지 값이 30보다 크고 80이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("SoSo! ^ ^;"); digitalWrite(red_pin, LOW); digitalWrite(yellow_pin, LOW); digitalWrite(green_pin, HIGH); //초록 digitalWrite(blue_pin, LOW); matrix.clear(); //***********MIni 8*8 LED Matrix***** matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_ON); //so so 표정 matrix.writeDisplay(); noTone(13); //소리 끔 } else if (ugm3 > 80 && ugm3 <= 150) { //만약 미세먼지 값이 80보다 크고 150이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Bad! T.T"); digitalWrite(red_pin, LOW); digitalWrite(yellow_pin, HIGH); //노랑 digitalWrite(green_pin, LOW); digitalWrite(blue_pin, LOW); matrix.clear(); //***********MIni 8*8 LED Matrix***** matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON); // 화난 표정 matrix.writeDisplay(); noTone(13); //소리 끔 } else if (ugm3 > 150) { //만약 미세먼지 값이 150 보다 크면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Be Careful @.@"); digitalWrite(red_pin, HIGH); // 빨강 digitalWrite(yellow_pin, LOW); digitalWrite(green_pin, LOW); digitalWrite(blue_pin, LOW); matrix.clear(); matrix.drawBitmap(0, 0, frown2_bmp, 8, 8, LED_ON); // 많이 화가나서 뿔도 난 표정 matrix.writeDisplay(); tone(13, 300); //300Hz로 소리 재생 } } } |
part 4
블루투스를 연결해서 스마트폰으로 실시간 온도와 습도를 볼수 있게 코드를 변경한다.
블루투스 연결은 아래 코드의 주석에 있는것과 같이 온습도 센서와 블루투스 각각을 연결한다.
3D Printing
3D 프린팅 동영상
결과물
미세먼지 값이 4가지 경우가 골고루 나오기 쉽지 않기 때문에 실행 동영상이 아닌 아래 사진들로 대체한다.
미세먼지 값이 30보다 작으면 파란색 LED와 웃는 모습이 LED Matrix에도 나타난다.
30<미세먼지<80 두번째 표정이 나타나고 초록LED가 켜진다.(사진은 노랑과 비슷하나 초록LED임)
80<미세먼지<150 화난 표정이 나타나고 노란LED가 켜진다.
미세먼지가 150보다 크면 화나나서 머리에 뿔까지 난 표정이 나타나고 빨간LED와 함께 경보음도 소리난다.
우여곡절 끝에 완성이 되었다. 한달을 바쁘게 달려왔다.
바쁜 일상이었지만 꼭 배우고 싶었던 것이라 너무너무 알찬 시간들이었다. 어느 하나의 수업도 소중하지 않은 적이 없었다.
심플 버전
'Fablab Academy' 카테고리의 다른 글
Make Room (0) | 2017.12.11 |
---|---|
14강 Arduino 통신 (0) | 2017.12.11 |
13강 Arduino OUTPUT (0) | 2017.12.11 |
12강 Arduino INPUT (0) | 2017.12.11 |
11강 Arduino LED (0) | 2017.12.11 |