ไลบรารี Arduino ขนาดเล็กสำหรับโมดูล GSM ที่ใช้งานได้
ถ้าคุณชอบ TinyGSM - ให้คะแนนดาวหรือแยกมันแล้วมีส่วนร่วม!
คุณยังสามารถเข้าร่วมการแชทของเรา:
ไลบรารีนี้ง่ายต่อการรวมเข้ากับภาพร่างจำนวนมากที่ใช้อีเธอร์เน็ตหรือ WiFi PubSubClient (MQTT) , Blynk , HTTP Client และตัวอย่าง การดาวน์โหลดไฟล์ มีให้ไว้
ตัวอย่าง WebClient ที่สมบูรณ์สำหรับ Arduino Uno (ผ่าน Software Serial) ใช้ทรัพยากรเพียงเล็กน้อย:
Sketch uses 15022 bytes (46%) of program storage space. Maximum is 32256 bytes.
Global variables use 574 bytes (28%) of dynamic memory, leaving 1474 bytes for local variables. Maximum is 2048 bytes.
ไลบรารี Arduino GSM ใช้ Flash 15868 ไบต์ (49%) และ RAM 1113 ไบต์ (54%) ในสถานการณ์ที่คล้ายกัน TinyGSM ยังดึงข้อมูลเบาๆ จากโมเด็ม (ทุกครั้งที่เป็นไปได้) จึงสามารถทำงานกับ RAM ที่น้อยมากได้ ตอนนี้คุณมีพื้นที่มากขึ้นสำหรับการทดสอบของคุณ
ดู repo นี้เพื่อรับการอัปเดตใหม่! และแน่นอนว่ายินดีต้อนรับการมีส่วนร่วม ;)
การเชื่อมต่อข้อมูล
USSD
เอสเอ็มเอส
การโทรด้วยเสียง
ที่ตั้ง
เครดิต
AT
โดยใช้ภาพร่างนี้ขั้นตอนทั่วไปของโค้ดของคุณควรเป็น:
#define TINY_GSM_MODEM_SIM800
#include
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
หรือ TinyGsmClientSecure client(modem);
(บนโมดูลที่รองรับ)TinyGsmClient clientX(modem, 0);
, TinyGsmClient clientY(modem, 1);
ฯลฯ หรือTinyGsmClientSecure clientX(modem, 0);
, TinyGsmClientSecure clientY(modem, 1);
ฯลฯmodem.init()
หรือ modem.restart()
modem.simUnlock(GSM_PIN)
modem.networkConnect(wifiSSID, wifiPass)
modem.waitForNetwork(600000L)
modem.gprsConnect(apn, gprsUser, gprsPass)
(หรือเพียงแค่ modem.gprsConnect(apn)
)client.connect(server, port)
โมเด็ม GSM, WiFi และโมดูลวิทยุจำนวนมากสามารถควบคุมได้โดยการส่งคำสั่ง AT ผ่านทางซีเรียล TinyGSM รู้ว่าคำสั่งใดที่จะส่ง และวิธีจัดการกับการตอบสนองของ AT และรวมคำสั่งนั้นไว้ในอินเทอร์เฟซไคลเอนต์ Arduino มาตรฐาน
ห้องสมุดนี้กำลัง "ปิดกั้น" ในการสื่อสารทั้งหมด รหัสของคุณอาจถูกบล็อกเป็นเวลานานเพื่อรอการตอบสนองของโมดูล ทั้งนี้ขึ้นอยู่กับฟังก์ชัน นอกเหนือจากที่เห็นได้ชัด (เช่น waitForNetwork()
) ฟังก์ชันอื่นๆ อีกหลายฟังก์ชันอาจบล็อกโค้ดของคุณได้นานถึงหลาย นาที ฟังก์ชัน gprsConnect()
และ client.connect()
มักจะบล็อกฟังก์ชันที่ยาวที่สุด โดยเฉพาะในภูมิภาคบริการที่ด้อยกว่า การปิดโมดูลและการรีสตาร์ทอาจค่อนข้างช้าเช่นกัน
libary นี้ ไม่ รองรับ "ฮาร์ดแวร์" หรือการควบคุมระดับพินสำหรับโมดูล หากคุณต้องการเปิดโมดูลของคุณหรือรีเซ็ตโดยใช้ลำดับพินสูง/ต่ำ/สูง คุณต้องเขียนฟังก์ชันเหล่านั้นด้วยตนเอง
สำหรับสตรีมข้อมูล GPRS ไลบรารีนี้มีอินเทอร์เฟซ Arduino Client มาตรฐาน สำหรับฟังก์ชันเพิ่มเติม โปรดดูตัวอย่างร่างนี้
โมดูลส่วนใหญ่ต้องการกระแส ไฟมากถึง 2A เพื่อเชื่อมต่อกับเครือข่ายอย่างเหมาะสม นี่คือ 4 เท่าของ USB "มาตรฐาน" ที่จะจัดหา! การปรับปรุงพาวเวอร์ซัพพลายช่วยแก้ปัญหาความเสถียรได้จริงใน หลาย กรณี!
โมดูลส่วนใหญ่สนับสนุนคุณลักษณะ "auto-bauding" บางประเภท โดยที่โมดูลจะพยายามปรับอัตราการรับส่งข้อมูลให้ตรงกับสิ่งที่ได้รับ TinyGSM ยังใช้ฟังก์ชันการรับส่งข้อมูลอัตโนมัติของตัวเอง ( TinyGsmAutoBaud(SerialAT, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);
) แม้ว่าจะมีประโยชน์มากเมื่อเริ่มเชื่อมต่อกับโมดูลและทำการทดสอบ แต่สิ่งเหล่านี้ ไม่ ควรใช้ในโค้ดการผลิตทุกประเภท เมื่อคุณสร้างการสื่อสารกับโมดูลแล้ว ให้ตั้งค่าอัตรารับส่งข้อมูลโดยใช้ฟังก์ชัน setBaud(#)
และยึดตามอัตรานั้น
บางครั้ง (โดยเฉพาะถ้าคุณเล่นด้วยคำสั่ง AT) การกำหนดค่าโมดูลของคุณอาจไม่ถูกต้อง ซึ่งอาจส่งผลให้เกิดปัญหาเช่น:
หากต้องการคืนโมดูลเป็น Factory Defaults ให้ใช้ร่างนี้: ไฟล์ -> ตัวอย่าง -> TinyGSM -> เครื่องมือ -> FactoryReset
ในบางกรณี คุณอาจต้องตั้งค่า APN เริ่มต้นเพื่อเชื่อมต่อกับเครือข่ายเซลลูลาร์ ลองใช้ฟังก์ชัน gprsConnect(APN)
เพื่อตั้งค่า APN เริ่มต้น หากคุณไม่สามารถลงทะเบียนบนเครือข่ายได้ คุณอาจต้องตั้งค่า APN อีกครั้งหลังจากลงทะเบียน (ในกรณีส่วนใหญ่ คุณควรตั้งค่า APN หลังจากลงทะเบียน)
การเชื่อมต่อครั้งแรกกับซิมการ์ดใหม่ โมดูลใหม่ หรือที่ตำแหน่ง/หอคอยใหม่อาจใช้เวลา นาน - สูงสุด 15 นาทีหรือมากกว่านั้น โดยเฉพาะอย่างยิ่งหากคุณภาพสัญญาณไม่ดีนัก หากเป็นการต่อเครื่องครั้งแรก คุณอาจต้องปรับเวลารอและอาจไปรับประทานอาหารกลางวันระหว่างที่รอ
หากคุณสามารถเปิดการเชื่อมต่อ TCP ได้แต่ปิดการเชื่อมต่อก่อนที่จะรับข้อมูล ให้ลองเพิ่มส่วนหัว Keep-alive ให้กับคำขอของคุณ โมดูลบางตัว (เช่น SIM7000 ในโหมด SSL) จะทิ้งข้อมูลที่ยังไม่ได้อ่านทันทีเมื่อเซิร์ฟเวอร์ระยะไกลปิดการเชื่อมต่อ - บางครั้งโดยไม่แจ้งเตือนว่าข้อมูลมาถึงตั้งแต่แรกด้วยซ้ำ เมื่อใช้ MQTT เพื่อรักษาการเชื่อมต่ออย่างต่อเนื่อง คุณอาจต้องลดช่วงเวลาการรักษา (PINGREQ/PINGRESP)
ใช้ภาพร่างนี้เพื่อช่วยวินิจฉัยปัญหาการเชื่อมต่อซิมการ์ดและ GPRS: ไฟล์ -> ตัวอย่าง -> TinyGSM -> เครื่องมือ -> การวินิจฉัย
หากการวินิจฉัยล้มเหลว ให้ยกเลิกหมายเหตุบรรทัดนี้เพื่อแสดงความคิดเห็นเกี่ยวกับการดีบักจากไลบรารี:
# define TINY_GSM_DEBUG SerialMon
ในโค้ดที่กำหนดเองใดๆ จะต้องกำหนด TINY_GSM_DEBUG
ก่อนที่จะรวมไลบรารี TinyGSM
หากคุณไม่เห็นข้อผิดพลาดที่ชัดเจนในการดีบักไลบรารี ให้ใช้ StreamDebugger เพื่อคัดลอกลำดับคำสั่ง AT ทั้งหมดไปยังพอร์ตอนุกรมหลัก ในตัวอย่างการวินิจฉัย เพียงยกเลิกการใส่เครื่องหมายบรรทัด:
# define DUMP_AT_COMMANDS
ในโค้ดที่กำหนดเอง คุณสามารถเพิ่มส่วนย่อยนี้ได้:
# ifdef DUMP_AT_COMMANDS
# include < StreamDebugger.h >
StreamDebugger debugger (SerialAT, SerialMon);
TinyGsm modem (debugger);
# else
TinyGsm modem (SerialAT);
# endif
ไลบรารีนี้เปิดการเชื่อมต่อ TCP (หรือ SSL) ไปยังเซิร์ฟเวอร์ ในโมเดล OSI นั่นคือเลเยอร์ 4 (หรือ 5 สำหรับ SSL) HTTP (GET/POST), MQTT และฟังก์ชันอื่นๆ ส่วนใหญ่ที่คุณอาจต้องการใช้งานจริงที่เลเยอร์ 7 ซึ่งหมายความว่าคุณต้องเขียนโค้ดเลเยอร์บนสุดด้วยตนเอง หรือใช้ไลบรารีอื่น (เช่น HTTPClient หรือ PubSubClient) เพื่อทำ มันสำหรับคุณ เครื่องมืออย่าง PostMan ยังแสดงเลเยอร์ 7 ไม่ใช่เลเยอร์ 4/5 เช่น TinyGSM หากคุณเชื่อมต่อกับเซิร์ฟเวอร์ได้สำเร็จ แต่ได้รับการตอบกลับจาก "คำขอไม่ถูกต้อง" (หรือไม่ตอบสนอง) ปัญหาน่าจะอยู่ที่การจัดรูปแบบของคุณ เคล็ดลับในการเขียนเลเยอร์ 7 (โดยเฉพาะคำขอ HTTP) ด้วยตนเองมีดังนี้
client.print("...")
หรือ client.write(buf, #)
หรือแม้แต่ client.write(String("..."))
ไม่ใช่ client.write("...")
ช่วยป้องกันไม่ให้ข้อความถูกส่งออกไปทีละตัวอักษร (รูปแบบเครื่องพิมพ์ดีด)client.print(String( " GET " ) + resource + " HTTP/1.1 rn " );
client.print( " GET " );
client.print(resource);
client.println( " HTTP/1.1 " )
client.print("....rnrn")
หรือใส่ใน client.println()
พิเศษ เมื่อใช้ SoftwareSerial
(บน Uno, Nano ฯลฯ) ความเร็ว 115200 อาจไม่ทำงาน ลองเลือก 57600 , 38400 หรือต่ำกว่านั้น ซึ่งเป็นอันที่เหมาะกับคุณที่สุด ในบางกรณี 9600 จะไม่เสถียร แต่การใช้ 38400 จะช่วยได้ ฯลฯ อย่าลืมตั้งค่าพิน TX/RX ที่ถูกต้องในแบบร่าง โปรดทราบว่าไม่ใช่ทุกพิน Arduino ที่สามารถทำหน้าที่เป็นพิน TX หรือ RX ได้ อ่านเพิ่มเติมเกี่ยวกับตัวเลือกและการกำหนดค่า SoftSerial ที่นี่ และ ที่นี่
เมื่อใช้ ESP32 HardwareSerial
คุณอาจต้องระบุพารามิเตอร์เพิ่มเติมสำหรับการเรียก . .begin()
โปรดดูความคิดเห็นนี้
คุณจะไม่สามารถคอมไพล์ตัวอย่าง HttpClient หรือ HttpsClient ด้วย ESP32 core 1.0.2 ได้ อัปเกรดเป็น 1.0.3 ดาวน์เกรดเป็นเวอร์ชัน 1.0.1 หรือใช้ตัวอย่าง WebClient
เมื่อใช้บอร์ดที่ใช้ SAMD21 คุณอาจจำเป็นต้องใช้พอร์ต sercom uart แทน Serial1
โปรดดูความคิดเห็นนี้
ปรากฎว่า Goouuu Tech IOT-GA6 ไม่เหมือนกับ AI-Thinker A6 ขออภัย IOT-GA6 ยังไม่รองรับตั้งแต่แกะกล่อง มีคำแนะนำบางประการว่าอาจอัปเดตเฟิร์มแวร์ IOT-GA6 ให้ตรงกับ A6... ดูหัวข้อนี้
SIM800 บางเวอร์ชันรองรับ SSL การรองรับ SSL ขึ้นอยู่กับเวอร์ชันของเฟิร์มแวร์และแต่ละโมดูล ผู้ใช้มีระดับความสำเร็จที่แตกต่างกันในการใช้ SSL บน SIM800 แม้ว่าจะมีเฟิร์มแวร์ที่เหมือนกันก็ตาม หากคุณต้องการ SSL และดูเหมือนว่าจะใช้งานไม่ได้กับ SIM800 ของคุณ ให้ลองใช้โมดูลอื่นหรือลองใช้ไลบรารี SSL รอง
รหัส SIM7000 มีสองเวอร์ชัน เวอร์ชันหนึ่งใช้ TINY_GSM_MODEM_SIM7000
และอีกเวอร์ชันใช้ TINY_GSM_MODEM_SIM7000SSL
รุ่น TINY_GSM_MODEM_SIM7000
ไม่รองรับ SSL แต่รองรับการเชื่อมต่อพร้อมกันสูงสุด 8 รายการ รุ่น TINY_GSM_MODEM_SIM7000SSL
รองรับทั้งการเชื่อมต่อ SSL และการเชื่อมต่อที่ไม่ปลอดภัย พร้อมการเชื่อมต่อพร้อมกันสูงสุด 2 รายการ แล้วทำไมถึงมีสองเวอร์ชั่น? เวอร์ชัน "SSL" ใช้คำสั่ง "แอปพลิเคชัน" ของ SIM7000 ในขณะที่อีกเวอร์ชันใช้ "ชุดเครื่องมือ TCP-IP" ขึ้นอยู่กับภูมิภาค/เฟิร์มแวร์ของคุณ อย่างใดอย่างหนึ่งอาจไม่เหมาะกับคุณ ลองทั้งสองอย่างแล้วใช้อันไหนเสถียรกว่ากัน หากคุณไม่ต้องการ SSL ฉันแนะนำให้เริ่มต้นด้วย TINY_GSM_MODEM_SIM7000
โครงการนี้เผยแพร่ภายใต้ GNU Lesser General Public License (LGPL-3.0)