반응형

ESP32 에는 기본적으로 온도센서를 내장하고 있다. 이를 사용하는 방법을 알아보려고 한다. 



위 ESP32 블록 다이어그램을 보면 온도센서가 있음을 알 수 있다. 소스는 구글링을 통해서 가지고 왔다. 


■ 스케치

소스출처 : https://gist.github.com/xxlukas42/7e7e18604f61529b8398f7fcc5785251


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifdef __cplusplus
extern "C" {
#endif
uint8_t temprature_sens_read();
#ifdef __cplusplus
}
#endif
uint8_t temprature_sens_read();
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  Serial.print("Temperature: ");
  
  // Convert raw temperature in F to Celsius degrees
  Serial.print((temprature_sens_read() - 32/ 1.8);
  Serial.println(" C");
  delay(5000);
}
cs



그런데 위와 같이 작성하고 실행을 해 보니 이상하다.


위와 같이 시리얼 모니터에 똑같은 온도만 계속 표시가 된다. 그리고 너무 높다. 방 안의 온도가 현재 20도 정도인데 53도 라니...


왜 그런지 모르겠다. 칩 자체의 온도가 높은건가? 소숫점 2째자리 까지 표시가 되는데 하나도 변화가 없는 것이 제대로 측정되지 않는 것 같다. 


혹시 왜 그런지 아는 분들의 댓글 바란다.

반응형
반응형

ESP32는 와이파이를 통해서 인터넷에 연결이 가능하므로 와이파이 연결이 된다면 NTP(Network Time Protocol) 서버를 통해 매우 정확한 현재 시간을 구할 수 있다. 나중에 시간이 된다면 ESP32와 온습도 센서, LCD 등을 가지고 벽걸이 시계를 하나 만들어 볼까? 생각 중인데... 정확한 시간은 물론 정보제공 서버와의 통신을 통해서 날씨, 뉴스 등의 정보도 표시해 주고 센서를 통해서는 현재 기온 및 습도 등을 표시해 주는 유용한 장치를 만들 수 있을 것이다.




ESP32에 대한 일반적인 사항과 아두이노 개발환경을 설치하는 방법은 아래의 과거 포스팅을 참고한다.


■ 스케치

소스를 보면 연결할 와이파이 SSID 와 패스워드를 넣을 수 있게 되어 있고 gmtOffset_sec 변수에 32400 을 대입해 주었다. 이것은 NTP 서버에서 제공해 주는 시간 값이 영국 그리니치 표준시 기준이기 때문에 우리나라에 맞게 수정해 주어야 한다. 우리나라는 GMT+9 (그리니치 표준시 보다 9시간 빠름) 지역이기 때문에 9시간을 더해 주면 된다. 그러므로 9시간을 초(Sec)로 변환한 값인 32400을 변수에 대입해 주었다. daylightOffset_sec 변수는 섬머타임 여부를 나타낸다. 섬머타임 적용지역의 경우 하절기에 시간이 1시간 앞당겨진다. 우리나라는 해당사항이 없으므로 0을 대입해 주었다. NTP 서버의 경우 자신이 알고 있는 다른 서버를 이용해도 된다.


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
#include <WiFi.h>
#include "time.h"
 
const char* ssid       = "ssid"//와이파이 SSID
const char* password   = "password";  //와이파이 패스워드
 
const char* ntpServer = "kr.pool.ntp.org";
 
//3200초는 1시간, 우리나라는 GMT+9 이므로 3600초x9 = 32400 해 줌
const long  gmtOffset_sec = 32400
 
//섬머타임 적용 시 3600 (시간을 1시간 빠르게 함)
//우리나라는 시행 안하므로 0
const int   daylightOffset_sec = 0
 
void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
 
void setup()
{
  Serial.begin(115200);
  
  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");
  
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
 
  //disconnect WiFi as it's no longer needed
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}
 
void loop()
{
  delay(1000);
  printLocalTime();
}
cs



실행한 결과이다. 컴퓨터의 시간과 비교해보니 거의 정확히 일치한다. 


시간 구하기는 앞으로 ESP32를 이용한 DIY 에 활용할 일이 많을 것이다.

반응형
반응형



ESP32는 자체적으로 터치를 감지할 수 있는 센서를 가지고 있다.  총 10개의 GPIO에서 터치를 감지할 수 있다. 이번에는 손가락 터치를 감지해서 ESP32 개발보드에 내장된 LED를 켜거나 끄는 것을 해 보려고 한다. 





■ ESP32 Touch GPIO Pin


 

위의 배치도를 보면 분홍색으로 표시된 핀들이 터치를 지원하는 핀 들이다. 아래 핀번호를 보면 GPIO0 도 있는데 내가 가지고 있는 개발보드엔 이 핀이 없다. 고로 9개의 핀이 터치를 지원한다. 개발 시 자신이 가지고 있는 보드의 규격에 따라 고려하여 코딩하면 되겠다.


T0 = GPIO4

T1 = GPIO0

T2 = GPIO2

T3 = GPIO15

T4 = GPIO13

T5 = GPIO12

T6 = GPIO14

T7 = GPIO27

T8 = GPIO33

T9 = GPIO32


ESP32에 대한 일반적인 사항과 아두이노 개발환경을 설치하는 방법은 아래의 과거 포스팅을 참고한다.


■ 스케치

먼저 시리얼 모니터로 터치입력값을 받아서 시리얼 모니터에 표시해 본다. 이 예제는 ESP32 개발환경이 제대로 설치되었다면 아두이노 IDE의 파일->예제->ESP32->Touch->TouchRead 에서도 볼 수 있다.


터치감지를 위해서 암-수 점퍼 케이블을 GPIO4 (T0)에 꼽아 주었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ESP32 Touch Test
// Just test touch pin - Touch0 is T0 which is on GPIO 4.
 
void setup()
{
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println("ESP32 Touch Test");
}
 
void loop()
{
  Serial.println(touchRead(T0));  // get value using T0
  delay(1000);
}
cs



시리얼 모니터 값을 보면 터치 하지 않았을 경우 91~92의 값을 보인다. 손가락을 터치했을 경우 90 이하의 값으로 내려간다. 고로 90 이하의 값이 감지되면 LED를 켜고 아니면 꺼주면 되겠다. (케이블 단자를 손가락으로 꽉 잡을 경우 값은 더욱 낮아진다. 각자의 목적에 맞게 터치값의 기준을 조정해야 한다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int LED_BUILTIN=2;
 
void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
}
 
void loop()
{
  int tRead = 0;
  tRead = touchRead(T0);
  Serial.println(tRead); 
  if (tRead <= 90) {
    digitalWrite(LED_BUILTIN, HIGH); 
  } else {
    digitalWrite(LED_BUILTIN, LOW); 
  }
  delay(100);
}
cs

의도대로 수정한 소스이다.



손가락을 케이블에 대면 빌트인 LED가 켜지고 떼면 꺼진다. 이를 응용하면 누군가 집의 문고리를 잡을 경우 ESP32의 와이파이 연결 기능을 통해 스마트폰 등으로 알려주는 나름의 방범기능(?)도 만들 수 있을 것이다.

반응형
반응형

ESP32 에는 자기장을 감지하는 홀센서(Hall Sensor) 가 내장되어 있다. 홀센서는 미국의 물리학자인 홀이 발견한 홀효과(Hall Effect)를 이용한 센서이다. 홀효과는 도체가 자기장 속에 놓여 있을 때 그 자기장에 직각방향으로 전류를 흘려주면 자기장과 전류 모두에 수직인 방향으로 전위차가 발생하는 현상이다. 홀효과에 대한 자세한 사항은 여기를 참고한다.


ESP32 아두이노 개발환경을 설치하는 방법은 지난 번 포스팅을 참고한다.




■ 스케치

소스는 간단하다. 자기장이 감지되면 ESP32 개발보드에 내장된 LED를 켜고 나이면 끈다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int LED_BUILTIN=2;
 
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
}
 
void loop() {
    int measurement = 0;
    measurement = hallRead();
    Serial.print("Hall sensor measurement: ");
    Serial.println(measurement);
    if (measurement >= 20) {
      digitalWrite(LED_BUILTIN, HIGH); 
    } else {
      digitalWrite(LED_BUILTIN, LOW); 
    }
    delay(500);
}
cs




시리얼모니터 상에서 평상시에는 20을 넘지 않아 자기장 감지의 기준을 20으로 정했다. 감도는 정해진 것이 아니므로 감지할 자기장의 세기에 따라 감도값을 조절하면 될 것이다.




막대자석을 ESP32칩 부분에 가까이 가져가면 자기장을 감지해서 LED가 켜지고 아니면 꺼지는 것을 볼 수 있다.


이걸 어떤 곳에 이용할 수 있을까? 일반적으로 홀센서는 모터의 회전속도를 감지하는데 많이 쓰인다고 하는데 ESP32의 경우 블루투스나 인터넷 통신이 가능하므로 자기장 감지 시 스마트폰 같은 장치로 알려주는 기능도 만들 수 있을 것이다.  아무튼 이번에는 ESP32에 내장된 센서를 테스트 해 봤다는 데에 의의를 두어본다.

반응형
반응형

오늘부터 시간이 나는대로 한참 전에 구입해 놓고 사용하지 못하고 있던 ESP32 개발보드에 대해서 알아볼 생각이다. 예전에 ESP32 칩에 대해서 간단하게 알아보았던 포스팅이 있어서 ESP32 칩에 대한 개괄적인 내용은 아래 링크의 글을 참조하면 된다.




내가 구입한 ESP32 개발 모듈 보드이다. CP2102 UART 칩을 사용하고 있다. 알리에서 5달러 정도 주고 구입.


개발보드의 핀 구조는 위와 같다. PC와의 연결은 마이크로 5핀 USB 케이블을 이용한다.



처음 아무것도 없는 PC에 연결하면 아마도 인식이 되지 않을 것이다.  CP2102 드라이버가 설치가 되어 있지 않아서 그렇다. 따로 드라이버를 다운로드 받아서 설치해 주어야 PC와 통신이 된다.


위의 링크에서 자신의 OS에 맞는 드라이버를 다운로드 받아서 설치하면 된다.


그러면 위와 같이 제대로 COM 포트를 잡아서 PC와 통신할 준비가 완료된다. 혹시 CP2102 가 아닌 다른 UART 칩을 사용하는 보드라면 각 제조사 사이트에서 드라이버를 다운로드 받으면 될 것이다.


그리고 당연한 말이지만 아두이노 IDE가 설치되어 있어야 한다. 될 수 있으면 최신버전을 사용하도록 한다. 다운로드 주소는 https://www.arduino.cc/en/Main/Software


아두이노 IDE 설치만으로 바로는 사용할 수 없고 github 의 Espressif 사의 페이지에 들어가면 아두이노 IDE 에서의 개발환경을 위한 소프트웨어가 개발되어 있다. 이걸 설치하면 된다.


■ Espressif Github ESP32


https://github.com/espressif/arduino-esp32/releases



링크에 들어가면 위와 같이 나오는데 package_esp32_dev_index.json 이라는 부분의 링크를 복사해 준다. 현재 링크는 https://github.com/espressif/arduino-esp32/releases/download/1.0.0/package_esp32_dev_index.json 이다.


링크를 복사 했으면 아두이노IDE를 실행하고 파일->환경설정으로 이동한다.


환경설정 창에서 추가적인 보드 매니저 URLs 의 버튼을 클릭한다. (화살표)


URL 입력창이 뜨면 복사한 링크를 붙여넣기 하고 확인 버튼을 클릭하고 환경설정 창의 확인 버튼도 클릭한다.


아두이노IDE 메뉴, 툴->보드->보드매니저 창을 띄우면 맨 아래 부분에 위와 같이 ESP32 설치를 위한 '설치' 버튼이 있는 것을 볼 수 있다. 설치를 눌러 설치한다. 현재 버전은 1.0.0 이다.


26메가 정도의 설치파일이 다운로드 되고 설치가 진행 된다. 해외서버라 그런지 속도가 매우 느린데 참고 기다리면 설치가 된다. 


설치가 완료된 후 툴->보드 메뉴에 들어가면 여러가지 ESP32 보드들이 나타나고 이 중에 자신에게 해당되는 것을 고르면 된다. 나는 ESP32 Dev Module 이라는 것을 선택해 보았다.


위와 같이 아두이노 IDE가 ESP32 개발보드를 인식해서 연결이 된다. 툴 메뉴를 들어가보면 여러가지 개발보드의 옵션들을 선택할 수 있도록 되어 있다. 자신에게 맞는 것을 선택해 주면 된다. 그리고 아두이노 개발과 마찬가지로 툴->포트 메뉴에서 PC와 연결된 COM 포트 번호를 선택해 준다.


이제 개발할 준비가 모두 끝났다. Blink 예제를 업로드해서 스케치가 잘 업로드가 되는지 테스트를 해 본다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int LED_BUILTIN=2;
 
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}
 
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}
cs


원래 소스는 int LED_BUILTIN=2; 부분이 없어도 아두이노에서는 작동하지만 ESP32 개발보드 에서는 꼭 넣어 주어야 한다. 


위와 같이 보드에 Built in 되어 있는 LED가 깜빡이면서 Blink 예제가 잘 실행되는 것을 볼 수 있다.


앞으로 시간이 될 때마다 ESP32에 대해서 더 깊이 알아볼 생각이다.

반응형

+ Recent posts