Strom / Spannung vom Attopilot Sensor auf LCD ausgeben

ApoC

Moderator
#1
Hey ihr

Da ja aktuell viel wegen Selbstbau Sensoren für HOTT im Gange ist, habe ich mal angefangen, mit meinem rudimentären Wissen über Arduino, dem Attopilot Stromsensor Leben einzuhauchen.

Prinzipell funktioniert das auch schon, nur scheitere ich an meinem Testaufbau. Ich hätte gerne die Daten, die der Sensor ausliest auch aufm Seriellen LCD, zur Kontrolle, das ich nicht immer per Console gucken muss.

SoftwareSerial ist das Stichwort, doch leider bekomm ich den Code nicht zusammen - und bräuchte deswegen mal eure Hilfe. TX Pin für SoftSerial wäre 3.

Hier erstmal der "Auslesecode" für den Sensor.

Code:
int VRaw; 
int IRaw;
float VFinal; 
float IFinal;

void setup()
{
  Serial.begin(57600);
}

void loop()
{
  VRaw = analogRead(A0);
  IRaw = analogRead(A1);
  
  VFinal = VRaw/15.4;
  IFinal = IRaw/7.4;
  
  //Ausgabe//
  
  Serial.print(VFinal);
  Serial.println("   Volt");
  Serial.print(IFinal);
  Serial.println("   Ampere");
  Serial.println("");
  Serial.println("");
  delay(200);
}
Wie müsste der Code erweitert werden, um diese Werte für Strom und Spannung auf einem Sparkfun serial LCD auszugeben?

https://www.sparkfun.com/products/9395
 

Rangarid

Erfahrener Benutzer
#2
Grob wird es wohl ungefähr so aussehen:
Code:
#include <SoftwareSerial.h>

#define txPin 3
#define BAUDRATE 57600

int current;
int voltage;

//Hier musst du dir die Werte errechnen...
float dividerV = 15.4;
float dividerC = 7.4;

SoftwareSerial LCD = SoftwareSerial(0, txPin);
// since the LCD does not send data back to the Arduino, we should only define the txPin

void setup()
{
  pinMode(txPin, OUTPUT);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  LCD.begin(BAUDRATE);
}

void loop()
{
  voltage = analogRead(A0);
  current = analogRead(A1);
  LCD.print("Volt: ");
  LCD.println(voltage/dividerV);
  LCD.print("Current: ");
  LCD.println(current/dividerC);
  delay(200);
}
 
Zuletzt bearbeitet:

ApoC

Moderator
#3
Danke schonmal.

Aber nu laufen die Werte immer wild umher. Was muss ich ändern, das sie stehenbleiben?

Als Beispiel: Einfach nur:

- Spannung: 12,6 Volt
- Strom: 10 A
 
Zuletzt bearbeitet:

Rangarid

Erfahrener Benutzer
#4
Versuch mal so:

Code:
#include <SoftwareSerial.h>

#define txPin 3
#define BAUDRATE 57600

int current;
int voltage;

//Hier musst du dir die Werte errechnen...
float dividerV = 15.4;
float dividerC = 7.4;

SoftwareSerial LCD = SoftwareSerial(0, txPin);
// since the LCD does not send data back to the Arduino, we should only define the txPin

void setup()
{
  pinMode(txPin, OUTPUT);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  LCD.begin(BAUDRATE);
}

void loop()
{
  voltage = analogRead(A0);
  current = analogRead(A1);
  //Clear display
  LCD.print(0x01);
  //set home position
  LCD.print(0x02);
  LCD.print("Volt: ");
  LCD.println(voltage/dividerV);
  LCD.print("Current: ");
  LCD.println(current/dividerC);
  delay(200);
}
Ob das mit der HOME Position klappt weiß ich nicht, musst du mal ausprobieren wie es mit und ohne aussieht.
 

ApoC

Moderator
#5
Funzt nicht. Läuft immernoch. Man ey..:/
 

nemesisde

Neuer Benutzer
#8
Hi ApoC,
Wo hast du denn den Sensor her? Mich interessiert das Thema auch sehr und ich möchte auch mitbasteln.
Leider finde ich den Sensor nur als unbestücktes Board.

Gibt es den auch irgendwo bestückt zu kaufen?

Gruß
Sebastian
 

ApoC

Moderator
#9
Hey Sebastian

Sorry, bin berufllich in Finnland - da kann ich net immer gucken. ;)

Ich habe den von http://www.unmannedtechshop.co.uk/attopilot-90a-current-and-voltage-sensor.html

Leider funktioniert es doch nicht so, wie ich dachte. Die angegebenen Teiler sind inkorrekt.
Am Lastwiderstand angehangen und gemessen, kleines Prog fürn Arduino und die Werte per serieller Konsole ausgeben lassen.

Spannung stimmt halbwegs, Strom überhaupt nicht. Wenn ich den Strom unterhalb von 10A geeicht hatte, stimmte es über 10A garnicht mehr. Gemessen 25A, angezeigt 70A....Da ist was faul und ich komm nicht dahinter.
 

ApoC

Moderator
#10
Hey Leute

Das Thema ist immernoch aktuell. Weiss denn niemand, wie man dem ATTO Pilot Sensor beibringen kann, richtig zu messen?

Das LCD lass ich erstmal weg. Zuviele Baustellen. ;)

Ich habe gelesen, das es evtl an der Referenzspannung liegt, da ich ja momentan per USB versorge und dann einfach einen Lipo + Lastwiderstand dranhabe.

Ein "analogReference(DEFAULT); oder analogReference(INTERNAL);" hat leider auch nix gebracht.

Weiss denn da niemand was?

EDIT: Okay. Fehler gefunden. Der Leonardo misst ja als Referenz gegen VCC, also Versorgungsspannung. Am USB Port gehangen, bedeutet es, das der Leonardo nurnoch 4,6V an VCC bekommt. Dann kann er ja auch nicht richtig messen.....

Gibt es eine Möglichkeit im Code, das zu berücksichtigen?

UPDATE

#include <SoftwareSerial.h>

#define txPin 3
#define BAUDRATE 9600

int current;
int voltage;


//Hier musst du dir die Werte errechnen...
float dividerV = 15.4;
float dividerC = 7.4;

SoftwareSerial LCD = SoftwareSerial(0, txPin);
// since the LCD does not send data back to the Arduino, we should only define the txPin

const int LCDdelay=10; // conservative, 2 actually works

// wbp: goto with row & column
void lcdPosition(int row, int col) {
LCD.write(0xFE); //command flag
LCD.write((col + row*64 + 128)); //position
delay(LCDdelay);
}
void clearLCD(){
LCD.write(0xFE); //command flag
LCD.write(0x01); //clear command.
delay(LCDdelay);
}
void backlightOn() { //turns on the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(157); //light level.
delay(LCDdelay);
}

void serCommand(){ //a general function to call the command flag for issuing all other commands
LCD.write(0xFE);
}

void setup()
{
pinMode(txPin, OUTPUT);
pinMode(A0,INPUT);
pinMode(A1,INPUT);
LCD.begin(BAUDRATE);

}

void loop()
{
voltage = analogRead(A0);
current = analogRead(A1);

lcdPosition(0,0);
LCD.print("Volt: ");
LCD.println(voltage/dividerV);
lcdPosition(1,0);
LCD.print("Strom: ");
LCD.println(current/dividerC);
delay(200);
}
Der Code haut schonmal hin, das Display läuft nun nicht mehr, aber hinter den Werten für Strom und Spannung sind so komische senkrechte Zeichen, sieht ais wie der Buchstabe "l".

Wie bekomm ich die weg?

Und das nächste Problem ist, sobald ich das alles vom PC trenne und abschalte - sowie danach mit Spannung versorge, es sich nix mehr tut aufm Display. Nur, nachdem ich den Code neugeschrieben habe, ist wieder was zu sehen, aufm Display.

Ich werd noch bekloppt hier....
 
Zuletzt bearbeitet:
#11
Muss das mal ausm ARchiv rausholen, da ich diese Schaltung gerne in eine kleine Meßstation einbauen will.

Habe folgenden Code gefunden (Arduino Referenz), bei dem das serielle LCD nicht läuft, also die Schrift angezeigt wird, ohne, wie im Video zu sehen, zu laufen.

#include <SoftwareSerial.h>

#define txPin 3

SoftwareSerial LCD = SoftwareSerial(0, txPin);
// since the LCD does not send data back to the Arduino, we should only define the txPin
const int LCDdelay=10; // conservative, 2 actually works

// wbp: goto with row & column
void lcdPosition(int row, int col) {
LCD.write(0xFE); //command flag
LCD.write((col + row*64 + 128)); //position
delay(LCDdelay);
}
void clearLCD(){
LCD.write(0xFE); //command flag
LCD.write(0x01); //clear command.
delay(LCDdelay);
}
void backlightOn() { //turns on the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(157); //light level.
delay(LCDdelay);
}
void backlightOff(){ //turns off the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(128); //light level for off.
delay(LCDdelay);
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
LCD.write(0xFE);
}

void setup()
{
pinMode(txPin, OUTPUT);
LCD.begin(9600);
clearLCD();
lcdPosition(0,0);
LCD.print("Hello world!");
}

void loop()
{
}
An Pin3 hängt das LCD und an Pin A0 die Spannungsaugabe des Atto Sensor, sowie an A1 der Stromausgang.

Könnte mir da mal wer helfen, das irgendwie zusammenzubringen, das ich einfach, als Beispiel, nur V: 10V und in der zweiten Zeile: A: 10A stehen habe?

Ich raff das irgendwie nicht. ;)
 
FPV1

Banggood

Oben Unten