- สิ่งที่ควรจำก่อนเริ่ม
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การตั้งค่าเซิร์ฟเวอร์ SMTP2GO สำหรับการส่งอีเมล
- การเขียนโปรแกรมไมโครคอนโทรลเลอร์ AVR Atmega16 และ ESP8266
- การเขียนโปรแกรม ATmega16 สำหรับการส่งอีเมล
- การเขียนโปรแกรม ESP8266 NodeMCU
Atmega16 เป็นไมโครคอนโทรลเลอร์ 8 บิตราคาประหยัดและมาพร้อมกับจำนวน GPIO มากกว่าไมโครคอนโทรลเลอร์รุ่นก่อนหน้า มีโปรโตคอลการสื่อสารที่ใช้กันทั่วไปเช่น UART, USART, SPI และ I2C มีการใช้งานที่หลากหลายในอุตสาหกรรมหุ่นยนต์รถยนต์และระบบอัตโนมัติเนื่องจากมีการสนับสนุนจากชุมชนที่กว้างขวางและเรียบง่าย
Atmega16 ไม่รองรับโปรโตคอลการสื่อสารไร้สายใด ๆเช่น Wi-Fi และ Bluetooth ซึ่ง จำกัด พื้นที่แอปพลิเคชันในโดเมนเช่น IoT เพื่อเอาชนะข้อ จำกัด นี้สามารถเชื่อมต่อคอนโทรลเลอร์อื่น ๆ ซึ่งมีโปรโตคอลไร้สายได้ มีคอนโทรลเลอร์จำนวนมากที่รองรับโปรโตคอลไร้สายเช่น ESP8266 ที่ใช้กันอย่างแพร่หลาย
วันนี้เราจะเชื่อมต่อ Atmega16 กับ ESP8266 NodeMCUเพื่อให้สื่อสารแบบไร้สายผ่านอินเทอร์เน็ต ESP8266 NodeMCUเป็นโมดูล WiFi ที่ใช้กันอย่างแพร่หลายพร้อมการสนับสนุนจากชุมชนและไลบรารีที่ใช้ได้อย่างง่ายดาย ESP8266 NodeMCU ยังสามารถตั้งโปรแกรมได้อย่างง่ายดายด้วย Arduino IDE ESP8266 สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์:
ในการกวดวิชานี้จะส่งอีเมลโดยใช้โมดูล ESP8266 NodeMCU และ ATmega16 คำแนะนำจะได้รับจาก Atmega16 และเมื่อ ESP8266 ได้รับคำแนะนำระบบจะส่งอีเมลไปยังผู้รับอีเมลที่เลือก ATmega16 และ ESP8266 NodeMCU จะสื่อสารผ่านการสื่อสารแบบอนุกรม UART แม้ว่าโปรโตคอลการสื่อสารใด ๆ สามารถใช้เพื่อเชื่อมต่อกับ ATmega16 และ ESP8266 NodeMCU เช่น SPI, I2C หรือ UART
สิ่งที่ควรจำก่อนเริ่ม
หมายเหตุว่าไมโครคอนโทรลเลอร์ ATmega16 ใช้ในโครงการนี้จะทำงานในระดับตรรกะ 5V ขณะ ESP8266 NodeMCU ทำงานในระดับตรรกะ ระดับตรรกะของไมโครคอนโทรลเลอร์ทั้งสองต่างกันซึ่งอาจทำให้เกิดการสื่อสารผิดพลาดระหว่าง Atmega16 และ ESP8266 NodeMCU หรืออาจทำให้ข้อมูลสูญหายได้หากไม่ได้รักษาระดับตรรกะที่เหมาะสม
อย่างไรก็ตามหลังจากอ่านแผ่นข้อมูลของไมโครคอนโทรลเลอร์ทั้งสองแล้วเราพบว่าเราสามารถเชื่อมต่อได้โดยไม่ต้องเปลี่ยนระดับลอจิกเนื่องจากพินทั้งหมดของ ESP8266 NodeMCU สามารถทนได้ตั้งแต่ระดับแรงดันไฟฟ้าถึง 6V ดังนั้นจึงเป็นการดีที่จะดำเนินการต่อด้วยระดับลอจิก 5V นอกจากนี้เอกสารข้อมูลของ Atmega16 ยังระบุอย่างชัดเจนว่าระดับแรงดันไฟฟ้าที่สูงกว่า 2V ถือเป็นระดับลอจิก '1' และ ESP8266 NodeMCU ทำงานบน 3.3 V หมายความว่าถ้า ESP8266 NodeMCU กำลังส่ง 3.3V จากนั้น Atmega16 สามารถรับเป็นระดับลอจิก '1' ได้ ดังนั้นการสื่อสารจะเป็นไปได้โดยไม่ต้องใช้การเลื่อนระดับตรรกะ แม้ว่าคุณจะมีอิสระในการใช้ตัวเปลี่ยนระดับลอจิกตั้งแต่ 5 ถึง 3.3V
ตรวจสอบโครงการที่เกี่ยวข้องกับ ESP8266 ทั้งหมดที่นี่
ส่วนประกอบที่จำเป็น
- ESP8266 โมดูล NodeMCU
- Atmega16 ไมโครคอนโทรลเลอร์ IC
- 16Mhz คริสตัลออสซิลเลเตอร์
- ตัวเก็บประจุ 100nF สองตัว
- ตัวเก็บประจุ 22pF สองตัว
- ปุ่มกด
- สายจัมเปอร์
- เขียงหั่นขนม
- USBASP v2.0
- LED (สีใดก็ได้)
แผนภูมิวงจรรวม
การตั้งค่าเซิร์ฟเวอร์ SMTP2GO สำหรับการส่งอีเมล
ก่อนเริ่มการเขียนโปรแกรมเราจำเป็นต้องมีเซิร์ฟเวอร์ SMTP เพื่อส่งอีเมลผ่าน ESP8266 มีเซิร์ฟเวอร์ SMTP มากมายทางออนไลน์ นี่smtp2go.com จะถูกใช้เป็นเซิร์ฟเวอร์
ดังนั้นก่อนที่จะเขียนโค้ดจำเป็นต้องมีชื่อผู้ใช้และรหัสผ่าน SMTP ในการรับข้อมูลรับรองทั้งสองนี้ให้ทำตามขั้นตอนด้านล่างซึ่งครอบคลุมถึงการตั้งค่าเซิร์ฟเวอร์ SMTP เพื่อให้ส่งอีเมลได้สำเร็จ
ขั้นตอนที่ 1: -คลิกที่“ ทดลองใช้ SMTP2GO ฟรี” เพื่อลงทะเบียนด้วยบัญชีฟรี
ขั้นตอนที่ 2: -หน้าต่างจะปรากฏขึ้นซึ่งคุณต้องป้อนข้อมูลรับรองบางอย่างเช่นชื่อรหัสอีเมลและรหัสผ่าน
ขั้นตอนที่ 3: -หลังจากลงทะเบียนคุณจะได้รับคำขอเปิดใช้งานในอีเมลที่ป้อน เปิดใช้งานบัญชีของคุณจากลิงก์ยืนยันในอีเมลจากนั้นเข้าสู่ระบบโดยใช้รหัสอีเมลและรหัสผ่านของคุณ
ขั้นตอนที่ 4: -เมื่อคุณเข้าสู่ระบบคุณจะได้รับชื่อผู้ใช้ SMTP และรหัสผ่าน SMTP จดจำหรือคัดลอกสิ่งเหล่านี้ไปยังแผ่นจดบันทึกเพื่อใช้งานต่อไป หลังจากนี้คลิกที่ 'เสร็จสิ้น'
ขั้นตอนที่ 5: -ในแถบการเข้าถึงด้านซ้ายคลิกที่ "การตั้งค่า" จากนั้นคลิกที่ "ผู้ใช้" คุณสามารถดูข้อมูลเกี่ยวกับเซิร์ฟเวอร์ SMTP และหมายเลขพอร์ตได้ที่นี่ โดยปกติจะเป็นดังนี้:
เข้ารหัสชื่อผู้ใช้และรหัสผ่าน
ตอนนี้เราต้องเปลี่ยนชื่อผู้ใช้และรหัสผ่านในรูปแบบที่เข้ารหัส base64 ด้วยชุดอักขระ ASCII สำหรับการแปลงอีเมลและรหัสผ่านในรูปแบบเข้ารหัส base64 ให้ใช้เว็บไซต์ชื่อ BASE64ENCODE (https://www.base64encode.org/) คัดลอกชื่อผู้ใช้และรหัสผ่านที่เข้ารหัสเพื่อใช้งานต่อไป:
หลังจากเสร็จสิ้นขั้นตอนเหล่านี้แล้วให้ดำเนินการเขียนโปรแกรม ESP8266 NodeMCU และ Atmega16 IC
การเขียนโปรแกรมไมโครคอนโทรลเลอร์ AVR Atmega16 และ ESP8266
การเขียนโปรแกรมจะรวมสองโปรแกรมหนึ่งโปรแกรมสำหรับ Atmega16 เพื่อทำหน้าที่เป็นผู้ส่งคำสั่งและโปรแกรมที่สองสำหรับ ESP8266 NodeMCU เพื่อทำหน้าที่รับคำสั่ง โปรแกรมทั้งสองจะได้รับในตอนท้ายของบทช่วยสอนนี้ Arduino IDE ใช้สำหรับเบิร์น ESP8266 และโปรแกรมเมอร์ USBasp และ Atmel Studio ใช้ในการเบิร์น Atmega16
ปุ่มกดเดียวและ LED เชื่อมต่อกับ Atmega16 ดังนั้นเมื่อเรากดปุ่มกด Atmega16 จะส่งคำแนะนำไปยัง NodeMCU และ NodeMCU จะส่งอีเมล LED จะแสดงสถานะของการส่งข้อมูล มาเริ่มการเขียนโปรแกรม Atmega16 จากนั้น ESP8266 NodeMCU
การเขียนโปรแกรม ATmega16 สำหรับการส่งอีเมล
เริ่มต้นด้วยการกำหนดความถี่ในการทำงานและรวมไลบรารีทั้งหมดที่จำเป็น ห้องสมุดที่ใช้มาพร้อมกับ Atmel Studio Package
#define F_CPU 16000000UL # รวม # รวม
หลังจากนี้อัตราการส่งข้อมูลจะต้องมีการกำหนดไว้ในเพื่อสื่อสารกับ ESP8266 โปรดทราบว่าอัตราการรับส่งข้อมูลจะต้องใกล้เคียงกันสำหรับคอนโทรลเลอร์ทั้งสองตัวเช่น Atmega16 และ NodeMCU ในบทช่วยสอนนี้ baudrate คือ 9600
# กำหนด BAUD_PRESCALE ((( F_CPU / (USART_BAUDRATE * 16UL))) - 1)
UBRRL และ UBRRH ทั้งสองลงทะเบียนจะถูกใช้เพื่อโหลดค่าอัตราการรับส่งข้อมูล อัตรารับส่งข้อมูล 8 บิตที่ต่ำกว่าจะโหลดเป็น UBRRL และอัตรารับส่งข้อมูล 8 บิตบนจะโหลดเป็น UBRRH เพื่อความง่ายให้สร้างฟังก์ชันของการเริ่มต้น UARTโดยที่อัตราการส่งข้อมูลจะถูกส่งผ่านไปตามค่า ฟังก์ชันการเริ่มต้น UART จะรวมถึง:
- การตั้งค่าบิตส่งและรับในรีจิสเตอร์ UCSRB
- การเลือกขนาดอักขระ 8 บิตในการลงทะเบียน UCSRC
- การโหลดอัตราการส่งข้อมูลบิตล่างและบนในทะเบียน UBRRL และ UBRRH
เป็นโมฆะ UART_init (USART_BAUDRATE แบบยาว) { UCSRB - = (1 << RXEN) - (1 << TXEN); UCSRC - = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH = (BAUD_PRESCALE >> 8); }
ขั้นตอนต่อไปจะได้รับการตั้งค่าฟังก์ชั่นสำหรับการส่งตัวอักษรขั้นตอนนี้รวมถึงการรอให้บัฟเฟอร์ว่างเสร็จสิ้นจากนั้นโหลดค่าถ่านลงในทะเบียน UDR ถ่านจะถูกส่งผ่านในฟังก์ชันเท่านั้น
เป็นโมฆะ UART_TxChar (ถ่าน c) { ในขณะที่ (! (UCSRA & (1 <
แทนที่จะโอนอักขระให้สร้างฟังก์ชันเพื่อส่งสตริงดังต่อไปนี้
เป็นโมฆะ UART_sendString (ถ่าน * str) { ถ่านที่ไม่ได้ลงนาม s = 0; ในขณะที่ (str! = 0) { UART_TxChar (str); s ++; } }
ในฟังก์ชัน main () ให้เรียกใช้ UART_init () เพื่อเริ่มการส่งข้อมูล และทำแบบทดสอบสะท้อนโดยการส่งสตริงทดสอบเพื่อ NodeMCU
UART_init (9600); UART_sendString ("ทดสอบ");
เริ่มกำหนดค่าพิน GPIO สำหรับ LED และปุ่มกด
DDRA - = (1 << 0); DDRA & = ~ (1 << 1); ปอร์ตา - = (1 << 1);
หากไม่ได้กดปุ่มกดไฟ LED จะเปิดค้างไว้และหากกดปุ่มกดแล้วเริ่มส่งคำสั่ง“ ส่ง”ไปยัง NodeMCU และทำให้ LED ปิด
ถ้า (bit_is_clear (PINA, 1)) { PORTA - = (1 << 0); _delay_ms (20); } else { PORTA & = ~ (1 << 0); _delay_ms (50); UART_sendString ("ส่ง"); _delay_ms (1200); }
การเขียนโปรแกรม ESP8266 NodeMCU
การเขียนโปรแกรม NodeMCU รวมถึงการรับคำสั่งจาก Atmega16 และการส่งอีเมลโดยใช้เซิร์ฟเวอร์ SMTP เดียว
ประการแรกรวมไลบรารี WIFIเนื่องจากอินเทอร์เน็ตจะใช้ในการส่งอีเมล กำหนด SSID และรหัสผ่าน WIFI ของคุณสำหรับการเชื่อมต่อที่ประสบความสำเร็จ กำหนดเซิร์ฟเวอร์ SMTP ด้วย
# รวม
ในฟังก์ชั่น การตั้งค่า () ตั้งค่าอัตราการส่งข้อมูลให้ใกล้เคียงกับอัตราการส่งข้อมูล Atmega16 เป็น 9600 และเชื่อมต่อกับ WIFI และแสดงที่อยู่ IP
Serial.begin (9600); Serial.print ("เชื่อมต่อกับ:"); Serial.println (ssid); WiFi.begin (ssid รหัสผ่าน); ในขณะที่ (WiFi.status ()! = WL_CONNECTED) { ล่าช้า (500); Serial.print ("."); }
ในฟังก์ชัน loop () อ่านไบต์ที่รับที่พิน Rxและแปลงเป็นรูปแบบสตริง
ถ้า (Serial.available ()> 0) { ในขณะที่ (Serial.available ()> 0 && index1 <6) { delay (100); inChar = Serial.read (); inData = inChar; ดัชนี 1 ++; inData = '\ 0'; } variable.toUpperCase (); สำหรับ (byte i = 0; i <6; i ++) { variable.concat (String (inData)); } Serial.print ("ตัวแปรคือ ="); Serial.println (ตัวแปร); Serial.print ("indata คือ ="); Serial.println (inData); ล่าช้า (20); } String string = String (ตัวแปร);
หากคำสั่งรับตรงกันให้ส่งอีเมลไปยังผู้รับโดยเรียกฟังก์ชันsendEmail ()
ถ้า (สตริง == "ส่ง") { sendEmail (); Serial.print ("จดหมายส่งถึง:"); Serial.println ("ผู้รับ"); Serial.println (""); }
การตั้งค่าเซิร์ฟเวอร์ SMTP เป็นสิ่งสำคัญมากและหากไม่ทำเช่นนี้จะไม่สามารถส่งอีเมลได้ โปรดทราบว่าในขณะที่สื่อสารให้ตั้งค่าอัตราการส่งข้อมูลให้ใกล้เคียงกันสำหรับตัวควบคุมทั้งสองตัว
ดังนั้นนี้เป็นวิธีที่ ESP8266 สามารถเชื่อมต่อกับ AVR ไมโครคอนโทรลเลอร์เพื่อเปิดใช้งานสำหรับการสื่อสาร ตรวจสอบวิดีโอการทำงานที่ระบุด้านล่าง