CodingMaker

15 Final Project 본문

Fablab Academy

15 Final Project

메이커K 2017. 12. 11. 15:51


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번핀에 연결한다)


회로도



온 습도 센서와 LED mini Fritzing 파일

온 습도 센서.fzz



코드

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(00, smile_bmp, 88, LED_ON); //웃는 표정
  matrix.writeDisplay();
  delay(500);
 
  matrix.clear();
  matrix.drawBitmap(00, neutral_bmp, 88, LED_ON);  //so so 표정
  matrix.writeDisplay();
  delay(500);
 
  matrix.clear();
  matrix.drawBitmap(00, frown_bmp, 88, LED_ON); // 화난 표정
  matrix.writeDisplay();
  delay(500);
 
  matrix.clear();
  matrix.drawBitmap(00, frown2_bmp, 88, 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(162);  // 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= {0x00xe0x150x170x110xe0x0};  // 시계 이모티콘
 
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(01);  //두 번째 줄로 커서 이동
  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(01);
    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(01);
      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(01);
      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(01);
      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(01);
      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(13500);    //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= {0x00xe0x150x170x110xe0x0};  // 시계 이모티콘
 
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(01);  //두 번째 줄로 커서 이동
  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(01);
    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(01);
      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(00, smile_bmp, 88, LED_ON); //웃는 표정
      matrix.writeDisplay();      
      noTone(13);    //소리 끔
    }
    else if (ugm3 > 30 && ugm3 <= 80) {  //만약 미세먼지 값이 30보다 크고 80이랑 같거나 작으면 아래를 출력
      lcd.setCursor(01);
      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(00, neutral_bmp, 88, LED_ON);  //so so 표정
      matrix.writeDisplay(); 
      noTone(13);   //소리 끔
    }
    else if (ugm3 > 80 && ugm3 <= 150) {  //만약 미세먼지 값이 80보다 크고 150이랑 같거나 작으면 아래를 출력
      lcd.setCursor(01);
      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(00, frown_bmp, 88, LED_ON); // 화난 표정
      matrix.writeDisplay(); 
       noTone(13);    //소리 끔
    }
    else if (ugm3 > 150) {  //만약 미세먼지 값이 150 보다 크면 아래를 출력
      lcd.setCursor(01);
      lcd.print("Be Careful @.@");
      digitalWrite(red_pin, HIGH); // 빨강
      digitalWrite(yellow_pin, LOW);
      digitalWrite(green_pin, LOW);  
      digitalWrite(blue_pin, LOW); 
      matrix.clear();
      matrix.drawBitmap(00, frown2_bmp, 88, LED_ON);  // 많이 화가나서 뿔도 난 표정
      matrix.writeDisplay(); 
      tone(13300);    //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