Bosszi

รับออกแบบวงจร รับทำวงจรสำหรับ ARDUINO ตามความต้องการ

นายเมธิส สมพิทักษ์

เครื่องบันทึกเวลาการทำงานของเครื่องจักร

MachineTimer-Mainpage

ภาพหน้า Mainpage ของเว็บไซต์เพื่อตรวจเช็คเวลาการทำงานของเครื่องจักรทั้งหมด

เป็นตัวบันทึกการเปิดปิดเวลาการทำงานของเครื่องจักร เรียกข้อมูลการทำงานมาดูได้ ติดต่อผ่านสัญญาณ WiFi เชื่อมต่อกับ Web Server เพื่อดูข้อมูลได้ตลอดเวลา การเรียกดูข้อมูลสามารถใช้ได้ทั้งคอมพิวเตอร์และสมาร์ทโฟนผ่าน Web browser ตัวเว็บไซต์จะแสดงข้อมูลแบบกราฟ ตารางของแต่ละเครื่องและสถานะการทำงานปัจจุบัน สามารถเรียกดูข้อมูลเก่าๆได้ไม่เกิน 28 วัน

MachineTimer-Date

ภาพการเลื่อกวันเวลาก่อนๆในการแสดงผล

MachineTimer-Mac

ภาพเลือกแสดงกราฟการทำงานของเครื่องจักร

MachineTimer-1Mac

ภาพแสดงเวลาการทำงานแบบเครื่องต่อเครื่อง

 

ระบบ Login เพื่อเข้าดูข้อมูล สามารถล้างเวลาการทำงานของเครื่องจักรและเพิ่ม/ลบ Username อื่นๆ

MachineTimer-Login

ภาพหน้าเว็บ Login ก่อนเข้าตรวจสอบการทำงานเครื่องจักร

MachineTimer-Admin

หน้าเว็บสำหรับ Admin

 

บอร์ดทดสอบ Input/Output 8 Channel

บอร์ด Test-8-I/O-V2 สำหรับทดสอบ Input และ Output ทั้งแบบ Sink และแบบ Source

Test-IO-V2

 ภาพบอร์ด Test-8-I/O-V2

 

การเชื่อมต่อ

Test-IO-V2-Wire

ภาพการเชื่อมต่อบอร์ด Test-8-I/O-V2

ด้าน Output เชื่อมต่อ Connector ตามตัวหนังสือบนบอร์ด เลือก Common แบบ Sink หรือ Source โดยใช้สวิตซ์โยกข้างๆ Connector และเลือกแรงดันที่ต้องการทดสอบด้วยสวิตซ์โยกข้างขวาสุด เมื่อมีสัญญาณเข้ามาที่ขาทดสอบ Output ช่องใดช่องหนึ่งไฟ LED ที่ช่องนั้นๆจะติด

 

ด้าน Input เชื่อมต่อตามตัวหนังสือบนบอร์ดและใช้สวิตซ์กดติดปล่อยดับหรือสวิตซ์โยกที่ช่องนั้นๆเพื่อทดสอบ

serial interface isolated 5V 3.3V การสื่อสาร Serial แบบแยก Ground

serial interface isolated 5V 3.3V การสื่อสาร Serial แบบแยก Ground

Serial-Opto

บอร์ดการสื่อสาร Serial แบบแยก Ground

การสื่อสาร Serial นิยมใช้ในการสื่อสารระหว่างไมโครคอนโทรลเลอร์ 2 บอร์ดโดยเฉพาะการสื่อสารระหว่างบอร์ด Arduino กับ บอร์ดตระกูล ESP ต่างๆ เพื่อใช้ในงาน IOT โดยทั่วไปมักจะต่อสาย RX TX เข้าตรงๆ โดยไม่คำนึงถึงว่าไมโครคอนโทรลเลอร์ของ Arduino ใช้ไฟ 5V แต่ ESP ใช้เพียง 3.3V  การนำไปใช้จึงมีความเสี่ยงที่บอร์ด ESP จะเสียหายเนื่องจาก Logic ของ Arduino มีแรงดันที่มากกว่า

เพื่อที่จะใช้งานอุปกรณ์ให้เหมาะสมจึงต้องแยกด้าน 5V กับ 3.3V ออกจากกัน นอกจากนี้การใช้ Opto แยก Ground ยังเป็นการตัดสัญญาณรบกวนของทั้งสองด้านเพื่อป้องกันข้อมูลผิดพลาด

 

Serial-Opto-PinOut

ขาการเชื่อมต่อต่างๆของบอร์ดหรือต่อเข้ากับ ESP-01 ได้โดยตรง

ฝั่ง 5V                                                ฝั่ง 3.3V

5V -> 5V                                           3.3V -> 3.3V

GND -> GND_5V                           GND -> GND_3.3V

RX -> RX                                          RX -> RX

TX -> TX                                           TX -> TX

 

ตัวอย่างการใช้งานบอร์ดสื่อสาร Serial แบบแยก Ground

Arduino-Serial-ESP

การต่อสายทดสอบการทำงาน

Arduino uno

7 -> RX

6 -> TX

5V -> 5V

GND -> GND

Code สำหรับ Arduino uno

#include <SoftwareSerial.h>
SoftwareSerial ESP8266(7,6);
int Rece = 0;
void setup() {
  Serial.begin(9600);
  ESP8266.begin(9600);

}

void loop() {
  if(Serial.available() > 0){
    int Send = Serial.parseInt();
    Serial.print("Send: "); Serial.println(Send);
    ESP8266.write(Send);
  }
  if(ESP8266.available() > 0){
    Rece = ESP8266.read();
    Serial.print("Receiver: "); Serial.println(Rece);
  }

}

 

ESP8266

D1 -> RX

D2-> TX

3.3V -> 3.3V

GND -> GND

Code สำหรับ ESP8266

#include <SoftwareSerial.h>
SoftwareSerial Arduino;

void setup() {
  Serial.begin(115200);
  Arduino.begin(9600, SWSERIAL_8N1, 5, 4, false, 95, 11);

}

void loop() {
  while(Serial.available() > 0){
    int Send = 0;
    Send = Serial.parseInt();
    Serial.print("Send: "); Serial.println(Send);
    Arduino.write(Send);
  }
  while(Arduino.available() > 0){
    int Rece = Arduino.read();
    Serial.print("Receiver: "); Serial.println(Rece);
  }
}

 

Serial_Moni

 

หลังจากอัพโหลด Code เข้าบอร์ดทั้ง 2 แล้วเปิด Serial monitor ของทั้งสองขึ้นมา

และพิมพ์ตัวเลขเข้าไปใน Serial monitor บอร์ดใดบอร์ดหนึ่ง

Serial monitor ของบอร์ดที่พิมพ์จะขึ้น Send: ตามด้วยเลขที่พิมพ์เข้ามา

และ Serial monitor ของอีกบอร์ดหนึ่งจะแสดง Receiver: ตามด้วยเลขที่พิมพ์มาจากอีก monitor หนึ่ง

รับซ่อมตู้น้ำหยอดเหรียญ

 

  • รับซ่อมตู้น้ำดื่มหยอดเหรียญ
  • อะไหล่ตู้น้ำดื่มหยอดเหรียญ
  • เครื่องไม่รับเหรียญ
  • เปลี่ยนไส้กรอง
  • น้ำจ่ายเองหรือไม่จ่าย

RC-water-coin

รายละเอียดการติดต่อ

0965024580 (ศรพงษ์)

จำหน่ายและติดตั้งตู้น้ำหยอดเหรียญ RO

รายละเอียดสินค้า

  1. ถังเก็บน้ำ 200 ลิตร ราคา 24,000 บาท / แบบถังเก็บน้ำ 100 ลิตร ราคา 18,000 บาท
  2. ระบบการกรองแบบ RO
  3. ไฟแสดงสถานะพร้อมทำงานหรือไม่พร้อมทำงาน
  4. ตัดระบบการทำงานเมื่อเครื่องไม่พร้อมทำงาน
  5. ระบบตรวจสอบการทำงานของอุปกรณ์สำหรับตรวจสอบเครื่องเบื้องต้น
  6.  1 ช่องหยอดเหรียญ
  7. ปุ่มจ่ายน้ำและหยุดจ่ายน้ำ
  8. ตั้งเวลาเปิด-ปิดป้ายไฟ
  9. ตั้งราคาขายน้ำได้ตามต้องการ

RC-water-coin

รายละเอียดการติดต่อ

0965024580 (ศรพงษ์)

การใช้งานบอร์ดตู้น้ำหยอดเหรียญ BWT-2021-V1

การต่อบอร์ตู้น้ำหยอดเหรียญ BWT-2021-V1

BWT-2021-V1_Manual-2

 

BWT-2021-V1_Manual1-out-motor-2

 

BWT-2021-V1_Manual1-pump-Air-2

การตั้งค่าต่างๆ

BWT-2021-V1_Manual2

คุณสมบัติ

  1. ติดตั้งบอร์ด ตั้งค่าต่างๆของบอร์ดและปรับเปลี่ยนปริมาณน้ำต่อบาทได้ง่าย
  2. ตั้งเวลาเปิด-ปิดหลอดไฟป้ายอัตโนมัติ
  3. มีระบบตรวจสอบการทำงานของอุปกรณ์อินพุตและเอาต์พุต
  4. ไฟดับไม่ลบค่าเหรียญที่เหลืออยู่
  5. ไฟสถานะการทำงานเครื่องว่าพร้อมทำงานหรือไม่

 

รายละเอียดสำหรับการติดต่อ

0965024580 (ศรพงษ์)

PLC-ARDUINO-TEST-8-IO-V1

PLC-ARDUINO-TEST-8-IO-V1

PLC-ARDUINO-TEST-8-IO-V1

 

เป็นโมดูลสำหรับทดสอบอินพุทเอ้าพุทสำหรับ พีแอลซี และ อาดูโน มีจำนวน 8 อินพุท 8 เอ้าพุท รองรับไฟ 5V และ 24V

คุณสมบัติ

  • มีจำนวน 8 INPUT รองรับไฟ 5V และ 24V
  • INPUT แบบผสม ใช้ได้ทั้งสวิตช์กดติดปล่อยดับ และสวิตช์โยกแบบค้างสถานะใน INPUT ช่องเดียวกัน
  • มีจำนวน 8 OUTPUT รองรับไฟ 5V และ 24V มี LED สีแดงแสดงผล
  • ขนาดบอร์ด 10×15 เซ็นติเมตร

ตัวอย่างการต่อใช้งานสำหรับ ARDUINO

ARDUINO-UNO-R3-IO-TEST-CURCUIT
ARDUINO-UNO-R3-IO-TEST-CURCUIT

ตัวอย่างโค๊ดไฟ OUTPUT กระพริบทุกหลอดพร้อมกัน 1 วินาที

#define OUT1 2 // สร้างตัวแปร OUT1 มีค่าเป็น 2
#define OUT2 3 // สร้างตัวแปร OUT2 มีค่าเป็น 3
#define OUT3 4 // สร้างตัวแปร OUT3 มีค่าเป็น 4
#define OUT4 5 // สร้างตัวแปร OUT4 มีค่าเป็น 5
#define OUT5 6 // สร้างตัวแปร OUT5 มีค่าเป็น 6
#define OUT6 7 // สร้างตัวแปร OUT6 มีค่าเป็น 7
#define OUT7 8 // สร้างตัวแปร OUT7 มีค่าเป็น 8
#define OUT8 9 // สร้างตัวแปร OUT8 มีค่าเป็น 9

void setup() {
  // ตั้งค่า OUTPUT
  pinMode(OUT1,OUTPUT);
  pinMode(OUT2,OUTPUT);
  pinMode(OUT3,OUTPUT);
  pinMode(OUT4,OUTPUT);
  pinMode(OUT5,OUTPUT);
  pinMode(OUT6,OUTPUT);
  pinMode(OUT7,OUTPUT);
  pinMode(OUT8,OUTPUT);

}

void loop() {
  // สั่ง OUTPUT เป็น HIGH
  // เลข 1 หลัง , มีค่าเป็น HIGH
  digitalWrite(OUT1,1);
  digitalWrite(OUT2,1);
  digitalWrite(OUT3,1);
  digitalWrite(OUT4,1);
  digitalWrite(OUT5,1);
  digitalWrite(OUT6,1);
  digitalWrite(OUT7,1);
  digitalWrite(OUT8,1);
  delay(1000); // หน่วงเวลา 1 วินาที
  // สั่ง OUTPUT เป็น LOW
  // เลข 0 หลัง , มีค่าเป็น LOW
  digitalWrite(OUT1,0);
  digitalWrite(OUT2,0);
  digitalWrite(OUT3,0);
  digitalWrite(OUT4,0);
  digitalWrite(OUT5,0);
  digitalWrite(OUT6,0);
  digitalWrite(OUT7,0);
  digitalWrite(OUT8,0);
  delay(1000); // หน่วงเวลา 1 วินาที
}

Download ไฟล์ตัวอย่างไฟกระพริบ

ตัวอย่างโค๊ดไฟ OUTPUT  วิ่งซ้ายไปขวา ขวาไปซ้าย ซ้ายขวาไปตรงกลาง ตรงกลายไปซ้ายขวา

void setup() {
  // ตั้งค่า OUTPUT
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);

}

void loop() {
  // สั่งไฟวิ่งจากซ้ายไปขวาและให้ไฟดวงก่อนที่ติดเปลี่ยนเป็นดับ
  for(int i = 2; i <= 9; i++){
    digitalWrite(i-1,0); // สั่งให้ดวงก่อนหน้าดับ
    digitalWrite(i,1); // สั่งให้ดวงถัดไปติด
    delay(250); // หน่วงเวลา
  }
  // สั่งไฟวิ่งจากขวาไปซ้ายและให้ไฟดวงก่อนที่ติดเปลี่ยนเป็นดับ
  for(int i = 9; i >= 2; i--){
    digitalWrite(i+1,0); // สั่งให้ดวงก่อนหน้าดับ
    digitalWrite(i,1); // สั่งให้ดวงถัดไปติด
    delay(250); // หน่วงเวลา
  }
  // สั่งไฟวิ่งจากซ้ายขวาไปตรงกลางและให้ไฟดวงก่อนที่ติดเปลี่ยนเป็นดับ
  for(int i = 0; i <= 3; i++){
    digitalWrite(i+2,1); // สั่งให้ดวงด้านซ้ายติด
    digitalWrite(9-i,1); // สั่งให้ดวงด้านขวาติด
    digitalWrite(i+1,0); // สั่งให้ดวงด้านซ้ายก่อนหน้าดับ
    digitalWrite(10-i,0); // สั่งให้ดวงด้านขวาก่อนหน้าดับ
    delay(250); // หน่วงเวลา
  }
  // สั่งไฟวิ่งจากตรงกลางไปซ้ายและขวาและให้ไฟดวงก่อนที่ติดเปลี่ยนเป็นดับ
  for(int i = 3; i >= -1; i--){
    digitalWrite(8-i,0); // สั่งให้ดวงก่อนหน้าดับ
    digitalWrite(i+2,1); // สั่งให้ดวงกลางซ้ายติด
    digitalWrite(i+3,0); // สั่งให้ดวงก่อนหน้าดับ
    digitalWrite(9-i,1); // สั่งให้ดวงกลางขวาติด
    delay(250); // หน่วงเวลา
  }

}

Download ไฟล์ตัวอย่างไฟวิ่ง

ตัวอย่างโค๊ดกดสวิตซ์ที่ INPUT แล้วสั่งให้ไฟ OUTPUT ติด

#define OUT1 2 // สร้างตัวแปร OUT1 มีค่าเป็น 2
#define OUT2 3 // สร้างตัวแปร OUT2 มีค่าเป็น 3
#define OUT3 4 // สร้างตัวแปร OUT3 มีค่าเป็น 4
#define OUT4 5 // สร้างตัวแปร OUT4 มีค่าเป็น 5
#define OUT5 6 // สร้างตัวแปร OUT5 มีค่าเป็น 6
#define OUT6 7 // สร้างตัวแปร OUT6 มีค่าเป็น 7
#define OUT7 8 // สร้างตัวแปร OUT7 มีค่าเป็น 8
#define OUT8 9 // สร้างตัวแปร OUT8 มีค่าเป็น 9
#define IN1 A5 // สร้างตัวแปร IN1 มีค่าเป็น A5
#define IN2 A4 // สร้างตัวแปร IN2 มีค่าเป็น A4
#define IN3 A3 // สร้างตัวแปร IN3 มีค่าเป็น A3
#define IN4 A2 // สร้างตัวแปร IN4 มีค่าเป็น A2
#define IN5 A1 // สร้างตัวแปร IN5 มีค่าเป็น A1
#define IN6 A0 // สร้างตัวแปร IN6 มีค่าเป็น A0
#define IN7 11 // สร้างตัวแปร IN7 มีค่าเป็น 11
#define IN8 10 // สร้างตัวแปร IN8 มีค่าเป็น 10

void setup() {
  // ตั้งค่า OUTPUT
  pinMode(OUT1,OUTPUT);
  pinMode(OUT2,OUTPUT);
  pinMode(OUT3,OUTPUT);
  pinMode(OUT4,OUTPUT);
  pinMode(OUT5,OUTPUT);
  pinMode(OUT6,OUTPUT);
  pinMode(OUT7,OUTPUT);
  pinMode(OUT8,OUTPUT);
  // ตั้งค่าสวิตซ์เป็น INPUT PULLUP 
  // เป็นคำสั่งสำหรับเชื่อมต่อตัวต้านทาน 10K ระหว่างขาที่ต้องการกับไฟ 5V
  // เพื่อคงสถานะสวิตซ์เป็น HIGH ไว้เมื่อไม่มีการกดปุ่ม
  pinMode(IN1,INPUT_PULLUP);
  pinMode(IN2,INPUT_PULLUP);
  pinMode(IN3,INPUT_PULLUP);
  pinMode(IN4,INPUT_PULLUP);
  pinMode(IN5,INPUT_PULLUP);
  pinMode(IN6,INPUT_PULLUP);
  pinMode(IN7,INPUT_PULLUP);
  pinMode(IN8,INPUT_PULLUP);

}

void loop() {
  // SW1
  if(!digitalRead(IN1))// ถ้า IN1 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT1,1);} // LED ที่ OUT1 ติด
  else                    // IN1 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT1,0);} // LED ที่ OUT1 ดับ
  // SW2
  if(!digitalRead(IN2))   // ถ้า IN2 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT2,1);} // LED ที่ OUT2 ติด
  else                    // IN2 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT2,0);} // LED ที่ OUT2 ดับ
  // SW3
  if(!digitalRead(IN3))   // ถ้า IN3 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT3,1);} // LED ที่ OUT3 ติด
  else                    // IN3 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT3,0);} // LED ที่ OUT3 ดับ
  // SW4
  if(!digitalRead(IN4))   // ถ้า IN4 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT4,1);} // LED ที่ OUT4 ติด
  else                    // IN4 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT4,0);} // LED ที่ OUT4 ดับ
  // SW5
  if(!digitalRead(IN5))   // ถ้า IN5 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT5,1);} // LED ที่ OUT5 ติด
  else                    // IN5 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT5,0);} // LED ที่ OUT5 ดับ
  // SW6
  if(!digitalRead(IN6))   // ถ้า IN6 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT6,1);} // LED ที่ OUT6 ติด
  else                    // IN6 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT6,0);} // LED ที่ OUT6 ดับ
  // SW7
  if(!digitalRead(IN7))   // ถ้า IN7 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT7,1);} // LED ที่ OUT7 ติด
  else                    // IN7 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT7,0);} // LED ที่ OUT7 ดับ
  // SW8
  if(!digitalRead(IN8))   // ถ้า IN8 เป็น LOW หรือกดปุ่ม
  {digitalWrite(OUT8,1);} // LED ที่ OUT8 ติด
  else                    // IN8 เป็น HIGH หรือปล่อยปุ่ม
  {digitalWrite(OUT8,0);} // LED ที่ OUT8 ดับ
}

Download ไฟล์ตัวอย่างปุ่มกด

วงจรส่งผ่านสัญญาณ Analog ด้วย PC817 สัญญาณ INPUT 0 – 10 V สัญญาณ OUTPUT 0 – 5V Isolated ground

วงจรส่งผ่านสัญญาณ Analog ด้วย PC817 สัญญาณ INPUT 0 – 10 V สัญญาณ OUTPUT 0 – 5V Isolated ground


0 – 10V to 0 – 5V Isolated ground

แผงวงจรสำหรับรับสัญญาณไฟ 0 – 10V และแปลงเป็นไฟ 0 – 5V แบบแยกกราวด์

สัญญาณเข้า          สัญญาณออก

        1V                       0.002V

       2V                        0.196V

       3V                       0.537V

       4V                       1.013V

       5V                       1.561V

       6V                       2.149V

       7V                       2.742V

       8V                       3.349V

       9V                       3.819V

       10V                      3.976V

กราฟแสดงสัญญาณเข้า 0 – 10V และสัญญาณออก 0 – 5V

Code สำหรับอ่านค่าแรงดัน

void setup() {
  Serial.begin(9600);

}

void loop() {
  Serial.print("Voltage : "); Serial.println(Read_Voltage());
  delay(1000);

}

float Read_Voltage() {
  int Ana_Volt = analogRead(A0);
  float Volt = 0;
  if (Ana_Volt < 5) {
    Volt = 0;
  }
  else if (Ana_Volt < 35 && Ana_Volt > 5) {
    Volt = Ana_To_Vo(35, 1, Ana_Volt, 0);
  }
  else if (Ana_Volt < 113 && Ana_Volt > 35) {
    Volt = Ana_To_Vo(80, 2, Ana_Volt, 35);
  }
  else if (Ana_Volt < 214 && Ana_Volt > 113) {
    Volt = Ana_To_Vo(101, 3, Ana_Volt, 113);
  }
  else if (Ana_Volt < 329 && Ana_Volt > 214) {
    Volt = Ana_To_Vo(115, 4, Ana_Volt, 214);
  }
  else if (Ana_Volt < 451 && Ana_Volt > 329) {
    Volt = Ana_To_Vo(122, 5, Ana_Volt, 329);
  }
  else if (Ana_Volt < 578 && Ana_Volt > 451) {
    Volt = Ana_To_Vo(127, 6, Ana_Volt, 451);
  }
  else if (Ana_Volt < 704 && Ana_Volt > 578) {
    Volt = Ana_To_Vo(126, 7, Ana_Volt, 578);
  }
  else if (Ana_Volt < 805 && Ana_Volt > 704) {
    Volt = Ana_To_Vo(85, 8, Ana_Volt, 704);
  }
  else if (Ana_Volt < 845 && Ana_Volt > 805) {
    Volt = Ana_To_Vo(31, 9, Ana_Volt, 805);
  }
  else if (Ana_Volt > 820 ) {
    Volt = 10;
  }
  return Volt;
}

float Ana_To_Vo(int Max_Va, float Max_Vo, float Ana, int Min_Va) {
  Ana = Ana - Min_Va;
  float V = Ana / Max_Va;
  V = V + Max_Vo;
  return V;
}

 

การต่อวงจรทดลอง

ค่าที่อ่านได้จาก Code

Vin 6.2 V

 

Vin 9.4V

Vin 4.8V

 

https://www.star-circuit.com

LCD2004-DS3231-I2C-V1

LCD2004-DS3231-I2C-V1

LCD2004-DS3231-I2C-V1 เป็นบอร์ดที่ร่วม LCD2004 สำหรับการเชื่อมต่อ LCD แบบ I2C ที่สามารถปรับเปลี่ยน Contrast และ Brightness ของ LCD ทาง Software ได้และ ไอซีนาฬิกา DS3231 เข้าด้วยกัน

คุณสมบัติของบอร์ด LCD2004-DS3231-I2C-V1

  • Pin header สำหรับเชื่อมต่อกับบอร์ด Arduino uno และ Pin header 6 ขา สำหรับเชื่อมต่อกับบอร์ดชนิดอื่นโดยประกอบไปด้วย +24 V และ GND ของ 24 V สำหรับเลี้ยง Backlight แบบ Isolator I2C สำหรับเชื่อมต่อกับ อุปกรณ์บนบอร์ด และไฟเลี้ยง 5 V และ GND 5 V สำหรับเลี้ยง IC บนบอร์ด
  • ควบคุม Contrast และ Brightness ผ่าน Software โดยเชื่อมต่อแบบ I2C
  • รางถ่านสำหรับแบตเตอรี่ชนิด CR2032 สำหรับนาฬิกาของ DS3231
  • เก็บค่า Contrast และ Brightness สำหรับเรียกใช้เมื่อเริ่มทำงาน

การเชื่อมต่อ I2C ของบอร์ด

ADDRESS

  • Address ของ LCD – 0x20 สำหรับเขียนเพื่อแสดงข้อความบน LCD
  • Address ของ DS3231 – 0x68 สำหรับอ่าน/เขียน นาฬิกาบน IC DS3231
  • Address ของ Module Contrast And Brightness – 0x32 สำหรับควบคุม Contrast และ Brightness

การควบคุม Contrast และ Brightness ด้วย Module Contrast And Brightness ผ่านการเชื่อมต่อแบบ I2C

Address คำสั่งสำหรับ Module Contrast And Brightness

  • Address 0x0A สำหรับควบคุม Contrast รับค่าตั้งแต่ 0 – 255 (8 Bit)
  • Address 0xA0 สำหรับควบคุม Brightness รับค่าตั้งแต่ 0 – 255 (8 Bit)

ควบคุม Contrast และ Brightness ด้วย Library LCD2004_DS3231_I2C_Module

คำสั่ง

  • WireBrightness(Var) : Var = ตัวเลข 0 – 255 สำหรับควบคุม Brightness
  • WireContrast(Var) : Var = ตัวเลข 0 – 255 สำหรับควบคุม Contrast

การใช้งานการควบคุม Contrast และ Brightness โดยใช้ Library LCD2004_DS3231_I2C_Module

  1. include Library LCD2004_DS3231_I2C_Module.h สำหรับการอ่านและเขียน Brightness และ Contrast
  2. include Library Wire.h สำหรับการติดต่อสื่อสารแบบ I2C (Arduino IDE มี Library นี้มาให้)
  3. ใน Setup เขียนคำสั่ง Wire.begin() เพื่อเริ่มการสื่อสารแบบ I2C
  4. เขียนคำสั่ง WireBrightness หรือ WireContrst สำหรับปรับ Contrast และ Brightness

ตัวอย่างการใช้งานการควบคุม Contrast และ Brightness โดยใช้ Library LCD2004_DS3231_I2C_Module

#include <Wire.h> // Library I2C
#include <LCD2004_DS3231_I2C_Module.h> // Library ควบคุม Contrast และ Brightness
#include <LiquidCrystal_I2C.h> // Library จอ LCD
LiquidCrystal_I2C lcd(0x20, 20, 4); // 0x20 - Address LCD

void setup() {
  Wire.begin(); // เริ่มการสื่อสารแบบ I2C
  lcd.begin(); // เริ่มการทำงาน LCD
  WireBrightness(255); // เขียน Brightness ระหว่าง 0 -255
  WireContrast(90); // เขียน Contrast ระหว่าง 0 -255 lcd.backlight(); // เปิดไฟ Backlight
  lcd.print("LCD2004-DS3231-I2C"); // แสดง LCD2004-DS3231-I2C บน LCD
}

void loop() {
  // put your main code here, to run repeatedly:
}

เมื่อ Upload Code ด้านบนเข้า Arduino Uno และเชื่อมต่อกับบอร์ด LCD2004-DS3231-I2C หน้าจอ LCD จะแสดงข้อความ LCD2004-DS3231-I2C โดย Contrast และ Brightness ของจอจะขึ้นอยู่กับค่าที่เราเขียนเข้าไปในคำสั่ง WireBrightness และ WireContrast

ควบคุม Contrast และ Brightness ด้วย Library Wire.h

คำสั่ง

  • Wire.begin() : เริ่มการสื่อสารแบบ I2C
  • Wire.beginTransmission(Address) : เริ่มการติดต่อสื่อสารกับอุปกรณ์ตาม Address นั้นๆ
  • Wire.write(Var) : ส่งข้อมูลในค่า Var ไปยังอุปกรณ์ที่ระบุไว้ในคำสั่ง beginTransmission()
  • Wire.endTransmission() : จบการติดต่อสื่อสาร
  • delay(Var) : หยุดการทำงานเป็นเวลาตามค่า Var ในหน่วย milliSecond

การใช้งานการควบคุม Contrast และ Brightness โดยใช้ Library Wire.h

  1. include Library Wire.h สำหรับการติดต่อสื่อสารแบบ I2C
  2. ใน Setup เขียนคำสั่ง Wire.begin() เพื่อเริ่มการสื่อสารแบบ I2C
  3. เมื่อต้องการติดต่อสื่อสารกับ Module Contrast And Brightness เพื่อควบคุม Contrast หรือ Brightness เขียนคำสั่ง Wire.beginTransmission(0x32) เพื่อเริ่มการสื่อสารกับอุปกรณ์ 0x32 (หัวข้อ ADDRESS)
  4. เขียนคำสั่ง Wire.write(var) โดยค่าใน Var คือ Address คำสั่งของ Module Contrast And Brightness (หัวข้อ Address คำสั่งสำหรับ Module Contrast And Brightness)
  5. เมื่อระบุ Address คำสั่งของ Module Contrast And Brightness แล้ว เขียนคำสั่ง Wire.write(Var) อีกครั้งโดยค่าใน Var คือค่าที่เราต้องการตั้งให้กับ Address คำสั่งในข้อที่ 4 โดยทั้ง Contrast และ Brightness มีค่าตั้งแต่ 0 – 255 (8 Bit) โดยค่าของ Brightness จำแปรผันตรงกับค่าใน Var แต่ค่า Contrast จพแปรผกผันกับค่าใน Var
  6. เขียนคำสั่ง Wire.endTransmission() เพื่อจบการสื่อสารกับ Module Contrast And Brightness (0x32)

ตัวอย่างการใช้งานการควบคุม Contrast และ Brightness โดยใช้ Library Wire.h

#include <Wire.h> // Library การสื่อสารแบบ I2C
#include <LiquidCrystal_I2C.h> // Library LCD
LiquidCrystal_I2C lcd(0x20, 20, 4); // 0x20 - Address LCD

void setup() {
  Wire.begin(); // เริ่มการสื่อสารแบบ I2C
  lcd.begin(); // เริ่มการทำงาน LCD
  lcd.backlight(); // เปิดไฟ Backlight
  lcd.print("LCD2004-DS3231-I2C"); // แสดง LCD2004-DS3231-I2C บน
  LCD Write_To_Tiny(Add,Var); // Add : Address คำสั่ง Var : ค่าที่ต้องการตั้ง
}

void loop(){

}

 

เมื่อใส่ Address คำสั่งของ Module Contrast And Brightness เข้าไปใน Add และค่าที่ต้องการตั้งเข้าไปใน Var หน้าจอ LCD จะแสดง LCD2004-DS3231-I2C โดย Contrast และ brightness จะเป็นไปตามที่เราตั้ง

DS3231 แสดงค่าเวลาบน LCD โดยใช้ Library LCD2004_DS3231_I2C_Module

คำสั่ง

  • SetTime(Sec,Min,Hour,Day,Date,Month,Year); : ตั้งเวลาให้ DS3231
  • ReadTime(Sec,Min,Hour,Day,Date,Month,Year); : อ่านเวลาจาก DS3231

การใช้งาน DS3231 ร่วมกับ LCD โดยใช้ Library LCD2004_DS3231_I2C_Module

  1. include Library Wire.h และ LCD2004_DS3231_I2C_Module เข้าโปรแกรม
  2. ตั้งตัวแปร 7 ตัวสำหรับเก็บ วินาที,นาที,ชั่วโมง,วันของอาทิตย์,วันของเดือน,เดือน,ปี
  3. เขียนคำสั่ง SetTime สำหรับตั้งเวลา 1 ครั้งและ Upload โค้ดที่ไม่มีคำสั่งนี้อีกครั้ง ไม่เช่นนั้น DS3231 จะถูกตั้งเวลาทุกครั้งที่เปิด
  4. เขียนคำสั่ง ReadTime สำหรับรับค่าเวลาจาก DS3231

ตัวอย่าง การใช้งาน DS3231 ร่วมกับ LCD โดยใช้ Library LCD2004_DS3231_I2C_Module

#include <Wire.h> // Library การสื่อสารแบบ I2C
#include <LiquidCrystal_I2C.h> // Library LCD
#include <LCD2004_DS3231_I2C_Module.h>
LiquidCrystal_I2C lcd(0x20, 20, 4); // 0x20 - Address LCD
byte SecO,MinO,HouO,DayO,DatO,MonO,YeaO; // ตัวแปรเก็บค่าเวลา

void setup() {
  Wire.begin(); // เริ่มการสื่อสารแบบ I2C
  Serial.begin(9600);
  lcd.begin(); // เริ่มการทำงาน LCD
  lcd.backlight(); // เปิดไฟ Backlight
  lcd.print("LCD2004-DS3231-I2C"); // แสดง LCD2004-DS3231-I2C บน LCD
  //SetTime(Sec,Min,Hour,Day,Date,Month,Year); // ฟังชั่นภายใน Library LCD2004_DS3231_I2C_Module
  // ตั้งเวลาโดยเรียงตามลำดับ Sec,Minute,Hour,Day,Date,Month,Year
}

void loop() {
  ReadTime(SecO,MinO,HouO,DayO,DatO,MonO,YeaO); // ฟังชั่นภายใน Library LCD2004_DS3231_I2C_Module
  // อ่านค่าเวลาจาก DS3231 และ เก็บค่าเวลาลงในตัวแปร
  LCD_Time(); // แสดงเวลาที่ lcd
  delay(500);
}

void LCD_Time(){
  // ตั้งตำแหน่งที่ต้องการแสดงและแสดงค่าเวลาเป็นเลขฐาน 16 เนื่องจากค่าที่ DS3231 ส่งมาอยู่ในเลขฐาน 16 (ดูใน Datasheet DS3231)
  // ถ้าตั้งค่าชั่วโมงให้แสดงในรูป 1 - 12 AM/PM ค่าเวลาชั่วโมงจะเขียนอีกแบบหนึ่ง
  // ,HEX : แสดงค่าในฐาน 16 // (Var & 0xF0) >> 4 : แสดงเลขหลักสิบในฐาน 16 (แสดงแค่ Bit ที่ 4 - 7)
  // Var & 0x0F : แสดงเลขหลักหน่วยในฐาน 16 (แสดงแค่ Bit ที่ 0 - 3)
  // ตัวอย่าง HEX = 0x26
  // (0x26 & 0xF0) >> 4 = (0010110 & 11110000) >> 4 = 00100000 >> 4 = 00000010 = 2
  // 0x26 & 0x0F = 00100110 & 00001111 = 00000110 = 6
  lcd.setCursor(0,1); lcd.print((HouO & 0xF0) >> 4,HEX);
  lcd.print(HouO & 0x0F,HEX); lcd.print(":"); lcd.print((MinO & 0xF0) >> 4,HEX);
  lcd.print(MinO & 0x0F,HEX); lcd.print(":"); lcd.print((SecO & 0xF0) >> 4,HEX);
  lcd.print(SecO & 0x0F,HEX); lcd.print(" "); lcd.print((DatO & 0xF0) >> 4,HEX);
  lcd.print(DatO & 0x0F,HEX); lcd.print("/"); lcd.print((MonO & 0xF0) >> 4,HEX);
  lcd.print(MonO & 0x0F,HEX); lcd.print("/"); lcd.print((YeaO & 0xF0) >> 4,HEX);
  lcd.print(YeaO & 0x0F,HEX); lcd.setCursor(0,2); // ค่าวันใน DS3231 แสดงเป็นเลขฐาน 10 ค่าตั้งแต่ 1 - 7 โดย 1 = วันอาทิตย์
  if(DayO == 1){
    lcd.print("Sunday");
  }
  else if(DayO == 2){
    lcd.print("Monday");
  }
  else if(DayO == 3){
    lcd.print("Tuseday");
  }
  else if(DayO == 4 ){
    lcd.print("Wednesday");
  }
  else if(DayO == 5){
    lcd.print("Thurday");
  }
  else if(DayO == 6){
    lcd.print("Friday");
  }
  else if(DayO == 7){
  lcd.print("Saturday");
  }
}

 

DS3231 แสดงค่าเวลาบน LCD โดยใช้ Library Wire

คำสั่ง

  • Wire.begin() : เริ่มการสื่อสารแบบ I2C
  • Wire.beginTransmission(Address) : เริ่มการติดต่อสื่อสารกับอุปกรณ์ตาม Address นั้นๆ
  • Wire.write(Var) : ส่งข้อมูลในค่า Var ไปยังอุปกรณ์ที่ระบุไว้ในคำสั่ง beginTransmission()
  • Wire.endTransmission() : จบการติดต่อสื่อสาร
  • delay(Var) : หยุดการทำงานเป็นเวลาตามค่า Var ในหน่วย milliSecond

การใช้งาน DS3231 ร่วมกับ LCD โดยใช้ Library Wire

  1. include Library Wire.h และ LiquidCrystal_I2C เข้ามาในโปรแกรม
  2. เริ่มการติดต่อสื่อสารแบบ I2C และเริ่มการทำงาน LCD
  3. ดึงค่าเวลาจาก DS3231 มาเก็บไว้ในตัวแปรโดยจะทำการแปลงเลขจากฐาน 16 ที่ได้มาจาก DS3231 ที่เป็นฐาน 10 หรือไม่แปลงก็ได้
  4. คำค่าที่ได้แสดงบา LCD ถ้าเป็นเลขฐาน 16 ให้แสดงแบบ HEX ถ้าเป็นฐาน 10 เขียนอะไรเพิ่มเติม
  5. ถ้าแสดงชั่วโมงในรูปแบบ 1 – 12 AM/PM การแปลงเลขฐาน 16 เป็นฐาน 10 หรือแสดงในรูปฐาน 16 บน LCD จะต้องมีการ And 0x1F กับตัวแปรชั่วโมง และอ่าน Bit ที่ 5 ว่าเป็น AM หรือ PM ตาม Datasheet ของ DS3231
  6. การแสดงค่าวันจะเป็นตัวเลขฐานสิบ 1 – 7 โดยเลข 1 คือวันอาทิตย์ และเรียงวันมาตามลำดับ

ตัวอย่างการใช้งาน DS3231 ร่วมกับ LCD โดยใช้ Library Wire

#include <Wire.h>// Library การสื่อสารแบบ I2C
#include <LiquidCrystal_I2C.h>// Library LCD
LiquidCrystal_I2C lcd(0x20, 20, 4); // 0x20 - Address LCD byte SecO,MinO,HouO,DayO,DatO,MonO,YeaO;
// ตัวแปรเก็บค่าเวลา

void setup() {
  Wire.begin(); // เริ่มการสื่อสารแบบ I2C Serial.begin(9600);
  lcd.begin(); // เริ่มการทำงาน LCD
  lcd.backlight(); // เปิดไฟ Backlight
  lcd.print("LCD2004-DS3231-I2C"); // แสดง LCD2004-DS3231-I2C บน LCD
  //Write_To_DS(0,1,13,6,25,6,20); // ตั้งเวลาโดยเรียงตามลำดับ Sec,Minute,Hour,Day,Date,Month,Year
}

void loop() {
  Read_From_DS(SecO, MinO, HouO, DayO, DatO, MonO, YeaO); // อ่านค่าเวลาจาก DS3231 และ เก็บค่าเวลาลงในตัวแปร
  LCD_Time(); // แสดงเวลาที่ lcd
  delay(500);
}

void LCD_Time() {
  // ตั้งตำแหน่งที่ต้องการแสดงและแสดงค่าเวลาเป็นเลขฐาน 16 เนื่องจากค่าที่ DS3231 ส่งมาอยู่
  //ในเลขฐาน 16 (ดูใน Datasheet DS3231)
  // ถ้าตั้งค่าชั่วโมงให้แสดงในรูป 1 - 12 AM/PM ค่าเวลาชั่วโมงจะเขียนอีกแบบหนึ่ง
  // ,HEX : แสดงค่าในเลขฐาน 16 // (Var & 0xF0) >> 4 : แสดงเลขหลักสิบในฐาน 16 (แสดงแค่ Bit ที่ 4 - 7)
  // Var & 0x0F : แสดงเลขหลักหน่วยในฐาน 16 (แสดงแค่ Bit ที่ 0 - 3)
  // ตัวอย่าง HEX = 0x26
  // (0x26 & 0xF0) >> 4 = (0010110 & 11110000) >> 4 = 00100000 >> 4 = 00000010 = 2
  // 0x26 & 0x0F = 00100110 & 00001111 = 00000110 = 6
  lcd.setCursor(0, 1); lcd.print((HouO & 0xF0) >> 4, HEX); lcd.print(HouO & 0x0F, HEX);
  lcd.print(":"); lcd.print((MinO & 0xF0) >> 4, HEX); lcd.print(MinO & 0x0F, HEX);
  lcd.print(":"); lcd.print((SecO & 0xF0) >> 4, HEX); lcd.print(SecO & 0x0F, HEX);
  lcd.print(" "); lcd.print((DatO & 0xF0) >> 4, HEX); lcd.print(DatO & 0x0F, HEX);
  lcd.print("/"); lcd.print((MonO & 0xF0) >> 4, HEX); lcd.print(MonO & 0x0F, HEX);
  lcd.print("/"); lcd.print((YeaO & 0xF0) >> 4, HEX); lcd.print(YeaO & 0x0F, HEX);
  lcd.setCursor(0, 2); // ค่าวันใน DS3231 แสดงเป็นเลขฐาน 10 ค่าตั้งแต่ 1 - 7 โดย 1 = วันอาทิตย์
  if (DayO == 1) {
    lcd.print("Sunday");
  }
  else if (DayO == 2) {
    lcd.print("Monday");
  }
  else if (DayO == 3) {
    lcd.print("Tuseday");
  }
  else if (DayO == 4 ) {
    lcd.print("Wednesday");
  }
  else if (DayO == 5) {
    lcd.print("Thurday");
  }
  else if (DayO == 6) {
    lcd.print("Friday");
  }
  else if (DayO == 7) {
    lcd.print("Saturday");
  }
}

void Write_To_DS(byte Sec, byte Min, byte Hou, byte Day, byte Dat, byte Mon, byte Yea) {
  // ตั้งเวลา Wire.beginTransmission(0x68);
  // ติดต่อกับอุปกรณ์ 0x68 (DS3231) Wire.write(0);
  // 0 = ตำแหน่งที่ต้องการเขียน (ดูใน Datasheet DS3231)
  // DEC_To_HEX() : ฟังชั่นแปรงเลขฐาน 10 เป็นฐาน 16 เนื่องจาก DS3231 รับ/ส่งเป็นเลขฐาน 16
  // ส่งค่าเวลาที่ต้องการตั้ง
  Wire.write(DEC_To_HEX(Sec)); Wire.write(DEC_To_HEX(Min)); Wire.write(DEC_To_HEX(Hou));
  Wire.write(DEC_To_HEX(Day)); Wire.write(DEC_To_HEX(Dat)); Wire.write(DEC_To_HEX(Mon));
  Wire.write(DEC_To_HEX(Yea)); Wire.endTransmission(); // จบการติดต่อสื่อสาร delay(5);
}

void Read_From_DS(byte &Se, byte &Mi, byte &Ho, byte &Da, byte &Dt, byte &Mo, byte &Ye) {
  // อ่านค่าเวลา //โดย & คือการระบุ Address ของตัวแปร ให้ตัวแปรในฟังชั่นนี้มี Address ตรงกับค่าที่ส่งมา เมื่อตัวแปรในฟังชั่นนี้เปลี่ยนแปรง
  //ตัวแปรที่ส่งค่ามาก็จะเปลี่ยนไปด้วย
  Wire.beginTransmission(0x68); // ติดต่อกับอุปกรณ์ 0x68 (DS3231)
  Wire.write(0); // 0 = ตำแหน่งที่ต้องการอ่าน (ดูใน Datasheet DS3231)
  Wire.endTransmission(); // จบการติดต่อสื่อสาร Wire.requestFrom(0x68,7); // ขอข้อมูล 7 bit จาก DS3231
  // อ่านข้อมูลเก็บเข้าตัวแปร
  Se = Wire.read(); Mi = Wire.read(); Ho = Wire.read(); Da = Wire.read(); Dt = Wire.read();
  Mo = Wire.read(); Ye = Wire.read();
} byte DEC_To_HEX(byte var) { // แปรงเลขฐาน 10 เป็นฐาน 16 byte H1 = var/10, H2 = var%10;
  // แยกตัวเลขเป็นหลักหน่วยกับหลักสิบ H1 = (H1 << 4) | H2;
  // ขยับเลขหลัก 10 ไปทางซ้าย 4 bit และ Or กับเลขหลัก หน่วย return H1;
  // ส่งค่าคือฟังชั่น
  /* ตัวอย่าง Var = 23 H1 = var/10 = 23/10 : / = หายไม่เอาเศษ
    H1 = 2 = 0010 H2 = var%10 = 23/10 : % = หายเอาเศษ
    H2 = 3 = 0011 H1 = (H1 << 4) | H2 = (0010(เลข 2 ) << 4(ขยับ Bit ไปทางซ้าย 4 bit))
    | 0011(เลข 3) = 00100000(เลข 2 ที่ขยับ Bit ทางซ้าย 4 bit) | 0011(เลข 3) = 00100011
    ค่าที่ส่งออกคือ 00100011(ฐาน 10 = 35)(ฐาน 16 = 23) แปรงเป็นฐาน 16 00100011 = 0010 --> 2 0011 --> 3 = 23 ในฐาน 16 */
}

 

จากตัวอย่างด้านบนเป็นการแสดงค่าจาก DS3231 บน LCD โดยไม่มีการแปลงค่าจากฐาน 16 ที่รับมาจาก DS3231 เป็นฐาน 10 แต่ใช้การแสดงเลขฐาน 16 ด้วย ,HEX ต่อท้ายตัวแปรที่ต้องการแสดง ถ้าต้องการแสดงเวลาโดยไม่ใช้ ,HEX ต้องนำค่าที่รับจาก DS3231 ไปแปลงจากฐาน 16 ให้เป็นฐาน 10 เสียก่อน ยกเว้น Address 0x03 ของ DS3231 (Datasheet DS3231 / วัน) ที่ให้ค่าเป็น 1 – 7 ในฐานสิบโดยเลข 1 คือวันอาทิตย์ และเรียงลำดับตัวเลขตามวันจนถึงเลข 7 คือวันเสาร์ ฟังชั่น Write_To_DS(0,1,13,6,25,6,20); ที่ใส่ Comment ไว้ใน void Setup คือฟังชั่นในการส่งค่าให้กับ DS3231 เพื่อตั้งเวลา

หากไม่ใส่ถ่าน CR2032 บนบอร์ดไว้หรือแบตเตอรี่หมดเวลาที่ตั้งเอาไว้ใน DS3231 จะ Reset กลับไปเป็นค่าเริ่มต้น (00:00:00: 01/01/00)

  • เรื่องล่าสุด

  • คลังเก็บ

  • บันทึกส่วนตัว