ผู้เขียน หัวข้อ: งานครั้งที่ 6 เขียนโปรแกรมจากพอร์ตแอนะล็อกและการใช้ไลบรารี่ SimpleTimer  (อ่าน 7899 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
เขียนโปรแกรมจากพอร์ตแอนะล็อกและการใช้ไลบรารี่ SimpleTimer
พอร์ตแอนะล็อก บอร์ดที่เป็น ESP8266 จะมีเพียง 1 ช่องเท่านั้นคือ A0 โดยที่บอร์ด ESP8266 ขานี้เชื่อมต่อตรงเข้ายังชิพซึ่งสามารถรับสัญญาณได้ระหว่าง 0-1V แต่สำหรับ NodeMCU, WeMos D1 จะผ่านวงจรแบ่งแรงดันด้วยรีซิสเตอร์ค่า 100k กับ 220k ทำให้สามารถรับแรงดันได้ระหว่าง 0-3.2V

ไลบรารี่ SimpleTimer เป็นไลบรารี่ที่ออกแบบมาเพื่อช่วยงานในโปรแกรมที่มีค่าเวลาที่ต้องการทำงานในฟังก์ชั่นย่อยตามต้องการ เช่นต้องการให้ทำงานในฟังก์ชั่นย่อยทุก ๆ 5 วินาที การใช้งานไลบรารี่นี้ผู้ใช้งานไม่ต้องคำนวณคาบเวลาวนในโปรแกรมหลักทำให้ใช้งานสะดวกมากขึ้น

ฟังก์ชั่นอยู่ในกลุ่ม Serial http://arduino.cc/en/Reference/Serial
-Serial.begin() http://arduino.cc/en/Serial/Begin
-if (Serial) http://arduino.cc/en/Serial/IfSerial
-Serial.available() http://arduino.cc/en/Serial/Available
-Serial.read() http://arduino.cc/en/Serial/Read
-Serial.print() http://arduino.cc/en/Serial/Print
-Serial.println() http://arduino.cc/en/Serial/Println
-Serial.flush() http://arduino.cc/en/Serial/Flush

ฟังก์ชั่นทั่วไป
-analogRead(A0)
-pinMode() http://arduino.cc/en/Reference/PinMode
-digitalWrite() http://arduino.cc/en/Reference/DigitalWrite
-delay() http://arduino.cc/en/reference/delay

Analog input
ESP8266 has a single ADC channel available to users. It may be used either to read voltage at ADC pin, or to read module supply voltage (VCC).
To read external voltage applied to ADC pin, use analogRead(A0). Input voltage range is 0 — 1.0V.
reference http://esp8266.github.io/Arduino/versions/2.0.0/doc/reference.html

ค่าแอนาลอกที่อ่านได้


พิเศษสำหรับ NodeMCU จะมีวงจรแบ่งแรงดันมาให้แล้วซึ่งทำให้สามารถอ่านค่าอนาลอกที่มีย่านของค่าแรงดันระหว่างกราวด์กับไฟเลี้ยงได้ ( 0-3.2V เนื่องจากค่าตัวต้านทานที่ใช้เป็น 100k กับ 220k)


การใช้ไลบรารี่ SimpleTimer
1. ดาวน์โหลดไลบรารี่โดยเข้าไปที่เวปไซต์ https://github.com/jfturcot/SimpleTimer คลิกดาวน์โหลด


2. ทำการติดตั้งไลบรารี่ที่ดาวน์โหลดมา ดำเนินการดังรูป


3. การใช้งานไลบรารี่ ตัวอย่างต้องการให้ทำงานฟังก์ชั่น ReadADC ทุก ๆ 2 วินาที
   (1) ประกาศใช้งานไลบรารี่โดยใช้ชื่อออปเจคเป็น timer
   (2) ตั้งค่าคาบเวลาและฟังก์ชั่นย่อยที่ต้องการทำงานเมื่อครบเวลาที่กำหนด (ตั้งค่าใน setup)
   (3) ฟังก์ชั่นย่อยที่ต้องการให้ทำงาน (ชื่อเดียวกับที่ตั้งค่าไว้)
   (4) ฟังก์ชั่นเริ่มทำงานซึ่งต้องวางไว้ใน loop()


โจทย์โปรแกรม
-เขียนโปรแกรมอ่านค่าอนาลอกโดยนำค่าที่อ่านได้มาควบคุม LED และแสดงข้อความผ่านทาง UART
-โปรแกรมรายละเอียดพิเศษรายกลุ่ม (แจ้งให้ทราบเมื่อถึงชั่วโมงเรียน)

วงจรที่ใช้ทดลอง
กรณีใช้บอร์ดรุ่น NodeMCU

กรณีใช้บอร์ดรุ่น WeMos D1 mini



ตัวอย่างโปรแกรม
โค๊ด: [Select]
int x = 0;
void setup()
{
  Serial.begin(9600);
  delay(500);
}
void loop()
{
  x=analogRead(A0);
  Serial.print("Analog value is : ");
  Serial.println(x);
  delay(1000);
}

ตัวอย่างโปรแกรม (ที่ใช้งานไลบรารี่ SimpleTimer)
โค๊ด: [Select]
#include <SimpleTimer.h>
#define LED1 D1
#define LED2 D2
#define LED3 D3
#define LED4 D4
void send2port(char data);
char pattern[]={0b0000,
                0b0001,
                0b0011,
                0b0111,
                0b1111,
                0b1110,
                0b1100,
                0b1000};
SimpleTimer timer;               
void setup(){
  Serial.begin(115200);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
  timer.setInterval(2000, ReadADC);
}
void ReadADC(){
  int adc=analogRead(A0);
  Serial.println(adc);
}
void loop(){
  timer.run();
  for(int i=0;i<=7;i++){
      send2port(pattern[i]);
      delay(250);
  }
}
void send2port(char data)
{
  digitalWrite(LED1,(data & 1 )? HIGH:LOW);
  digitalWrite(LED2,(data & 2 )? HIGH:LOW);
  digitalWrite(LED3,(data & 4 )? HIGH:LOW);
  digitalWrite(LED4,(data & 8 )? HIGH:LOW);
}
« แก้ไขครั้งสุดท้าย: พฤษภาคม 06, 2018, 03:24:12 PM โดย admin »