ESP8266 NodeMCU Analog IO NodeMCU ESP8266 AnalogRead
NodeMCU สามารถอ่านค่าแบบอะนาล็อกได้ โดย NodeMCU มีขาสำหรับอ่านค่าแบบ analog อยู่เพียง 1 ขา คือ ขา A0 สามารถอ่านค่า 0-1V ความละเอียด 10bit โดยแปลงไฟจาก 0-1V ให้เป็นค่าดิจิตอล แต่เนื่องจาก ค่าจากแรงดันของ NodeMCU คือ 0-3.3V แต่ขา A0 อ่านได้ 0-1.0V ดังนั้นค่าที่เกิน 1V ก็จะอ่านค่าได้เท่ากับ 1V จึงเป็นการอ่านค่าไม่ถูกต้อง วิธีแก้ไขคือ แปลงค่า 0-3.3V ให้เป็นสเกล 0-1.0V โดยการต่อ วงจรแบ่งแรงดันตามรูปด้านล่าง ซึ่ง R1 ค่า 220K , R2 ค่า 100K จะลดแรงดันเหลือ 1V โดยสามารถคำนวนได้ง่าย ๆ จากเว็บนี้
อ้างอิงจากใน วงจร NodeMCU มีการต่อวงจรแบ่งแรงดันกับขา A0 มาให้แล้ว เราจึงไม่ต้องต่ออะไรเพิ่ม แต่ถ้าใครใช้ ขา ADC ของ ESP8622 รุ่นอื่นก็อย่าลืม เช็คการต่อวงจรแบ่งแรงดันนี้ด้วย
ESP8266 NodeMCU AnalogRead

เราสามารถใช้คำสั่ง analogRead() เพื่ออ่านค่าแบบ analog เข้ามาจากขา A0 ดังนี้
การต่อวงจร NodeMCU 
โคดตัวอย่าง ESP8266 Analog
int adc = A0;
void setup() {
Serial.begin(9600);
pinMode(adc, INPUT);
}
void loop() {
int val = analogRead(adc);
Serial.println(val);
delay(1000);
}
เมื่ออัพโหลดโคด เปิดดูที่ Serial Monitor จะเห็นค่าที่อ่านได้จากตัวต้านทานปรับค่าได้
*** เพิ่มเติม เรายังสามารถสามารถแปลงค่า Analog ที่อ่านเข้ามาให้เป็น โวลต์ได้ด้วย ดังโคดตัวอย่างนี้
int adc = A0;
void setup() {
Serial.begin(9600);
pinMode(adc, INPUT);
}
void loop() {
Serial.println(readVolte());
Serial.println(readVolteAVG());
delay(1000);
}
double readVolte() {
//สูตรคำนวน volte = ค่าที่อ่านได้จาก A0 * Vcc สูงสุดคือ 3.3V / ค่าที่อ่านได้สูงสุดจาก A0 คือ 983;
int val = analogRead(adc);
double cal = val * 3.3 / 983;
return cal;
}
double readVolteAVG() {
//ดัดแปลงจาก readVolte ให้อ่านแบบค่าเฉลี่ย เพื่อความแม่นยำเพิ่มขึ้น
double sum = 0;
for (int i = 0; i<10; i++) {
int val = analogRead(adc);
double cal = val * 3.3 / 983;
sum += cal;
}
sum = sum / 10;
return sum;
}
NodeMCU AnalogWrite NodeMCU สามารถสั่งเอาต์พุตให้ทำงานอะนาล็อกแบบ PWM ได้ โดยขา GPIO ของ NodeMCU ใช้คำสั่ง PWM ได้ทุกขายกเว้นขา 16 หรือ D0 คำสั่งคือ analogWrite(pin,value) ค่า value อยู่ระหว่าง 0-1023
การต่อวงจร NodeMCU AnalogWrite

โคด NodeMCU AnalogWrite
int led = D1;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
analogWrite(led,20);
delay(1000);
analogWrite(led,300);
delay(1000);
analogWrite(led,1023);
delay(1000);
}
เมื่ออัพโหลดโคดจะเห็นไฟแสดงความสว่าง 3 ระดับ
คลิปวีดีโอสอน Arduino ESP8266 NodeMCU Analog GPIO : การควบคุม Input/Output แบบ Analog