// Oksygen_Maaling inkluderer kalibrering og måling av temperatur // Programmet bygger på programmet fra DFRobot: // https://wiki.dfrobot.com/Gravity__Analog_Dissolved_Oxygen_Sensor_SKU_SEN0237#More // men er skrevet om for å passe bedre for MKR NB 1500 // Nilos Kr. Rossing 16.12.22 #include #include #include DS18B20 ds(0); //Sensoren er koblet til pinne D0 uint8_t address[] = {40, 250, 31, 218, 4, 0, 0, 52}; uint8_t selected; #define DO_PIN A0 #define VREF 3300 //VREF (mv) #define ADC_RES 4096 //ADC Resolution //Single-point calibration Mode=0 //Two-point calibration Mode=1 #define TWO_POINT_CALIBRATION 0 //Single point calibration needs to be filled CAL1_V and CAL1_T #define CAL1_V 2430 //mv #define CAL1_T 33 //℃ //Two-point calibration needs to be filled CAL2_V and CAL2_T //CAL1 High temperature point, CAL2 Low temperature point #define CAL2_V 1080 //mv #define CAL2_T 12 //℃ const uint16_t DO_Table[41] = { 14460, 14220, 13820, 13440, 13090, 12740, 12420, 12110, 11810, 11530, 11260, 11010, 10770, 10530, 10300, 10080, 9860, 9660, 9460, 9270, 9080, 8900, 8730, 8570, 8410, 8250, 8110, 7960, 7820, 7690, 7560, 7430, 7300, 7180, 7070, 6950, 6840, 6730, 6630, 6530, 6410}; uint8_t Temperaturet; uint16_t ADC_Raw; uint16_t ADC_Voltage; uint16_t DO; int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c) { #if TWO_POINT_CALIBRATION == 0 uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35; return (voltage_mv * DO_Table[temperature_c] / V_saturation); #else uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V; return (voltage_mv * DO_Table[temperature_c] / V_saturation); #endif } void setup() { Serial.begin(115200); analogReadResolution(12); // Sett oppløsningen til AD-konverteren 12 bit selected = ds.select(address); Serial.println("Oksygen_Maaling"); } void loop() { Temperaturet = (uint8_t) ds.getTempC(); ADC_Raw = analogRead(DO_PIN); ADC_Voltage = uint32_t(VREF) * ADC_Raw / ADC_RES; Serial.print("Temperaturet:\t" + String(Temperaturet) + "\t"); Serial.print("ADC RAW:\t" + String(ADC_Raw) + "\t"); Serial.print("ADC Voltage:\t" + String(ADC_Voltage) + "\t"); Serial.println("DO:\t" + String(readDO(ADC_Voltage, Temperaturet)) + "\t"); delay(1000); }