Arduino Ohmmeter

Von Patrick Kaiser



Nachdem das Buch zum Arduino-Lernpaket ja schon einige Anregungen zum Messen von Spannungen, Kapazitäten, Temperaturen usw. gegeben hat, ist ein Ohmmeter ja geradezu überfällig. Die Schaltung dazu ist denkbar einfach:



Der Gesamtwiderstand (R1+R2) zwischen "5V" und "GND" sollte nicht kleiner als 125 Ohm sein, denn dann würden mehr als 40 mA fließen (R = U/I; 5 V / 40 mA = 125 Ohm). 40 mA ist allgemein die "magische" Grenze, was die Belastbarkeit der Pins angeht.

Da der 5-V-Pin nicht irgendein Pin ist, handelt es sich hier um einen Spezialfall und er dürfte auf über 500 mA belastet werden. Man sollte das trotzdem lassen, weil der USB-Port nur maximal 500 mA - manchmal auch weniger- hergibt, weil die mitgelieferten Widerstände typischerweise nur 0,25 Watt an Wärme abführen können und weil die Spannung dabei einbricht und das Ergebnis verfälscht)

Die Messgenauigkeit hängt von vielen Faktoren wie der Spannung des USB-Ports, der Genauigkeit des Referenzwiderstands und dem Verhältnis zum zu messenden Widerstand ab. Die Schaltung beruht auf einem Spannungsteiler (Wikipedia-Link hier). Die Spannung, die am Analogpin anliegt, hängt vom Verhältnis der Widerstände zueinander ab. Kennt man nun den Wert eines Widerstandes und weiß man von einem der Widerstände, wieviel Spannung daran abfällt, kann man das Verhältnis berechnen. Über das Verhältnis kann man wiederum auf den Wert des gefragten Widerstandes schließen:

// Widerstände messen

// _____
// -|_R1__|- VCC
//AnalogPin -' _____
// '-|_R2__|- GND

// R2 = zu messender Widerstand

float Quellspannung=5.0;
int AnalogPin=5;
int R1=1500.0; //Wert des bekannten Widerstands (der mitgelieferte 1,5k-Widerstand)
long Messwert;
float SpannungR2; //Spannung über dem zu messenden Widerstand
float Widerstand;

void setup()
{
Serial.begin(9600);
Serial.println("Widerstand ausmessen");
Serial.println();
}

void loop()
{
//5 Messungen machen und Mittelwert bilden
Messwert=0;
for(int i=0;i<5;i++){
Messwert+=analogRead(AnalogPin);
}
Messwert=trunc(Messwert/5);

//Spannung berechnen
SpannungR2=(Quellspannung/1023.0)*Messwert;
Serial.print("Spannung ueber R2 betraegt ");
Serial.print(SpannungR2,2);
Serial.println(" Volt!");
//Berechnung: (R2 = R1 * (U2/U1))
Widerstand=R1*(SpannungR2/(Quellspannung-SpannungR2));
Serial.print("Der Widerstand hat ");
Serial.print(Widerstand,2);
Serial.println(" Ohm.");
Serial.println();
delay(1000);
}

Download p_widerstand.zip

Wie man sehen kann, ist R1 eine Variable in der der Wert des Referenzwiderstands eingetragen ist. Für präzisere Messungen sollte der Referenzwiderstand in der Größenordnung des zu messenden Widerstands liegen. Oft reicht aber auch die weniger präzise Angabe und etwas Wissen über die E-Reihen (http://de.wikipedia.org/wiki/E-Reihe) der Widerstände um deren Werte zu erahnen, auch ohne die Farbringe (http://de.wikipedia.org/wiki/Widerstand_(Bauelement)) lesen zu können.

Wenn man die Versorgungsspannung seines Arduino genau kennt, kann man diese in der Variablen Quellspannung eintragen und erhält ein "richtigeres Ergebnis" seiner Messungen. Das Programm kann mit dem IDE-internen "Serial Monitor" und 9600 Baud benutzt werden, dann gibt es jede Sekunde die Spannung am Analog-Pin und den daraus errechneten Widerstand aus. Über Anregungen, Kritik oder eine Erweiterung um eine Normierung an die E-Reihe mit optionalem Farbcode würde ich mich sehr freuen! :-)



PWM-Steuerung von Nuur Haq

Ich möchte mich für den Beitrag bedanken. Ich habe Teile von dem Code in meinem Code verwendet, und es hat funktioniert.  In meiner Schaltung geht es um eine LED, die gedimmt werden soll. Jedoch sollen PWM-Werte erst dann an den LED gesendet werden wenn an dem Poti gedreht wird. Komponenten:  Arduino, Poti, LED


int ledPin = 9;      // LED an Pin nr 9 
int analogPin = 5; // potentiometer an analogPin1
float pwmOLD = 0; // variable
float pwmNEW = 0; // variable

void setup()
{
pinMode(ledPin, OUTPUT); // Pin 9 als ausgang
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop()
{
pwmNEW=0;
for(int i=0;i<100;i++)
{

pwmNEW+=(analogRead(analogPin)/4);
}
pwmNEW=trunc(pwmNEW/100);

if (pwmNEW != pwmOLD) // verleicht die Werte valNEW und valOLD
{
analogWrite(ledPin, pwmNEW); // PWM-Signal wird an LED-Pin gesendet
Serial.print(" PWM-Signal:");
Serial.println(pwmNEW); //PWM-Signal kann man an den serial-Monitor sehen
pwmOLD = pwmNEW; // valNEW wird zu valOLD gemacht und wird für den nächsten Loop-durchgang gespecihert
}
Serial.print("Analogsignal:");
Serial.println(analogRead(analogPin));
delay(100);
}


zurück