Digitala multimetern shield för Arduino (14 / 17 steg)
Steg 14: DMM-programvaran
Efter framgångsrikt avslutad av tidigare tester, skrevs den huvudsakliga fungerande DMM-programvaran.
Koden är kopplad i den *. ZIP-fil.
Jag kommer att förklara bara några huvudfunktioner, den andra helt enkelt upprepa dem:
Funktionen för voltmeter (range 0-100 v):
void V_100() {
digitalWrite (v100, hög);
LCD.Clear();
LCD.Print ("V-meter V = < 100 v");
Serial.println ("* Voltmeter läge - Range 0 - 100 V *");
lcd.setCursor (0, 1);
voltage_meas();
}
skriver ut vissa meddelanden på skärmen och anropar funktionen voltage_meas():
void voltage_meas() {
acc_value = 0;
för (int jag = 0; jag < = 15; i ++) {
curr_value = analogRead(A0);
acc_value = acc_value + curr_value;
}
curr_value = int(acc_value/16);
om (curr_value == 1023) {
meas_overflow(); }
annat {
Växla (läge) {
fall 1:
disp_res = (curr_value * leverera * 20) / 1024 * coeff_v100;
bryta;
fall 2:
disp_res = (curr_value * leverera * 6) / 1024 * coeff_v30;
bryta;
fall 3:
disp_res = (curr_value * leverera * 2) / 1024 * coeff_v10;
bryta; }
LCD.Print ("V =");
LCD.Print (disp_res, 2);
LCD.Print ("V");
Serial.Print ("* V =");
Serial.Print (disp_res, 2);
Serial.println ("V");
Delay(250);
}
}
, som ta 16 på varandra följande prover och
i genomsnitt dem. Om resultatet är mindre än 1023, konverterar ADC ordet till motsvarande spänning värde och visar den på skärmen. Vid denna beräkning läggs några trimning faktorer. Första av dem är uppmätta preliminära matningsspänningen (det används som referens för AD omvandling), den andra en försöker rätta till skillnaden i enheter. Det är nära till 1.00, men i vissa fall kan skilja sig åt några procent. Denna koefficient bestäms empiriskt under trim. Förklaring kommer att följa.
Om resultatet efter genomsnitt av de 16 proverna är 1023 kallas "meas_overflow".
void meas_overflow() {
lcd.setCursor (0, 1);
LCD.Print ("OVERFLOW!");
Serial.println ("* svämma över! *");
lcd.setCursor (0, 1);
för (int jag = 0; jag < = 101; i ++) {
analogWrite (back_light, ljusstyrka);
ljusstyrka = ljusstyrka + fadeAmount;
om (ljusstyrka == 255) {
fadeAmount = - fadeAmount;
}
Delay(15);
}
}
I den här proceduren back-ljuset är bleka och visas en varning.
På bilderna kan vara sett den fungerande DMM i olika lägen och funktioner.
P.S. Tack till jfrontone, har vi hittat ett möjligt problem i koden.
Det är i det button_pressed() förfarandet.
om tillväxten läge = läge ++; inte fungerar (ibland beroende på mikrokontroller chip eller på IDE-version), du kan skriva antingen läge = ++ MODE; eller läge = läge + 1; . Hittills ingen har rapporterat om sådana problem i kontrollstrukturen "för" - till exempel för (int jag = 0; jag < = 101; i ++)...