CodingMaker

스마트무드등 만들기 본문

Arduino

스마트무드등 만들기

메이커K 2018. 7. 28. 11:21

아두이노 설치하기

교육용으로 만들었기 때문에 쉽다.

개발툴 치고는 편의성이 없어서 개발자가 좀 불편할 수도 있다.

기본적인 코드 설명

//는 주석이다. 컴퓨터 프로그래밍을 할때 컴퓨터에 넣을때 기계가 알아들을수 있게 바꾸는 컴파일을 해야한다.

그래야 기계어를 바꿀수 있다. 

주석처리는 제외한다.

프로그램에서 필요한 설명을 하거나 코멘트를 남겨주고 싶을때 쓰는거다.

다른 사람과 협업을 할때 사용하면 유용하다. 코딩한 내용을 내가 나중에 보기에도 편하게 하기위해서 규모가 클 경우는 주석을 처리하면 좋다.

주석후에는 날짜도 적어주면 좋다. 그리고 자신의 메일주소를 적어주고 전화번호를 넣어주면 좋다

Ctrl+D는 선택후 삭제할때 사용한다.

CPU가 가장 먼저 읽어야하는걸 찾는다. 통째로 잡아서 CPU에 넣어서 setup을 가장먼저 찾는다.

프로그램의 환경설정을 하는 부분을 setup에 코딩한다.

setup은 처음에 Power가 들어갔을때 한번만 읽는다. 그런다음 Loop를 돈다. Loop는 구동이라고 할 수 있다. 실제로 제품이 돌아간다.


Ctrl+S : 저장한다. C/Arduino/project/fristpjt/fristpjt.ino 실행할때 항상 폴더를 만든다.


재료 준비하기



아두이노 보드에 핀 꽂는 부분을 GPIO핀이라고 한다. GPIO핀 i(입력)o(출력)


USB (유니버셜 시리얼 버스)


GND : 전류가 빠지는 길 아두이노에는 GND가 3개있다.

A0~A5 : 아날로그 핀 (0~255, 0~1023 까지의 다양한 값이 있다. 센서의 값을 읽어온다) IN 

D1~D13 : 디지털 핀 (0이냐 1이냐 ON/OFF 같은거 ) IN과 OUT을 같이 쓸수 있다. (~모양이 있는 핀은 아날로그 OUT 역할도 한다. 총 3가지 역할을 할수 있다.)


PWM

https://www.quora.com/Whats-the-need-of-PWM


디지털을 변조해서 아날로그처럼 트릭을 주는 방식을 PWM 방식이라고 한다.

예를 들어 5V LED를 2.5V만 전원을 주고 끄는 방식을 반복하면 2.5V의 LED가 켜지게 할 수 있다.


아두이노에는 D타입을 컴퓨터에는 A타입을 꽂는다.

Window10은 기본적으로 설치되어있다.

윈도우키+E

COM11 은 포트 번호이다. 이러면 11번 포트에 아두이노가 잘 연결되어있다. 없으면 아두이노 드라이버를 설치해야한다.


아두이노가 설치되어 있어도 11번 포트가 선택되게 위 사진처럼 한번더 툴에 들어가서 클릭을 한다. 


Serial.begin();

시리얼 통신을 시작하겠다는 뜻이다. 컴퓨터와 아두이노가 통신하도록 바이트 단위로 1초당 115200바이트를 주로 사용한다.

Serial.begin(9600); 또는 Serial.begin(115200);


Serial.print("Hello Arduino~~");

PC로 전송된다. 

9600으로 코딩했으면 9600으로 맞춰준다.


컴파일(체크버튼) : 컴파일 완료라고 아래에 뜬다.



마침표는 ;(세미콜론)


Serial.println("Hello Arduino~~"); 

줄바꿈을 하려면 ln을 추가한다. 


delay(1000);

1초에 한번씩 글자를 시리얼 모니터에 보여준다. (1초 = 1000)


코드에서 대소문자를 엄격하게 구분한다.



LED 알아보기

LED :  극성이 있다. 긴쪽 +(7번핀), 짧은 쪽 -(GND)

브레드보드 : 여러핀을 사용할때

void setup() {

  pinMode(7, OUTPUT);


}


void loop() {

  digitalWrite(7, HIGH);


LED가 깜빡이게 한다. 

void setup() {

  pinMode(7, OUTPUT);

}


void loop() {

  digitalWrite(7, HIGH);

  delay(500);

  digitalWrite(7, LOW);

  delay(500);

}


문자가 합성될때는 앞은 소문자로 쓰고 뒤에 오는 단어는 첫 글자가 대문자가 되게 표기하는 낙타표기법을 사용한다.

내가 사용할때 낙타표기법을 사용하면 좋다.


고층건물 6시되면 꼭대기에 불 깜빡이게 하는 코드도 이런 원리다(비행기 지나갈때 고도를 알려주는 것)


V=IR


아날로그로 불켜기 (점점 밝아졌다가 점점 어두어지게 LED)

for 문 사용

자동 들여쓰기는 Ctrl+T

void setup() {

  pinMode(9, OUTPUT);

}


void loop() {

  for (int i = 0; i < 256; i++) {

    analogWrite(9, i);

    delay(10);

  }

  for (int i = 255; i >= 0; i--) {

    analogWrite(9, i);

    delay(10);

  }

}


실행동영상


NodeMCU을 사용하기 위해서 아래와 같이 아두이노의 환경설정에서 주소를 입력해준다. 


복사 붙여넣기

http://arduino.esp8266.com/stable/package_esp8266com_index.json



복사 붙여넣기

http://arduino.esp8266.com/stable/package_esp8266com_index.json


설치한다.



NodeMCU 1.0 (ESP-12E Module)


아날로그로 사용할수 있는 pin map을 찾아야한다. D1~D4 D5~D8 아날로그 지원이 된다.




IOT(Internet of things) 사물인터넷

사물에 인터넷을 묶기만 하면 빅데이터가 되고 새로운 것을 만들수 있다.

아이디어만 좋으면 쉽게 구현할수 있다.

프로토콜(통신규약)

LORA

NBIOT

Cat...



컴퓨터에 연결한 후 장치 관리자에서 포트가 잘 뜨는지 확인한다.


만약 뜨지 않는다면 

NodeMCU 1.0 드라이버를 구글에서 검색한 후 설치한다. (64비트, 32비트) 중 해당하는 것으로 설치한다.


툴에서 COM4를 선택한다.(컴퓨터마다 해당 번호는 다를 수 있다)



void setup() {

  pinMode(D4, OUTPUT); //D4라고 써야한다.

}


void loop() {

  for (int i = 0; i < 1023; i++) { // 아두이노는 256이지만 MCU는 1023까지 지원한다)

    analogWrite(D4, i);

    delay(1);

  }                                                                                                       

  for (int i = 1023; i >= 0; i--) {

    analogWrite(D4, i);

    delay(1);

  }

}


수분센서(soilSensor)를 연결한다.(A0)


void setup() {

  pinMode(A0, INPUT);

  Serial.begin(9600);

}


void loop() {

  int data = analogRead(A0);

  Serial.print("Soil Sensor Data : ");

  Serial.println(data);

}


시리얼 모니터로 확인한다. 



물에 담그면 수치가 내려가고 담그지 않으면 1024의 값을 시리얼 모니터에 출력해준다.


int num = 10;  

=는 할당연산자라고 한다.


int num = 10; // 정수

char ch = 'a';

String str = "Hello";

boolean flog = flase;

float f=0.314

double d=0.12

long double 긴 소수점 사용할때


int soilPin = A0;  //A0핀이 나중에 다른 아날로그 핀으로 바뀌면 이 부분만 수정을 해주면 된다.

void setup() {

  pinMode(soilPin, INPUT);

  Serial.begin(9600);

}


void loop() {

  int data = analogRead(soilPin);

  Serial.print("Soil Sensor Data : ");

  Serial.println(data);

}


ledWifi.ino

#include <ESP8266WiFi.h>


const char* ssid = "hohasic";

const char* password = "1234567890123";


int rLed = D2;

WiFiServer server(80);


void setup() {

  Serial.begin(9600);

  delay(100);

  

  pinMode(rLed, OUTPUT);

  digitalWrite(rLed, LOW);


  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);


  WiFi.begin(ssid, password);


  while(WiFi.status() != WL_CONNECTED){ // 연결되지 않았으면 .....

    delay(500);

    Serial.print(".");

  }

  Serial.println();

  Serial.println("Wifi connected!!"); // 와이파이가 붙으면 


  server.begin();

  Serial.println("Server started");


  Serial.print("Use this URL to connect: ");

  Serial.print("http://");

  Serial.print(WiFi.localIP()); // 192.168.24.15

  Serial.println("/");

  Serial.println("");

}

//서버준비는 끝

void loop() {


  WiFiClient client = server.available();

  if(!client){

    return;

  }


  Serial.println("new client"); //새로운 손님이 왔습니다.

  while(!client.available()){

    delay(1);

  }


  String request = client.readStringUntil('/r');

  Serial.println(request);

  client.flush();


  int value = LOW;

  if(request.indexOf("/ledOn") != -1) { // 요청한다. LED on

    digitalWrite(rLed, HIGH);

    value = HIGH;

  }


  if(request.indexOf("/ledOff") != -1) { // LED 꺼라 요청

    digitalWrite(rLed, LOW);

    value = LOW;

  }


  client.println("HTTP/1.1 200 OK");

  client.println("Content-Type: text/html");

  client.println("");

  client.println("<!DOCTYPE HTML>");

  client.println("<html>");

  client.println("<head>");

  client.println("</head>");

  client.println("<body>");

  client.println("<div style='width:100%; height:300px; line-height:300px; margin: 0 auto; font-size:4em; font-weight:bolder; text-align:center;'>");

  client.println("LED is turned "); // 껐어요 켰어요가 필요한 코드들이다.


  if(value) {

    client.print("On");

  } else {

    client.print("Off");

  }

  client.println("</div>");

  

  client.println("<br><br>");

  client.println("<hr>");

  client.println("<br><br>");

  client.println("<div style='width:100%; margin: 0 auto; text-align:center;'>");

  client.println("<a href='/ledOn'><button style='font-size:4em; padding:50px;'>Turn On</button></a>");

  client.println("&nbsp;&nbsp;");

  client.println("<a href='/ledOff'><button style='font-size:4em; padding:50px;'>Turn Off</button></a>");

  client.println("</div>");

  client.println("</body>");

  client.println("</html>");


  delay(1);

  Serial.println("Client disconnected!!");

  Serial.println();


  Serial.print("-------------> ");

  Serial.println(digitalRead(rLed));


}


IOT 제품을 만든다는 것은 와이파이나 블루투스를 사용하여 기계와 서버를 연결한다. 리퀘스트 리스펀스? 순환구조

개발자 입장에서는 무선통신을 위해서는 서버도 만들어야한다.

실제로 서버를 만들어보고 서버는 안만들고 클라우드 서버를 이용만 하는 방법중 하나를 사용한다.


서버를 구현하기 위한 소스


인클루드에 있는 와이파이를 통해 무선 통신을 사용할 수 있는 소스는 똑같다. 그래서 모듈을 사용할 수 있기 때문에 가져다 쓸 수 있도록 해더파일을 가져다 쓸수 있게 인클루드에서 만들어준다.

케릭터 변수에 문자를 넣어서 원하는 이름과 비밀번호를 설정한다. 소스코드에서 바꾸면 좋다.


int rLed = D2;

디지털 2번 핀을 사용하겠다.


WiFiServer server(80);

8번 포트가 기본이다. 8번 포트에 서버를 만든다.


클라이언트가 들어오면 서버가 받는다. 서버가 받으면 기계로 신호를 보내고 받는다.


모바일이나 웹브라우져에 아래와 같이 입력한 후 테스트가 가능하다. 자신의 컴퓨터에 맞는 주소를 적어야한다.

http://192.168.0.164


모바일에서 제어


웹에서 제어



클라우드를 사용하는 방법 : 소스가 굉장히 줄어든다.


#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h>


const char* AUTH = "c760833b6fbb4c30a7fd4e69452954a1";   // AUTH TOKEN

const char* SSID = "makerspace1";

const char* PASS = "1234567890";


void setup()

{

  Serial.begin(115200);

  Blynk.begin(AUTH, SSID, PASS);   // SSID & PASSWORD

}


void loop()

{

  Blynk.run();

}



스마트 폰에서 앱 스토어에서 blynk 검색한다.



Auth Token 코드값이 필요하다 이 코드값을 복사한후 아두이노에 코드에 AUTH값을 바꿔준다.

메일주소를 첨에 정확히 입력해야한다.


c760833b6fbb4c30a7fd4e69452954a1




라이브러리를 넣어야한다.

https://github.com/blynkkk




다운 받은 후 라이브러리 추가를 선택한 후 zip 라이브러리를 선택한다.



#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h> // 라이브러리를 추가해야 이 구분을 쓸수 있다.


const char* AUTH = "c760833b6fbb4c30a7fd4e69452954a1";   // AUTH TOKEN 메일로 온것을 적어준다.

const char* SSID = "makerspace1";

const char* PASS = "1234567890";


void setup()

{

  Serial.begin(115200);

  Blynk.begin(AUTH, SSID, PASS);   // SSID & PASSWORD

}


void loop()

{

  

  Blynk.run();

}


업로드한다.




RGB 연결한다.


R

 D5

 G

 D6

 B

 D7

 GND 

 GND


앱에서 zeRGBa  선택 추가한 후 Settings값에서 PIN을 아래와 같이 설정한다.

D5

 GP14

 D6

 GP12

 D7

 GP13




안드로이드는 256으로 되어있고 아이폰은 1023으로 되어있다. 1023으로 바꿔야한다. 


아래와 같이 이번에는 슬라이더를 추가해 본다.


3개의 슬라이더를 추가해서 각각의 색의 밝기를 제어해본다.

프로젝트당 토큰이 하나씩 날아온다. 메일을 계속 확인해야한다. 한번 하나의 프로젝트를 만들려면 하나의 토큰을 다시 받아야한다.


AWS 아마존꺼 

MS 클라우드(유로로는 최고) 안드로이드 어플로는 최고다. 등록하면 원스톱으로 만들어준다. 단점은 조금 비싸다.


우리나라꺼

SK

Daliworks

Blynk (무료로는 최고) 유료 서비스를 하면 훨씬 좋은 서비스를 많이 준다.


무드등 만들기위한 RGB LED를 연결한 후에 아래와 같이 아두이노에서 코딩한다.


int rLed = D5;

int gLed = D6;

int bLed = D7;


void setup() {

  pinMode(rLed, OUTPUT);

  pinMode(gLed, OUTPUT);

  pinMode(bLed, OUTPUT);


  analogWrite(rLed, 0);

  analogWrite(gLed, 0);

  analogWrite(bLed, 0);

}


void loop() {

for(int i=0; i<1023; i++){

  analogWrite(rLed, i);

  analogWrite(gLed, 0);

  analogWrite(bLed, i);

  delay(2);

}

for(int i=1023; i>-1; i--){

  analogWrite(rLed, i);

  analogWrite(gLed, 0);

  analogWrite(bLed, i);

  delay(2);

}


실행동영상


12V 정도 쓰면 고휘도 LED를 더 잘 사용할 수 있다.


https://www.pinterest.co.kr/ 같은 사이트에서 mood lighting 검색해서 다양한 아이디어를 참고해도 좋다.


2mm 얇은 소재로 달을 3D 프린터해서 사용할 수 있다. 한지 공예를 해서도 좋은 조명을 만들 수 있다.



nodemcu D1  으로 사용해도 좋다 (사이즈가 작아서 좋다) 네오픽셀 사용해도 좋다