Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

NodeMCU v1 ESP8266 보드의 A0 핀에 다중 아날로그 센서 연결

지난 글에서,

NodeMCU v1 ESP8266 보드의 A0 핀 사용법 - CdS Cell(GL3526) 조도 센서 연동
; https://www.sysnet.pe.kr/2/0/12630

NodeMCU v1 ESP8266 보드의 A0 핀 사용법 - FSR-402 아날로그 압력 센서 연동
; https://www.sysnet.pe.kr/2/0/12636

2개의 아날로그 센서를 사용해 봤는데요, 그렇다면 동시에 저 장치들을 연결하려면 어떻게 해야 할까요? 아시는 것처럼 일단 원칙상으로는 A0 핀이 하나이므로 동시에 입력을 받는 것은 불가능합니다.

단지, n 개 이상의 센서를 연결 후 그것들의 동작을 개별 on/off 하는 식으로, 즉 값을 읽는 순간에만 특정 센서가 동작하도록 선택하는 회로를 구성해 우회하는 것은 가능합니다. 이에 대한 방법을 다음의 글에서 소개하고 있는데요,

ESP8266 ADC - Multiple Analog Sensors
; https://www.instructables.com/ESP8266-with-Multiple-Analog-Sensors/

연결 방식을 보면... 아하~~~ 하실 것입니다. ^^

[그림 출처: ESP8266 ADC - Multiple Analog Sensors]
multiple_analog_sensor_1.png

[LUA 소스 코드 출처: ESP8266 ADC - Multiple Analog Sensors]
-- multisensor.lua

--configure pins
gpio.mode(0,gpio.OUTPUT) -- GPIO 16
gpio.mode(5,gpio.OUTPUT) -- GPIO 14
gpio.mode(6,gpio.OUTPUT) -- GPIO 12

--set all pins to LOW - no voltage
gpio.write(0,gpio.LOW)
gpio.write(5,gpio.LOW)
gpio.write(6,gpio.LOW)

-- print the ADC value with all pins low
print("\nADC: Both GPIOs LOW start: "..adc.read(0))
-- Send voltage to GPIO 16 completing the circuit for this sensor.
gpio.write(0,gpio.HIGH)
-- short delay before reading, 100ms
tmr.delay(100000)
-- Read the ADC pin or assign to varable var = adc.read(0)
print("\nADC: GPIO 16 HIGH LDR: "..adc.read(0))
-- Return GPIO 16 to LOW, no voltage.
gpio.write(0,gpio.LOW)
-- short delay 100ms
tmr.delay(100000)
-- repeat for the other two sensors.
gpio.write(5,gpio.HIGH)
tmr.delay(100000)
print("ADC: GPIO 14 HIGH Temp: "..adc.read(0))
gpio.write(5,gpio.LOW)
tmr.delay(100000)
gpio.write(6,gpio.HIGH)
print("ADC: GPIO 12 HIGH Slider: "..adc.read(0))
gpio.write(6,gpio.LOW)
-- again read ADC, this reading should be very close to the 'start reading'
print("\nADC: Both GPIOs LOW end: "..adc.read(0))

위의 그림과 소스 코드를 보면, GPIO 14번, 12번과 16번을 이용해 각각 온도 센서, 슬라이더 및 조도 센서를 선택하고 있습니다. 그러니까, 약간 귀찮은 정도의 작업은 있지만 다중 아날로그 장치의 값을 다루는 것이 가능하다는 것!




또 다른 방법으로, ADC 칩을 사용하는 것도 가능합니다.

보통 라즈베리 파이처럼 ADC 기능이 있는 핀을 하나도 제공하지 않는 장치에서 사용할 수 있는 방법인데요, 가령, MCP3200 칩의 경우 아날로그 센서에서의 전압 변화를 정숫값으로 SPI를 통해 제공합니다. NodeMCU 역시 SPI 연결을 제공하므로 MCP3200을 이용하면 최대 8개의 아날로그 장치를 칩 하나로 해결할 수 있습니다.

제가 MCP3208을 가지고 있지 않아 테스트를 못했지만 관련해서는 웹 검색에서 많은 자료를 찾을 수 있습니다.

라즈베리파이 2 - ADC 기능
; https://m.blog.naver.com/sogangori/220679570659

그나저나,,, 그냥 웹 탐색하다가 발견했는데 간혹 read_mcp3208_adc 함수를 다음과 같이 구현한 소스 코드가 있습니다.

// 소스 코드 출처
// http://osoyoo.com/wp-content/uploads/samplecode/raspi_photoresistor.c
int read_mcp3208_adc(unsigned char adcChannel)
{
  unsigned char buff[3];
  int adcValue = 0;

  buff[0] = 0x06 | ((adcChannel & 0x07) >> 7);
  buff[1] = ((adcChannel & 0x07) << 6);
  buff[2] = 0x00;

  digitalWrite(CS_MCP3208, 0);  // Low : CS Active

  wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);

  buff[1] = 0x0F & buff[1];
  adcValue = ( buff[1] << 8) | buff[2];

  digitalWrite(CS_MCP3208, 1);  // High : CS Inactive

  return adcValue;
}

채널의 하위 2비트를 추출하는 코드이기 때문에 저 코드는 "((adcChannel & 0x07) >> 2)"라고 해야 맞습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 5/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-05-16 08시55분
배터리를 사용하는 아두이노 프로젝트에 배터리 잔량 표시하기
; https://kwonkyo.tistory.com/383
정성태

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
14000정성태8/18/2025268오류 유형: 979. ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
13999정성태8/15/2025816닷넷: 2355. C# 14 - (8) null 조건부 연산자 개선 - 대입문에도 사용 가능파일 다운로드1
13998정성태8/14/2025851닷넷: 2354. C# 14 - (7) 확장 메서드에 정적 메서드와 속성 지원을 위한 전용 구문 추가파일 다운로드1
13997정성태8/14/20251014Linux: 120. docker 컨테이너로 매핑된 볼륨에 컨테이너 측의 사용자 ID를 유지하면서 복사하는 방법
13996정성태8/13/2025593오류 유형: 978. Unable to find the requested .Net Framework Data Provider.
13995정성태8/13/2025640개발 환경 구성: 754. Visual C++ - 리눅스 빌드를 위한 Ubuntu 18 docker 컨테이너 설정
13994정성태8/12/2025647오류 유형: 977. SQL Server - User, group, or role '...' already exists in the current database. (Microsoft SQL Server, Error: 15023)
13993정성태8/11/2025979오류 유형: 976. Microsoft.ML.OnnxRuntimeGenAI 패키지 사용 시 "cublasLt64_12.dll" which is missing. (Error 126: "The specified module could not be found.") 오류
13992정성태8/11/20251163닷넷: 2353. C# - Foundry Local을 이용한 gpt-oss-20b 모델 사용파일 다운로드1
13991정성태8/9/20251094오류 유형: 975. winget - Foundry Local 패키지 업데이트가 안 되는 문제
13990정성태8/8/2025836Windows: 283. Time zone 설정이 없는 Windows Server 2025
13989정성태8/8/20251227닷넷: 2352. C# - Windows S-mode 환경인지 체크하는 방법파일 다운로드1
13988정성태8/8/20251370오류 유형: 974. 비주얼 스튜디오 업데이트 시 잠김 파일 경고 - Visual Studio Standard Collector Service 150 (VSStandardCollectorService150)
13987정성태8/7/20251032닷넷: 2351. C# 14 - (6) event와 생성자에도 partial 메서드 적용파일 다운로드1
13986정성태8/6/20251119닷넷: 2350. C# 14 - (5) 람다 매개 변수에 접근자가 있는 경우에도 타입 생략 가능파일 다운로드1
13985정성태8/6/20251479오류 유형: 973. "wsl --install" 명령어 수행 시 "The server name or address could not be resolved"
13984정성태8/6/20251249Windows: 282. 윈도우 운영체제에 추가된 ssh 서버(Win32-OpenSSH)
13983정성태8/4/20251341오류 유형: 972. Microsoft.Data.SqlClient 6.1.0 버전부터 .NET 8 이상만 지원
13982정성태8/2/20251768개발 환경 구성: 753. CentOS 7 컨테이너 내에서 openssh 서버 호스팅
13981정성태8/1/20251413오류 유형: 971. CentOS 7에서 yum 사용 시 "Could not resolve host: mirrorlist.centos.org; Unknown error"
13980정성태7/31/20251583Linux: 119. eBPF - BPF_PROG_TYPE_CGROUP_SOCK 유형에서 정상 동작하지 않는 BPF_CORE_READ (2)
13979정성태7/30/20251888Linux: 118. eBPF - BPF_PROG_TYPE_CGROUP_SOCK 유형에서 정상 동작하지 않는 BPF_CORE_READ
13978정성태7/29/20251706오류 유형: 970. 파일 복사 시 "Data error (cyclic redundancy check). (0x80070017)" 에러
13977정성태7/28/20252023닷넷: 2349. C# 14 - (4) 문자열 리터럴을 utf-8 인코딩으로 저장파일 다운로드1
13976정성태7/25/20251869닷넷: 2348. C# - 카카오 카나나 모델 + Microsoft.ML.OnnxRuntimeGenAI 예제파일 다운로드1
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...