/* Beispielprogramm fuer einfache PT1000-Messung mit einem RP2040 pico. Zur Vermeidung von Eigenerwärmung wird der PT1000 in den Messpausen spannungslos geschaltet (kurzgeschlossen). http://www.mino-elektronik.de Alle Angaben ohne Gewaehr ! 2022-03-22 */ #define OFFSET 16 // 0-Offset des ADCs #define DEF_BAUDRATE 19200 #define ADC_MAX (4095 - OFFSET) // bei 12 Bit #define PT_IN_0 26 // analog Eingang A0 #define UEBERLAUF 9999 // Fehler bei offenem Eingang #define R_PT0 1000.0 // bei 0 Grad C #define R_REF 1000.0 // ext. Widerstand mit 0,1% #define R_ZULEITUNG 0 // bei laengeren Leitungen unbedingt anpassen #define PT_FAKTOR 3.85 // schon mit 1000.0 skaliert int lese_PT1000(int ad_eingang) // liest den ADC-Eingang und rechnet auf Grad Celsius um { int ADC_wert, n; float temperatur, PT_x; pinMode(PT_IN_0, INPUT); // PT1000 freigeben analogRead(ad_eingang); // dummy ADC_wert = analogRead(ad_eingang); // und Kanal messen pinMode(PT_IN_0, OUTPUT); // PT1000 wieder kurzschließen ADC_wert -= OFFSET; Serial1.print("ADC: "); Serial1.print(ADC_wert); Serial1.print(" "); if(ADC_wert < ADC_MAX) { // nur gueltige Werte auswerten PT_x = R_REF * ADC_wert / (ADC_MAX-ADC_wert); // Widerstand ausrechnen PT_x = PT_x - R_PT0 - R_ZULEITUNG; // Offset fuer 0 Grad abziehen temperatur = PT_x / PT_FAKTOR; // und auf Grad C skalieren } else temperatur = UEBERLAUF; // falls PT1000-Zuleitung offen return temperatur; } void setup() { Serial1.begin(DEF_BAUDRATE); analogReadResolution(12); } void loop(void) { do { delay(200); // 0,2 Sekunden warten Serial1.print(lese_PT1000(PT_IN_0)); // per UART ausgeben Serial1.println(" C"); } while(1); // bis auf Weiteres }