PZEM-004T V3.3
PZEM-004T V3.3
PZEM-004T เป็นโมดูลวัดค่าต่างๆของไฟฟ้ากระเเสสลับ ได้เเก่ เเรงไฟฟ้า, กระแสไฟฟ้า, กำลังไฟฟ้า, ความถี่, เเละพลังงานที่ใช้งาน โมดูลไม่มีฟังก์ชั่น การเเสดงผล, ข้อมูลถูกอ่านออกจากโมดูลผ่านการเชื่อมต่อแบบอนุกรมระดับสัญญาน TTL
รูปที่ 1 PZEM-004T
คุณสมบัติ
- ใช้วัดแรงดันไฟฟ้าของไฟบ้าน วัดค่ากระแสไฟฟ้าของอุปกรณ์ไฟฟ้าที่ใช้ วัดค่ากำลังไฟฟ้า และวัดค่ากำลังไฟฟ้าต่อชั่วโมง (Wh)
- วัดค่าแรงดันไฟฟ้าได้ 80 - 260VAC และวัดค่ากระแสไฟฟ้าได้ 0 - 100A ทำงานได้ที่ความถี่ 45 - 65Hz
- แยกไฟสูงออกจากไฟต่ำด้วยออปโต้ ทำให้เมื่อใช้กับไมโครคอนโทรลเลอร์แล้วไม่เสี่ยงโดนไฟดูด
- วัดค่ากระแสไฟฟ้าด้วย CT Current Transformer
- สื่อสารกับไมโครคอนโทรลเลอร์ด้วย UART (หรือ Serial)
- สอบเทียบความถูกต้องการวัด จากโรงงานแล้ว
การเชื่อมต่อ PZEM-004T
รูปที่ 2
คำสั่งควบคุมการทำงาน
รูปแบบคำสั่งอ่านผลการวัดมีขนาด 8 ไบต์ จัดเรียงดังนี้
Slave Address + 0x04 + Register Address High Byte + Register Address Low Byte + Number
of Registers High Byte + Number of Registers Low Byte + CRC Check High Byte + CRC Check Low Byte
การตอบกลับจากอุปกรณ์ PZEM-004T แบ่งออกเป็นสองประเภท:
1.คำตอบที่ถูกต้องประกอบด้วยข้อมูลต่างๆ ดังนี้
:Slave Address + 0x04 + Number of Byte + Register 1 Data High Byte + Register 1 Data Low Byte + ... + CRC Check High Byte + CRC Check Low Byte
2.Error Reply: Slave Address + 0x84 + Abnormal code + CRC Check High Byte + CRC Check Low Byte
วิเคราะห์โค้ดผิดปกติดังนี้ (อันล่าง)
● 0x01 ฟังก์ชันไม่ถูกต้อง
● 0x02 Address ไม่ถูกต้อง
● 0x03 ข้อมูลไม่ถูกต้อง
● 0x04 ข้อผิดผลาดกับโมดูล PZEM-004T
การลงทะเบียนของผลการวัดถูกจัดเรียงตามตารางต่อไปนี้
Register Address Descripption Resolution0x0000 Voltage value 1LSB สอดคล้องกับ 0.1V
0x0002 ค่ากระเเสไฟฟ้าไบต์สูง 16 บิต 1LSB สอดคล้องกับ 0.001A
0x0003 ค่าพลังงานต่ำ 16 บิต 1LSB สอดคล้องกับ 0.1W
0x0004 ค่าพลังงานสูง 16 บิต 1LSB สอดคล้องกับ 0.1W
0x0005 ค่าพลังงานต่ำ 16 บิต 1LSB สอดคล้องกับ 1Wh
0x0006 ค่าพลังงานสูง 16 บิต 1LSB สอดคล้องกับ 1Wh
0x0007 ค่าความถี่ 1LSB สอดคล้องกับ 0.1Hz
0x0008 Power factor value 1LSB สอดคล้องกับ 0.01
0x0009 สถานะเเจ้งเตือน 0xFFFF เป็นสัญญาณเตือภัย,
0x0000 ไม่ใช่สัญญาณเตือน
โมดูลนี้มีอินเทอร์เฟซการสื่อสารข้อมูลอนุกรม TTL ผ่านทางพอร์ตอนุกรม ซึ่งคุณสามารถอ่านและตั้งค่าพารามิเตอร์ที่เกี่ยวข้องได้ แม้ว่าหากคุณต้องการให้อุปกรณ์ที่มี USB หรือ RS232 (เช่น คอมพิวเตอร์) สื่อสารได้ คุณจะต้องติดตั้งบอร์ดฮาร์ดแวร์อะแดปเตอร์ TTL อื่น รายละเอียดสามารถพบได้ใรูปที่ 3
รูปที่ 3
หมายเหตุสำคัญ:
1. โมดูลนี้เหมาะสำหรับใช้ในร่มไม่ใช่กลางแจ้ง
2. โหลดที่ใช้ไม่ควรเกินกำลังที่กำหนด
3. การเดินสายไม่ผิด
4. บอร์ดต้องเชื่อมต่อกับไฟ AC เนื่องจาก 5V DC จะจ่ายไฟให้กับลอจิก TTL เท่านั้น
รูปที่ 4
หากคุณใช้โมดูลแหล่งจ่ายไฟ HI-LINK ให้เชื่อมต่อเอาต์พุต Vcc +5V กับพิน Vin หากไม่ใช่ คุณควรใช้แหล่งจ่ายไฟอื่นที่มีอัตราเท่ากัน RX และ TX จาก PZEM004T ไปที่ GPIO pin 4 (D2) และ GPIO pin 5 (D1) พิน GPIO ก่อนหน้าไม่ใช่พินการสื่อสารแบบอนุกรม แม้ว่าเราจะใช้พวกมันเช่นนี้ แม้ว่าจะมีโค้ดบางตัว เชื่อมต่อหม้อแปลงกระแส (CT) และสายไฟ AC แบบขนานกับโหลด ต้องระวังเดินสายด้าน AC ดังแสดงในรูปที่ 4
อันตราย: ปิดการติดตั้งหลัก AC ก่อนเชื่อมต่อบางสิ่ง ตรวจสอบให้แน่ใจว่าได้ถอดปลั๊กทุกอย่างออกจากไฟหลักแล้ว ข้อผิดพลาดอาจทำให้เกิดไฟฟ้าช็อตได้
การเข้ารหัส
เราจะใช้ห้องสมุดจากGit-Hubที่สื่อสารกับ PZEM004T หากคุณไม่ทราบวิธีติดตั้งไลบรารีหรือใช้ตัวจัดการไลบรารีใน Arduino IDE คุณสามารถตรวจสอบInstalling Additional Arduino Librariesได้ คัดลอกภาพร่างหลักด้านล่างไปยังโครงการ Arduino IDE ของคุณและบันทึก
หากต้องการ คุณสามารถใช้แผง PZEM004T สามแผง และสร้างเครื่องวัดพลังงาน 3 เฟสได้ เพียงแค่ต้องเลือกอีก 4 พินเพื่อทำการสื่อสารซีเรียลและรวมซอฟต์แวร์ซีเรียลอีก 2 ชุดไว้ในโค้ด
หมายเหตุ: NodeMCU มีพอร์ตอนุกรมเดียวเท่านั้น ด้วยเหตุนี้เราจึงต้องใช้ซอฟต์แวร์ซีเรียลเพื่อป้องกันการชนกันขณะดาวน์โหลดโค้ด
/* Use software serial for the PZEM
* Pin 5 Rx (Connects to the Tx pin on the PZEM)
* Pin 4 Tx (Connects to the Rx pin on the PZEM)
*/
PZEM004Tv30 pzem(5, 4);
void setup() {
Serial.begin(9600);
}
void loop() {
float voltage = pzem.voltage();
if( !isnan(voltage) ){
Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
} else {
Serial.println("Error reading voltage");
}
float current = pzem.current();
if( !isnan(current) ){
Serial.print("Current: "); Serial.print(current); Serial.println("A");
} else {
Serial.println("Error reading current");
}
float power = pzem.power();
if( !isnan(power) ){
Serial.print("Power: "); Serial.print(power); Serial.println("W");
} else {
Serial.println("Error reading power");
}
float energy = pzem.energy();
if( !isnan(energy) ){
Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
} else {
Serial.println("Error reading energy");
}
float frequency = pzem.frequency();
if( !isnan(frequency) ){
Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
} else {
Serial.println("Error reading frequency");
}
float pf = pzem.pf();
if( !isnan(pf) ){
Serial.print("PF: "); Serial.println(pf);
} else {
Serial.println("Error reading power factor");
}
Serial.println();
delay(2000);
}
ความคิดเห็น
แสดงความคิดเห็น