/* Multimeter PDM-300-C2 Simulator What: Arduino-Programm zur Simulation des Multimeters und Übertragung der seriellen Messwerte. Why: Wenn man kein PDM-300-C2 Multimeter hat, kann man statt dessen einen Arduino benutzen, um die PC-Empfängerprogramme zu testen. How: Es wird eine analoger Eingang bemessen und die Daten zum PC übertragen. Das Datenpaket besteht aus 10 Bytes. Die Spannung des Analogeingangs mit einer einmalig gemessenen Referenzspannung berechnet. TBD: use internal Reference 2024-09-20 mchris License: Free Wine License Diskussion: https://www.mikrocontroller.net/topic/571179 https://www.mikrocontroller.net/articles/Multimeter_PDM-300-C2_Analyse Protokoll: Pro Paket werden 10 Bytes vom Multimeter gesendet 0: 0b1101 1100: 0xDC, Präambel 1: 0b1011 1010: 0xBA, Präambel 2: 0b0000 0001: Immer 1, aber Teil der Nutzdaten; Version 1? 3: 0b0001 0110: Modus 4: 0b0000 0100: Exponent (modusbezogen) 5: 0b0000 0000: Unbekannt (Entweder 24-Bit High-Byte des Wertes, oder nur für den OL Indikator/negative Zahlen?) 6: 0b0000 0000: Wert (High-Byte, 16-Bit, vorzeichenbehaftet) 7: 0b0000 0000: Wert (Low-Byte) 8: 0b0000 0000: Prüfsumme 2 bis 7 (High Byte) 9: 0b0001 1011: Prüfsumme 2 bis 7 (Low Byte) Modus 0001 0110: 0x16, DC V 0001 0101: 0x15, AC V 0001 1010: uA (Gleich bei AC/DC uA) 0001 1001: mA (Gleich bei AC/DC mA) 0001 1000: A (Gleich bei AC/DC A) 0001 1100: Diode 0001 1011: Continuity 0000 0011: Squarewave 0001 1101: Resistance Exponent Volt DC: 0000 0010: 0x02, mV DC [000.0] E-1 0000 0100: 0x04 V DC [0.000] E-3, schreibt man 1234 wird 1.234V angezeigt 0000 1000: V DC [00.00] E-2 0001 0000: V DC [000.0] E-1 0010 0000: V DC [0000.] E-0 */ #define IDX_MODUS 3 #define IDX_EXPONENT 4 #define IDX_MESSWERT_HIGH 6 #define IDX_MESSWERT_LOW 7 #define IDX_PRUEFSUMME_HIGH 8 #define IDX_PRUEFSUMME_LOW 9 #define MODUS_DCV 0x16 uint8_t Data[] = { 0xDC, 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void setup() { Serial.begin(2400); Data[IDX_MODUS] = MODUS_DCV; //Data[IDX_EXPONENT] = 2; // E-1, mV Data[IDX_EXPONENT] = 4; // E-3, V } void writeValue(uint16_t value) { uint16_t prsum = 0; Data[IDX_MESSWERT_HIGH] = (value >> 8) & 0xFF; Data[IDX_MESSWERT_LOW] = value & 0xFF; // calc Pruefsumme for (uint8_t n = 2; n < 8; n++) prsum += Data[n]; Data[IDX_PRUEFSUMME_HIGH] = (prsum >> 8) & 0xFF; Data[IDX_PRUEFSUMME_LOW] = prsum & 0xFF; for (uint8_t n = 0; n < 10; n++) { Serial.write(Data[n]); } } void loop() { float u_V; float u_mV; float uRef_V=4.64; // gemessen am +5V Pin des Arduino Nano, kann variieren u_V=float(analogRead(A0)/1024.0*uRef_V); u_mV=u_V*1000; writeValue(u_mV); delay(1000); }