วันศุกร์ที่ 19 ตุลาคม พ.ศ. 2561

กล่องจดหมายแจ้งเตือนผ่าน line

โครงงานนี้เป็นการนำเอาโมดูลเซ็นเซอร์แสงสำหรับตรวจจับเมื่อมีจดหมายส่งเข้ามา แล้วแจ้งเตือนเข้า LINE ผ่าน NodeMCU ESP8266 

ในยุคปัจจุบันตู้รับจดหมายยังคงมีความจำเป็นสำหรับบ้านเรือน เพื่อใช้ในการรับฝากข่าวสาร เอกสารสำคัญต่างๆ ที่ถูกส่งมาทางไปรษณีย์ เนื่องจากตู้รับจดหมายมีลักษณะที่ปิดทึบ ทำให้เจ้าของบ้านสังเกตจดหมายที่อยู่ในตู้ได้ยาก อีกทั้งเมืองไทยนั้นอากาศร้อน ทำให้ลำบากที่จะเดินไปเช็คตู้รับจดหมายที่หน้าบ้านอยู่บ่อยๆ เมื่อทิ้งจดหมายค้างไว้ในตู้รับจดหมายเป็นเวลานาน อาจทำให้จดหมายสำคัญได้รับความเสียหายได้

เพื่อเป็นการแก้ปัญหาดังกล่าว จึงจำเป็นต้องทำให้ตู้รับจดหมายมีความอัจฉริยะ สามารถรับรู้ได้เมื่อมีจดหมายส่งเข้ามา แล้วแจ้งเตือนเจ้าของบ้านผ่านทางแอพพลิเคชั่น LINE ทำให้ไม่พลาดจดหมายสำคัญๆอีกต่อไป

รูปที่ 1 ตู้รับจดหมายแจ้งเตือนผ่าน LINE Notify

เซ็นเซอร์แสงตรวจจับสิ่งกีดขวาง

โครงงานนี้ผู้เขียนเลือกใช้เป็นโมดูลเซ็นเซอร์แสงสำหรับตรวจจับสิ่งกีดขวาง ที่สามารถหาซื้อได้ตามร้านค้าขายอุปกรณ์ Arduino ทั่วไป โดยโมดูลตัวนี้จะมีตัวรับและตัวส่ง infrared ในตัว ตัวส่งจะส่งสัญญาณ infrared ออกมา เมื่อมีวัตถุมาบัง คลื่นสัญญาณ infrared ที่ถูกส่งออกมาจะสะท้อนกลับไปเข้าตัวรับสัญญาณ สามารถนำมาใช้ตรวจจับวัตถุที่อยู่ตรงหน้าได้ ภายในโมดูลยังสามารถปรับความไว ระยะการตรวจจับ ใกล้หรือไกลได้

รูปที่ 2 เซ็นเซอร์แสงตรวจจับสิ่งกีดขวาง

ตัวโมดูลมี 4 ขาคือ GND, VCC (ไฟบวก), OUT และ EN เราสามารถต่อใช้งานเพียงแค่ 3 ขาได้แก่ GND, VCCและ OUT โดยในสภาวะที่ไม่มีวัตถุมาบัง สัญญาณที่ออกจากขา OUT จะเป็นลอจิก “1” และเมื่อมีวัตถุมาบัง สัญญาณที่ออกจากขา OUT จะเป็นลอจิก “0” 

รูปที่ 3 Mini NodeMCU ESP-8266

 Mini NodeMCU ESP8266

ถ้าพูดถึงเรื่อง Internet of Things (IoT) แล้วคงต้องพูดถึงอุปกรณ์ตัวนี้ เพราะมันเป็นหัวใจสำคัญในการเชื่อมต่อกับอินเตอร์เน็ตนั่นเอง NodeMCU คือ แพลตฟอร์มหนึ่งที่ช่วยในการทำโปรเจค IoT และตัวมันเองนั้นมีพอร์ต Input Output มาในตัว ทำให้สามารถเขียนโปรแกรมคอนโทรลอุปกรณ์ต่างๆได้โดยไม่ต้องผ่านอุปกรณ์อื่นๆ

นอกจากนี้ NodeMCU ยังสามารถใช้งานได้กับ Arduino IDE อีกด้วย แต่ก่อนที่จะใช้งานได้นั้น เราต้องติดตั้งโปรแกรมเพื่อใช้ในการเขียนโปรแกรมให้กับ NodeMCU ผ่านทาง Arduino IDE เสียก่อน สามารถค้นหาข้อมูลขั้นตอนการติดตั้งโดยใช้คำว่า “ติดตั้ง Arduino IDE ลงบน ESP8266 NodeMCU” สำหรับโครงงานนี้ผู้เขียนเลือกใช้ NodeMCU ESP-8266 แบบ Mini เพราะมีขนาดเล็กนั่นเอง โดยในการเชื่อมต่อกับอินเตอร์เน็ตนั้น NodeMCU จะทำงานร่วมกับ Router ของบ้าน เพราะฉะนั้น ต้องมีสัญญาณ WiFi จาก Router ของบ้านครอบคลุมถึงสถานที่ที่ติดตั้งตู้รับจดหมายด้วย 

LINE Notify

LINE Notify ก็คือการแจ้งเตือนผ่าน LINE เป็นลูกเล่นที่ทาง LINE ทำออกมาให้เหล่านักพัฒนาอย่างเราๆ ได้สนุกสนานกัน เป็นบริการและช่องทางที่ถูกต้อง โดยสามารถส่งข้อความแจ้งเตือนต่างๆ ไปยังบัญชีของเรา หรือกลุ่มต่างๆที่เราอยู่ได้ ผ่านทาง API ที่ทาง LINE ได้เตรียมไว้ให้นั่นเอง

การจะใช้งานได้นั้น ขั้นแรกเราต้องมี LINE Account ที่ลงทะเบียนด้วย Email แล้ว เพื่อใช้ในการสมัคร LINE Notify โดยเข้าไปสมัครได้ที่ https://notify-bot.line.me/th/ แล้วกด เข้าสู่ระบบ” แล้ว Login บัญชี LINE ด้วย Email และรหัสผ่าน จากนั้นให้กดลูกศรชี้ลงด้านข้างชื่อบัญชีแล้วเลือก หน้าของฉัน” แล้วเลื่อนลงมาด้านล่างให้กดปุ่ม ออก Token” ซึ่งในหน้าออก Token นี้ในช่องป้อนชื่อ Token ผู้เขียนใส่คำว่า MailBox” ชื่อนี้จะแสดงเมื่อมีการแจ้งเตือน ผู้ใช้สามารถใส่เป็นชื่ออื่นๆได้ตามต้องการ และเลือกการแจ้งเตือน

ในที่นี้เลือกเป็นเป็น รับการแจ้งเตือนแบบตัวต่อตัวจาก LINE Notify” ซึ่งจะทำให้ LINE ส่งการแจ้งเตือนมายังผู้ใช้เพียงคนเดียว จากนั้นกด ออก Token” นอกจากนี้ยังสามารถเลือกการแจ้งเตือนแบบกลุ่มได้ ซึ่งในการแจ้งเตือนนั้น สมาชิกที่อยู่ในกลุ่มทุกคนจะสามารถมองเห็นการแจ้งเตือนจาก LINE Notify นี้


 

รูปที่ 4 การกรอกข้อมูลและเลือกรับการแจ้งเตือนในขั้นตอนออก Token

เมื่อกดออก Token แล้วจะมีหน้า Token ที่ออกแสดงขึ้นมาพร้อมกับรหัส Tokenดังรูปที่ 5ให้กดคัดลอก และเก็บ Token นี้ไว้ให้ดี เพราะจะออกให้เพียงครั้งเดียว แต่หากลืม สามารถทำขั้นตอนออก Token ใหม่ได้ แต่ Token ที่ได้ก็จะเป็นรหัสชุดใหม่

เมื่อได้คัดลอก Token แล้วถือเป็นการเสร็จสิ้น ให้ปิดและออกจากระบบได้เลย

รูปที่ 5 แสดง Token ที่ออก

หลักการทำงาน

จากรูปที่ 6 เป็นการแสดงวงจรที่ใช้ในโครงงานนี้ วงจรการทำงานหลักๆแบ่งออกเป็น 2 ส่วนได้แก่

ส่วนแรก คือ โมดูลเซ็นเซอร์แสง หรือ IR Sensorทำหน้าที่ตรวจจับจดหมายที่เข้ามาในตู้รับจดหมายและส่งสัญญาณออกทางขา OUT ที่มี 2 สภาวะคือ สภาวะที่ไม่มีจดหมายเข้ามา แรงดันที่ขา OUT จะเป็น 3.3 โวลต์ หรือลอจิก “1” และสภาวะเมื่อมีจดหมายเข้ามา แรงดันที่ขา OUT จะเป็น 0 โวลต์ หรือลอจิก “0”

ส่วนที่สอง คือ Mini NodeMCU ESP-8266 ทำหน้าที่เชื่อมต่อสัญญาณ WiFi เข้ากับ Router ของบ้านเพื่อส่งข้อมูลออกทางอินเตอร์เน็ต และทำหน้าที่รับสัญญาณอินพุตจากจากขา OUT ของ IR Sensor ต่อเข้าขา D7 โดยในโปรแกรมนี้จะตั้งค่าให้ขา D7 ทำงานในโหมด External Interrupt เมื่อสัญญาณจากขา OUT ของ IR Sensor เปลี่ยนแปลงสถานะจากแรงดัน 3.3 โวลต์เป็น 0 โวลต์ NodeMCU จะถือว่ามีจดหมายเข้ามาในตู้รับจดหมาย จากนั้นจะทำการนับจำนวนจดหมายเพิ่ม 1 ฉบับต่อการเปลี่ยนแปลงสถานะ 1 ครั้งแล้วส่งการแจ้งเตือนผ่าน LINE ไปยังเจ้าของบ้าน

รูปที่ 6 วงจรสมบูรณ์

การประกอบ

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

ดังนั้นโครงงานนี้จึงใช้แผ่นปริ๊นท์อเนกประสงค์หรือแผ่นปริ๊นท์ไข่ปลา ซึ่งขั้นแรกให้บัดกรีอุปกรณ์ทั้งหมดเอาไว้บนแผ่นปริ๊นท์ (ดังรูปที่ 7 ก) ที่เหลือก็แค่เชื่อมต่อส่วนต่างๆ เข้าด้วยกัน (ดังรูปที่ 7 ข) จะเห็นว่าการประกอบไม่ซับซ้อนมากนัก บัดกรีสายไฟแค่ 2 เส้น กับตัวต้านทานอีก 1 ตัวเท่านั้นเอง

รูปที่ 7 แสดงการประกอบวงจรลงบนแผ่นปริ๊นท์อเนกประสงค์

นำวงจรที่ประกอบเสร็จแล้วไปติดตั้งในตู้รับจดหมาย โดยใช้สกรูยึดแผ่นปริ๊นท์กับวัสดุที่พอจะหาได้ เช่น แผ่นพลาสติกหรือแผ่นไม้บางๆ เป็นต้น (ดังรูปที่ 8) จากนั้นใช้กาวร้อนแบบแห้งเร็วยึดแผ่นพลาสติกเข้ากับตู้รับจดหมาย โดยให้ทิศทางของ IR Sensor หันไปทางช่องรับจดหมายดังรูปที่ 9และในส่วนของไฟเลี้ยง จะใช้เพาเวอร์อะแดปเตอร์ USB สำหรับเสียบชาร์จโทรศัพท์มือถือในระบบแอนดรอยด์ ซึ่งหาซื้อได้ง่ายและราคาถูก หรือถ้าหากมีเพาเวอร์อะแดปเตอร์ที่ไม่ได้ใช้งานแล้ว ก็สามารถนำมาใช้จ่ายไฟเลี้ยงให้วงจรได้

รูปที่ 8 แสดงการใช้สกรูยึดแผ่นปริ๊นท์เข้ากับแผ่นพลาสติก

รูปที่ 9 แสดงการยึดวงจรที่ประกอบเสร็จแล้วลงภายในตู้รับจดหมาย 

การโปรแกรม

โครงงานนี้จะใช้โปรแกรม Arduino IDE สำหรับเขียนโปรแกรมลงบน NodeMCU โดยต้องติดตั้งโปรแกรมเพื่อใช้ในการเขียนโปรแกรมให้กับ NodeMCU ผ่านทาง Arduino IDE ก่อน ดังที่ได้กล่าวไว้ในก่อนหน้านี้แล้ว

หลังจากติดตั้งเรียบร้อยแล้ว ต้องลงโปรแกรมให้ NodeMCU เสียก่อน โดยโค้ดทั้งหมดสามารถดาวน์โหลดได้ที่เว็บไวต์ http://electronics.se-ed.com/download จากนั้นใช้ Arduino IDE เปิดโค้ดที่ดาวน์โหลดมา แล้วตั้งค่าต่างๆ ให้เป็นของเราเอง โดยแก้ไขโค้ด 3 ส่วนดังต่อไปนี้

  1. WIFI_SSID ให้แก้ YOURWIFINAME ในบรรทัดที่ 4 เป็นชื่อของ Router ของบ้านที่ต้องการให้ NodeMCU ใช้เชื่อมต่อกับอินเตอร์เน็ต

  2. WIFI_PASSWORD ให้แก้ YOUR PASSWORD ในบรรทัดที่ 5 เป็น Password ของ Router จากข้อ 1

  3. LINE_TOKEN ให้แก้ YOUR TOKEN ในบรรทัดที่ 8 เป็น Token ที่ได้ทำการขอจาก LINE ในขั้นตอนก่อนหน้านั้นและคัดลอกไว้เรียบร้อยแล้ว


รูปที่ 10 แสดงส่วนของโค้ดที่ต้องทำการแก้ไข

เนื่องจากไมโครคอนโทรลเลอร์ไม่รองรับ UTF-8 ทำให้ไม่รองรับการพิมพ์ภาษาไทยลงไปตรงๆ หากต้องการส่งข้อความที่ไม่ใช่ภาษาอังกฤษ ต้องแปลงข้อความให้อยู่ในรูปที่เรียกว่า URL Encode ก่อน โดยใช้บริการแปลงจากเว็บ http://meyerweb.com/eric/tools/dencoder/ เมื่อเข้าไปในเว็บแล้วให้พิมพ์ข้อความที่ต้องการ จากนั้นกดปุ่ม Encode ก็จะปรากฏข้อความที่ถูกแปลงแล้วออกมา ดังรูปที่ 11 ผู้เขียนใส่คำว่า “คุณมีจดหมาย” ลงในกล่องข้อความแล้วกดปุ่ม Encode จะเห็นว่าข้อความจะถูกแปลงไปเป็น


“%E0%B8%84%E0%B8%B8%E0%B8%93%E0%B8%A1%E0%B8%B5%E0%B8%88%E0%B8%94%E0%B8%AB%E0%B8%A1%E0%B8%B2%E0%B8%A2”


จากนั้นผู้เขียนก็คัดลอกข้อความที่ถูกแปลงนี้ไปใส่ไว้ในตัวแปร msg_you_have_got_mail เพื่อให้การแจ้งเตือนขึ้นต้นด้วยข้อความว่า “คุณมีจดหมาย” เช่นเดียวกันกับคำว่า “ฉบับ” ก็ใช้วิธีแปลงข้อความแล้วเก็บไว้ในตัวแปร msg_pieces หากผู้ใช้ต้องการส่งข้อความที่แตกต่างออกไปจากในโค้ด เราสามารถนำข้อความที่ต้องการส่งไปแปลงแล้วไปใส่ในตัวแปร msg_you_have_got_mail ในบรรทัดที่ 12 หรือตัวแปร msg_pieces ในบรรทัดที่ 13 ได้เลย

ในการส่งข้อความแจ้งเตือนนั้นจะแบ่งออกเป็น 3 ข้อความได้แก่ “คุณมีจดหมาย”+ จำนวนจดหมาย + “ฉบับ” โดยจำนวนจดหมายจะนับเพิ่มขึ้นเรื่อยๆ ตามจำนวนจดหมายที่เข้ามา

รูปที่ 11 แสดงการแปลงข้อความ URL Encoder

หลังจากแก้ไขการตั้งค่าต่างๆเรียบร้อยแล้วให้โหลดโปรแกรมไปที่ NodeMCU จากนั้นจึงเริ่มทดสอบการทำงาน 

การทดสอบ

เมื่อจ่ายไฟเลี้ยง NodeMCU จะเริ่มทำงานโดยเชื่อมต่อกับ Router ของบ้านที่ได้ทำการใส่ชื่อ SSID และ Password ที่ตั้งค่าเอาไว้ในโค้ด จากนั้นทดสอบส่งจดหมายเข้าไปในตู้รับจดหมาย จะเห็นว่ามีการแจ้งเตือนจากท่าน LINE Notify เข้ามายัง LINE ที่ได้ป้อนรหัส Token ไว้ในโค้ดด้วยข้อความ คุณมีจดหมาย 1 ฉบับ” ดังรูปที่ 12

รูปที่ 12 ข้อความแจ้งเตือนมีจดหมายเข้าผ่านทาง LINE

และเมื่อทดสอบส่งจดหมายอีก 1 ฉบับ ข้อความจะแจ้งเตือนเข้ามาด้วยข้อความ คุณมีจดหมาย 2 ฉบับ” ซึ่งการแจ้งเตือนนั้นรวดเร็วมาก เรียกได้ว่าจดหมายที่ส่งยังไม่หล่นถึงพื้นตู้รับจดหมายเลย ก็มีข้อความแจ้งเตือนเข้ามายัง LINE ของเจ้าของบ้านแล้ว ทั้งนี้ทั้งนั้นก็ขึ้นอยู่กับปัจจัยแวดล้อมต่างๆด้วย เช่น คุณภาพของสัญญาณ WiFi เป็นต้น

เพียงเท่านี้ เราก็สามารถจัดการแปลงร่างตู้รับจดหมายธรรมดาๆ ให้กลายเป็นตู้รับจดหมายอัจฉริยะที่จะทำให้เราไม่พลาดจดหมายสำคัญๆ อีกต่อไป


รายการอุปกรณ์

  1. Mini NodeMCU ESP-8266     1    ตัว

  2. IR Sensor     1      ตัว

  3. Power Adaptor USB 5V      1   ตัว

  4. แผ่นปริ๊นท์อเนกประสงค์      1    ตัว

  5. R 1k        1     ตัว

เครื่องรดน้ำต้นไม้อัตโนมัติ

เครื่องรดน้ำต้นไม้อัตโนมัติ


โปรเจคเครื่องรดน้ำต้นไม้อัตโนมัติ ด้วย Arduino ราคาถูก พร้อม Code ตัวอย่าง

ชุดรดน้ำอัตโนมัติด้วย Arduino เป็นต้นแบบให้น้องได้ศึกษาระบบ Smart Farm พื้นฐาน นำไปพัฒนาต่อในอนาคต โดยใช้ Arduino Uno R3 สามารถนำไปพัฒนาใน งาน IOT หรือจะพัฒนาใน แอพพลิเคชั่น Blynk ได้อีกด้วย (โปรเจคนี้จะอยู่ที่ประมาณ 500 บาท)
อุปกรณ์ที่ต้องใช้มีดังต่อไปนี้
ในส่วนของวงจรการต่อสายมีดังต่อไปนี้
วงจร รดน้ำต้นไม้อัตโนมัติ ด้วย Arduino




ในส่วนของโปรแกรมตัวอย่าง


const int analogInPin = A5;const int relay = 2;
int sensorValue = 0;        // ตัวแปรค่า Analogint outputValue = 0;        // ตัวแปรสำหรับ Map เพื่อคิด %
void setup() {  Serial.begin(9600);  pinMode(relay, OUTPUT);}
void loop() {  sensorValue = analogRead(analogInPin);
  Serial.print("Soil Moisture = ");  Serial.print(outputValue);  Serial.println(" %");
  if (outputValue <= 40) {  //ตั้งค่า % ที่ต้องการจะรดน้ำต้นไม้    digitalWrite(relay, HIGH);  }
  else {    digitalWrite(relay, LOW);  }  delay(1000);}


หลักการทำงานของระบบรดน้ำต้นไม้อัตโนมัติ



โดยปกติแล้ว พืชจะต้องการความชื้นในดินอยู่ที่ประมาณ 40% (แล้วแต่พิชในแต่ละชนิดด้วยน่ะครับ) Sensor วัดความชื้นในดินจะทำการวัดค่าความชื้นในดิน โดยสัญญาณที่ได้ออกมาจะเป็นแบบ Analog ป้อนไปยัง Arduino เพื่อประมวลผล เมื่อ Arduino ได้ทำการวัดตรงตามเงือนไข ก็จะทำการส่ง Logic ไปยัง Relay เพื่อทำการเปิดปั้มน้ำไปรดน้ำต้นไม้ แค่นี้ก็จะได้ โปรเจครดน้ำต้นไม้แบบง่ายๆ

วันพฤหัสบดีที่ 18 ตุลาคม พ.ศ. 2561

Arduino control Motor (เปลี่ยนservo SG90 motorให้หมุนได้360)



         servo ปกติมันจะหมุนได้ 180 องศา ครับ ในบทความนี้เราจะมาดัดแปลง servo ให้หมุ่น 360 องศา กัน หมนได้หลายรอบด้วยครับ servo SG90
1. ให้ถอด bolt 4 ตัวออกมา แล้วถอดพลาสติกที่หัวและท้ายออก ด้านหนึ่งจะเจอเฟือง อีกด้านเป็นแผ่นวงจร

2. ตัด ขาส่วนที่ยื้นของเฟืองตัวใหญ่ออก มันเป็าส่วนที่ทำให้หมุ่น 180 องศา

3. ตัดตัวต้านทานปรับค่าได้ 3 ขาออก ตัวนี้เป็นส่วนที่วัดองศาการหมุนของ servo ตัดออกได้เลยครับ

4. นำตัวต้านทาน 2.2k ohm 2 ตัว มาต่อแทนทีตัวต้านทานปรับค่าได้ที่ถูกตัดออกไปครับ
ตัวอย่าง Code
#include <Servo.h> 
Servo myservo;   
void setup() 
  myservo.attach(9); 
void loop() 
{       myservo.write(0); 
        delay(3000);      
        myservo.write(42); 
        delay(3000);      
        myservo.write(180); 
        delay(3000);                     
}

วันศุกร์ที่ 5 ตุลาคม พ.ศ. 2561

งานปฏิบัติ 18






#include <SoftwareSerial.h>
#include <DHT11.h>
//=============================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x27, 16, 2);
LiquidCrystal_I2C lcd(0x3F, 16, 2);
SoftwareSerial ArduinoSerial(3, 2); // RX, TX
//=============================================
int SW_ON = 4,SW_OFF = 5,pin=6;//กำหนดขา INPUT
int Sun = 9,CSun = 0,Relay1 = 12, Relay2 = 11; //กำหนดขา OUTPUT
int ATL = A0,ATH = A1;//กำหนดขา Analog
int VTL1 = 0,VTH1 = 0,TL = 0,TH =0,VRHL = 50,VRHH = 80;
DHT11 dht11(pin);
//=============================================
void setup()
{
  lcd.begin();
  Serial.begin(115200);
  ArduinoSerial.begin(4800);
  while (!Serial){
    ;
    }
  //=====================================================
  lcd.setCursor(0, 0);lcd.print("Elec Pattayatech");
  lcd.setCursor(0, 1);lcd.print("Smart Farm 2016 ");
  delay(5000);
  //====================================================
  pinMode(Relay1, OUTPUT);pinMode(Relay2, OUTPUT);  
  pinMode(SW_ON, INPUT); pinMode(SW_OFF, INPUT); pinMode(Sun, INPUT);
  digitalWrite(Relay1, HIGH);digitalWrite(Relay2, HIGH);
  lcd.setCursor(0, 0);lcd.print("                ");
  lcd.setCursor(0, 1);lcd.print("                ");
}
//=============================================================
void loop()
{
  while (ArduinoSerial.available() > 0) {
  float val = ArduinoSerial.parseFloat();
  if (ArduinoSerial.read() == '\n') {
  if (val == 10) {
  digitalWrite(13, 1);
  } else if (val == 11) {
  digitalWrite(13, 0);
  }
  Serial.println(val);
  }
  }
  delay(100);
  //========ปรับค่าอุณหภูมิอ้งอิง====================================
  CSun = digitalRead(Sun);
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
  VTL1 = analogRead(ATL);
  VTH1 = analogRead(ATH);
  TL = map(VTL1,0,1023,10,30);
  TH = map(VTH1,0,1023,25,45);
  Serial.print("TL :");Serial.print(TL);Serial.println("*C");
  Serial.print("TH :");Serial.print(TH);Serial.println("*C");
  //===========================================================
    int Stemp =(int)(temp);int Shumi=(int)(humi);//ตัดทศนิยม
    Serial.print("temp :");Serial.print(Stemp);Serial.println("*C");
    Serial.print("humidity :");Serial.print(Shumi);Serial.println("%");
    Serial.print("SUN :");Serial.println(CSun);//Serial.println();
    //===================================================
    lcd.setCursor(0, 0);lcd.print("TL:");lcd.print(TL);
    lcd.setCursor(6, 0);lcd.print("TH:");lcd.print(TH);
    lcd.setCursor(12, 0);lcd.print("S1:");lcd.print(!CSun);
    lcd.setCursor(0, 1);lcd.print("TN:");lcd.print(Stemp);
    lcd.setCursor(6, 1);lcd.print("RH:");lcd.print(Shumi);
    lcd.setCursor(12, 1);lcd.print("P1:0");lcd.print(Shumi);
    delay(1000);
    //===================================================
   //=======ควบคุมอุณหภูมิ===========================
   if(temp < TL && temp < TH ){
        digitalWrite(Relay1, HIGH);//ปั๊มน้ำหยุดทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:0");
        delay(100);
        digitalWrite(Relay2, LOW);//หลอดไฟทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:1");
        delay(60000);//หน่วงเวลา 1 นาที
      }else if(temp > TL && temp > TH){
        digitalWrite(Relay2, HIGH);//หลอดไฟไม่ทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:0");
        delay(100);
        digitalWrite(Relay1, LOW);//ปั๊มน้ำทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:1");
        delay(60000);//หน่วงเวลา 1 นาที
      }else if(temp > TL && temp < TH){
       //=======ควบคุมความชื้น===========================
      if(humi < VRHL && humi < VRHH){
        digitalWrite(Relay2, HIGH);//หลอดไฟไม่ทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:0");
        delay(100);
        digitalWrite(Relay1, LOW);//ปั๊มน้ำทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:1");
        delay(60000);//หน่วงเวลา 1 นาที
      }else if(humi > VRHL && humi > VRHH){
        digitalWrite(Relay1, HIGH);//ปั๊มน้ำหยุดทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:0");
        delay(100);
        digitalWrite(Relay2, LOW);//หลอดไฟทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:1");
        delay(60000);//หน่วงเวลา 1 นาที
      }else if(humi > VRHL && humi < VRHH){
        //delay(1000);
        digitalWrite(Relay1, HIGH);//ปั๊มน้ำหยุดทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:0");
        digitalWrite(Relay2, HIGH);//หลอดไฟไม่ทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:0");
        //หน่วงเวลา 1 นาที      
        }
     //=======ENDควบคุมความชื้น===========================    
        }
     //=======ENDควบคุมอุณหภูมิ===========================
  }
  else
  {
    Serial.println();Serial.print("Error No :");
    Serial.print(err);Serial.println();  
  }
 delay(DHT11_RETRY_DELAY);
}


วันพุธที่ 3 ตุลาคม พ.ศ. 2561

Mini Project LED ลูกบาศก์

Project  LED ลูกบาศก์






Block Diagram





Part Of Project






1. Arduino uno R3






LED





3. ตัวต้านทาน





Link youtube




Code




 int layer[4]={A3,A2,A1,A0}; // ก็ประกาศตัวแปรชื่อ layer เป็นตัวแปรอาร์เรย์ ที่มีขา A3 A2 A 1 A0

  int column[16]={13,12,11,10,9,8,7,6,5,4,3,2,1,0,A5,A4}; // ค่าตัวแปรชื่อว่าคอลัมน์เป็นตัวแปรอาร์เรย์เก็บได้ 16 ค่า

  int time = 250;
// ในเวลา 250
  
void setup()    //
{
  
  for(int i = 0; i<16; i++)   // คำสั่งวน ในถ้า ไอมีค่าน้อยกว่า 16 II บวกไปเรื่อยๆ
  {
    pinMode(column[i], OUTPUT);  //กำหนด pin ที่ต้องการใช้งาน
  }
  
  for(int i = 0; i<4; i++)
  {
    pinMode(layer[i], OUTPUT);  //ตั้งค่าชั้นเพื่อส่งออก
  }
  


void loop()
{
  turnEverythingOff(); // เปิดปิดทุกอย่าง 
  flicker On();;// กะพริบบน
  turn Everything On();// เปิดทุกอย่างบน
  delay(time);//เวลาล่าช้า
  
  layerstompUpAndDown();//ชั้นlayerขึ้นและลง
   
  delay(time);เวลาล่าช้า
  turnEverythingOff();//เปิดปิดทุกอย่าง
  randomflicker();// สุ่มกะพริบ
  randomRain();//สุ่มฝน 
  diagonalRectangle();//สี่เหลี่ยมทแยงมุม
  goThroughAllLedsOneAtATime();
  
  flickerOff();//กะพริบปิด 
  turnEverythingOff();//เปิดทุกอย่างปิด

  delay(2000);//เป็นการสั่งทำงานตามที่กำหนดแต่ยังคงแสดงผล ตามคำสั่งก่อนหน้า ต้องการให้หยุดทำงาน 2 วิ
}


//turn all off
void turnEverythingOff()
 {
   for(int i = 0; i<16; i++)
   {
     digitalWrite(column[i], 1);
   }
   for(int i = 0; i<4; i++)
   {
     digitalWrite(layer[i], 0);
   }
 }
 
//turn all on
void turnEverythingOn()
{
  for(int i = 0; i<16; i++)
  {
    digitalWrite(column[i], 0);
  }
  //turning on layers
  for(int i = 0; i<4; i++)
  {
    digitalWrite(layer[i], 1);
  }
}
//turn columns off
void turnColumnsOff()
{
  for(int i = 0; i<16; i++)
  {
    digitalWrite(column[i], 1);
  }
}
//flicker on
void flickerOn()
{
  int i = 150;
  while(i != 0)
  {
    turnEverythingOn();
    delay(i);
    turnEverythingOff();
    delay(i);
    i-= 5;
  }
}


//up and down single layer stomp
void layerstompUpAndDown()
{
  int x = 75;
  for(int i = 0; i<4; i++)
  {
    digitalWrite(layer[i], 0);
  }
  for(int y = 0; y<5; y++)
  {
    for(int count = 0; count<1; count++)
    { 
      for(int i = 0; i<4; i++)
      {
        digitalWrite(layer[i], 1);
        delay(x);
        digitalWrite(layer[i], 0);
      }
      for(int i = 4; i !=0; i--)
      {
        digitalWrite(layer[i-1], 1);
        delay(x);
        digitalWrite(layer[i-1], 0);
      }
    }
    for(int i = 0; i<4; i++)
    {
      digitalWrite(layer[i], 1);
      delay(x);
    }
    for(int i = 4; i!=0; i--)
    {
      digitalWrite(layer[i-1], 0);
      delay(x);
    }
  }
}
//flicker off
void flickerOff()
{
  turnEverythingOn();
  for(int i = 0; i!= 150; i+=5)
  {
    turnEverythingOff();
    delay(i+50);
    turnEverythingOn();
    delay(i);
  }
}

//random flicker
void randomflicker()
{
  turnEverythingOff();
  int x = 10;
  for(int i = 0; i !=750; i+=2)
  {
  int randomLayer = random(0,4);
  int randomColumn = random(0,16);
  
  digitalWrite(layer[randomLayer], 1);
  digitalWrite(column[randomColumn], 0);
  delay(x);
  digitalWrite(layer[randomLayer], 0);
  digitalWrite(column[randomColumn], 1);
  delay(x); 
  }
}
//random rain
void randomRain()
{
  turnEverythingOff();
  int x = 100;
  for(int i = 0; i!=60; i+=2)
  {
    int randomColumn = random(0,16);
    digitalWrite(column[randomColumn], 0);
    digitalWrite(layer[0], 1);
    delay(x+50);
    digitalWrite(layer[0], 0);
    digitalWrite(layer[1], 1);
    delay(x);
    digitalWrite(layer[1], 0);
    digitalWrite(layer[2], 1);
    delay(x);
    digitalWrite(layer[2], 0);
    digitalWrite(layer[3], 1);
    delay(x+50);
    digitalWrite(layer[3], 0);
    digitalWrite(column[randomColumn], 1);
  }
}
//diagonal rectangle
void diagonalRectangle()
{
  int x = 350;
  turnEverythingOff();
  for(int count = 0; count<5; count++)
  {
    //top left
    for(int i = 0; i<8; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[3], 1);
    digitalWrite(layer[2], 1);
    delay(x);
    turnEverythingOff();
    //middle middle
    for(int i = 4; i<12; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[1], 1);
    digitalWrite(layer[2], 1);
    delay(x);
    turnEverythingOff();
    //bottom right
    for(int i = 8; i<16; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[0], 1);
    digitalWrite(layer[1], 1);
    delay(x);
    turnEverythingOff();
    //bottom middle
    for(int i = 4; i<12; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[0], 1);
    digitalWrite(layer[1], 1);
    delay(x);
    turnEverythingOff();
    //bottom left
    for(int i = 0; i<8; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[0], 1);
    digitalWrite(layer[1], 1);
    delay(x);
    turnEverythingOff();
    //middle middle
    for(int i = 4; i<12; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[1], 1);
    digitalWrite(layer[2], 1);
    delay(x);
    turnEverythingOff();
    //top right
    for(int i = 8; i<16; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[2], 1);
    digitalWrite(layer[3], 1);
    delay(x);
    turnEverythingOff();
    //top middle
    for(int i = 4; i<12; i++)
    {
      digitalWrite(column[i], 0);
    }
    digitalWrite(layer[2], 1);
    digitalWrite(layer[3], 1);
    delay(x);
    turnEverythingOff();
  }
  //top left
  for(int i = 0; i<8; i++)
  {
    digitalWrite(column[i], 0);
  }
  digitalWrite(layer[3], 1);
  digitalWrite(layer[2], 1);
  delay(x);
  turnEverythingOff();
}

วันอาทิตย์ที่ 30 กันยายน พ.ศ. 2561

งาน สอบแก้ตัว

 



Arduino UNO :  ( MCU )


ใช้ Arduino UNO ขนาด 8 บิต ATMega 328P
ควบคุมส่วนประกอบต่างๆเช่นโมดูลบลูทูธ และ รีเลย์







โมดูลบลูทูธ :  ( INPUT )


โมดูล Bluetooth ที่ใช้คือ HC-05 ดังรูปที่ด้านล่างโมดูลบลูทู ธ นี้มีขา 4
ขาสำหรับ VCC (5V), พื้นดิน, TX และ RX

โมดูลบลูทู ธ มีขา 4 ขา: VCC, TX, RX และ GND VCC และ GND เชื่อมต่อกับ 5V และใช้
Ground จาก Arduino UNO โมดูลบลูทู ธ ทำงานบน 3.3V และมีตัวควบคุม 5V ถึง 3.3V
บนเมนบอร์ด

หมุด TX และ RX ของโมดูลบลูทู ธ ต้องเชื่อมต่อกับ RX และ TX pins ของ Arduino ใน
Arduino UNO เรากำหนดขา 2 และ 4 เป็น RX และ TX โดยใช้ซอฟต์แวร์ ดังนั้น TX ของ
Bluetooth เชื่อมต่อกับขา 4 ของ Arduino

แต่เมื่อเชื่อมต่อ RX ของ Bluetooth ไปยัง TX ของ Arduino (หรือไมโครคอนโทรลเลอร์ตัวใด
ๆ อันที่จริงแล้ว) เราต้องระมัดระวังเนื่องจากขาสามารถทนต่อ 3.3V
เท่านั้น แต่แรงดันไฟฟ้าจาก TX หรือ Arduino จะเป็น 5V

ดังนั้นจึงใช้เครือข่ายเครื่องแบ่งแรงดันไฟฟ้าประกอบด้วยตัวต้านทานแบบ 10K และ 20K
เพื่อลดแรงดันไฟฟ้าลงเหลือ 3.3V







รีเลย์ : ( OUTPUT )


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

โดยทั่วไปรีเลย์ประกอบด้วยขั้ว 5 ขั้ว: ขดลวดขั้วสองขั้วขั้วสามัญ (COMM) เทอร์มินัลที่เปิดอยู่ตามปกติ (NO) และขั้วต่อปิดปกติ (NC)

สัญญาณไฟต่ำจากไมโครคอนโทรลเลอร์จะให้กับขดลวด (โดยปกติจะผ่านทรานซิสเตอร์) และอีก 3 ขั้วคือ NO, NC และ COMM จะเชื่อมต่อกับแหล่งจ่ายไฟแรงสูงพร้อมกับโหลด ข้อมูลเพิ่มเติมเกี่ยวกับการถ่ายทอดและการทำงานของตน  

 ขั้นตอนต่อไปคือการเชื่อมต่อขา I / O ดิจิตอลของ Arduino เข้ากับบอร์ดรีเลย์เชื่อมต่อกับ Pin 9, 10, 11, 12  ของ Arduino)



ซอฟต์แวร์






#include <SoftwareSerial.h>   เรียกใช้ฟังก์ชั่น Bluetooth

  const int rxPin = 4;     Rx PIN  ขา4
     const int txPin = 2;      TX PIN  ขา2        

SoftwareSerial mySerial(rxPin, txPin);       กำหนดค่าลงใน Library Bluetooth

   const int Loads[] = {9, 10, 11, 12};         กำหนด ตัวแปร รีเรย์

     int state = 0;              ตัวแปร State = 0
int flag = 0;                   ตัวแปร Flag = 0

ฟังก์ชั่น พิเศษ

##########################################################################

void setup()
                      {
           for (int i=0;i<4;i++)            ถ้า int เท่ากับ0และน้อยกว่า4 ให้ i+ไปเรื่อยๆ
    {
       pinMode(Loads[i], OUTPUT);          ให้ Load โดยเกHบค่าตัวแปรอาเรย์ i เป็น OUTPUT
    }
     mySerial.begin(9600);           แสดงผล ออกทาง Serial Moniter 9600
   for (int i=0;i<4;i++)                                     ถ้า int เท่ากับ0และน้อยกว่า4 ให้ i+ไปเรื่อยๆ
    {
            digitalWrite(Loads[i], LOW);        ให้Load iเป็นสถานะ ต่ำ
    }
 
}

void loop()
                           {
   
           if(mySerial.available() > 0)             ถ้า MySerial.available() มากกว่า 0
    {
        state = mySerial.read();             State คือ อ่านค่า
      flag=0;                                                Flag คือ 0
    }
   
      switch(state)                        การตรวจสอบตัวแปรว่ามีค่าเท่ากับ case ใด ถ้าตรง                                                                           กับ case ใดก็จะทำงาน
    {
          case '0':digitalWrite(Loads[0], HIGH);            Case 0 แสดงค่า Load อาเรย์ 0  เป็น สูง
               flag=1;                                                   flag เท่ากับ 1
                  break;                                                          หยุดการทำงาน
        case '1':digitalWrite(Loads[0], LOW);        Case1 แสดงค่า Load อาเรย์ 0  เป็น ต่ำ
               flag=1;                                                        flag เท่ากับ 1
                 break;                                                         หยุดการทำงาน
        case '2':digitalWrite(Loads[1], HIGH);          Case2 แสดงค่า Load อาเรย์ 1  เป็น สูง
               flag=1;                                                         flag เท่ากับ 1
                  break;                                                          หยุดการทำงาน
        case '3':digitalWrite(Loads[1], LOW);       Case 3 แสดงค่า Load อาเรย์ 1  เป็น ต่ำ
               flag=1;                                                         flag เท่ากับ 1
                  break;                                                          หยุดการทำงาน
         case '4':digitalWrite(Loads[2], HIGH);       Case 4 แสดงค่า Load อาเรย์ 2  เป็น สูง
               flag=1;                                                         flag เท่ากับ 1
                  break;                                                           หยุดการทำงาน
      case '5':digitalWrite(Loads[2], LOW);        Case 5 แสดงค่า Load อาเรย์ 2  เป็น ต่ำ
                 flag=1;                                                         flag เท่ากับ 1
               break;                                                           หยุดการทำงาน
      case '6':digitalWrite(Loads[3], HIGH);       Case 6 แสดงค่า Load อาเรย์ 3  เป็น สูง
               flag=1;                                                         flag เท่ากับ 1
                  break;                                                           หยุดการทำงาน
      case '7':digitalWrite(Loads[3], LOW);        Case 7 แสดงค่า Load อาเรย์ 3  เป็น ต่ำ
               flag=1;                                                          flag เท่ากับ 1
                   break;                                                            หยุดการทำงาน
        case '8':digitalWrite(Loads[0], LOW);             Case 8 แสดงค่า Load อาเรย์ 0  เป็น ต่ำ
                   digitalWrite(Loads[1], LOW);                      แสดงค่า Load อาเรย์ 1 เป็น สถานะ ต่ำ
                 digitalWrite(Loads[2], LOW);                แสดงค่า Load อาเรย์ 2 เป็น สถานะ ต่ำ
               digitalWrite(Loads[3], LOW);                      แสดงค่า Load อาเรย์ 3 เป็น สถานะ ต่ำ

                  flag=1;            flag เท่ากับ 1
               break;              หยุดการทำงาน
                                                                      }
}







Flowchart








งานที่ 5

การบริหารงานคุณภาพเทคโนโลยีและสารสนเทศคือ   ISO 9001-2000  ในด้านคุณภาพการผลิตและบริการ ซึ่งเป็นมาตราฐานสากลที่องค์กรธุรกิจทั่วโลกให้คว...