Arduino Pro Micro: Zugriff auf A1

Ich habe ein Arduino ProMicro 5V 16MHz Board von Sparkfun.

Ich habe einen 3-Zellen-LiPo, der das Ganze mit Strom versorgt (über den entsprechenden Regler, der ihn auf 5 V herunterbringt). Dies ist Teil eines TriCopter. Ich tippe den positiven 12-V-Pin über einen Spannungsteiler in Pin A1 (wenn der USB nach oben zeigt und die Pins von Ihnen weg, ist dies der 6. Pin von unten rechts).

Wie verweise ich in meinem Programm auf diesen Pin? A1 ist: static const uint8_t A1 = 19U. Dies liest 0V von meiner Batterie.

Mein Code ist wie folgt:

/*
 * Battery Sensor
 * Battery Voltage monitor 
 */
const float ReferenceVoltage = 5;   //default reference on a 5-volt board
const float R1 = 54350;//49200;             //55K2 Ohm resister
const float R2 = 32600;//31000;             //32K6 Ohm resister
const float ResistorFactor = 1023.0*(R2/(R1+R2));
const int BatteryPin = A1;          // V(out) of Voltage devider circuit is attached to analog pin A1


/// <summary>
/// Reads the current Battery voltage
/// </sumary>
void ReadBatteryVoltage()
{
    int Value = analogRead(BatteryPin); //read the value from the Analog Pin
    //Serial.println(Value);
    float BatteryVoltage = (Value/ResistorFactor)*ReferenceVoltage; //Calculate the ratio
}

Ich weiß, dass dies ein Elektronikforum ist und ich stelle eine Programmierfrage, aber das ist Elektronik. Ich würde mich über Hinweise freuen. Das macht mich wahnsinnig.

Update: Danke an PeterJ , der mir geholfen hat, zu bestätigen, was ich darüber wusste, von welchem ​​​​Pin ich lesen soll, und auch für die verbesserte Syntax. Das Problem war jedoch in Zeile 8 unten:

1: /// <summary>
2: /// Reads the current Battery voltage
3: /// </sumary>
4: void ReadBatteryVoltage()
5: {
6:  int Value = analogRead(BATTERY_PIN);    //read the value from the Analog Pin
7:  //Serial.println(Value);
8:  BatteryVoltage = (Value/ResistorFactor)*ReferenceVoltage;   //Calculate the ratio
9: }

Diese lokale Variable war diejenige, die mit der Batteriespannung gefüllt wurde, die von der BATTERY_PIN gelesen wurde, wobei die ähnlich benannte globale Variable an anderer Stelle in meiner Anwendung in ihrem Standardzustand von 0,0 blieb;

Ich habe gerade die Typdeklaration entfernt, wodurch die globale Variable so verwendet wurde, wie sie sollte, und alles hat gut funktioniert.

Das ist die Art von Dingen, die Programmierer in den Wahnsinn treiben. Hardware ist hart ... pfff! Hardware ist schwierig, weil die meiste Hardware jetzt Software erfordert. ;-) ... was natürlich schlecht von Wetware erstellt wird.

Antworten (1)

Es kann andere Probleme geben, aber gemäß der Arduino analogRead-Dokumentation

Syntax

analogLesen (pin)

Parameter

pin: die Nummer des analogen Eingangspins, von dem gelesen werden soll (0 bis 5 bei den meisten Boards, 0 bis 7 beim Mini und Nano, 0 bis 15 beim Mega)

Da A1 als 19U definiert ist, sollten Sie Folgendes ändern:

const int BatteryPin = A1;

Zu dem Folgendem:

const int BatteryPin = 1;

Persönlich würde ich in diesen Fällen auch die Verwendung von #define-Anweisungen des Präprozessors anstelle von Konstanten in Betracht ziehen, die je nach Compiler-Optimierung zusätzlichen Speicher verbrauchen können, sodass Sie Folgendes verwenden könnten:

#define BatteryPin 1

Obwohl es nach Konvention für Präprozessordefinitionen normalerweise so wäre:

#define BATTERY_PIN 1
Wenn ich "const int BatteryPin = 1" in "#define BATTERY_PIN 1" ändere, erhalte ich einen Fehler in der Zeile, in der ich das analogRead ausführe und sage: "Error: Expected a ')'"?!?
Ich nehme nicht an, dass Sie aus Gewohnheit ein Semikolon am Zeilenende gesetzt haben? Wenn ja, würde das Ergebnis als analogRead(1;)
Ich wollte gerade kommen und genau das posten. Das Semikolon entfernt und alles wird kompiliert.