Arduino und sieben Segment mit zwei Ziffern

Ich habe versucht, ein Sensorsystem mit Arduino UNO R3 mit LM35-Sensor und einer Anzeigeeinheit mit sieben Segmenten und zwei Ziffern herzustellen.

Ich habe alle Verbindungen wie folgt hergestellt (ich weiß, es ist Missy, aber ich denke, die Verkabelung ist richtig):Geben Sie hier die Bildbeschreibung ein

und ich habe versucht, dieses Programm zu erstellen, aber es hat nicht funktioniert:

int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3
                       // outside leads to ground and +5V
int val = 0;           // variable to store the value read

byte seven_seg_digits[10][7] =                                                           
                                                            { 
                                                           { 1,1,1,1,1,1,0 },  // = 00
                                                           { 0,1,1,0,0,0,0 },  // = 01
                                                           { 1,1,0,1,1,0,1 },  // = 02
                                                           { 1,1,1,1,0,0,1 },  // = 03
                                                           { 0,1,1,0,0,1,1 },  // = 04
                                                           { 1,0,1,1,0,1,1 },  // = 05
                                                           { 1,0,1,1,1,1,1 },  // = 06
                                                           { 1,1,1,0,0,0,0 },  // = 07
                                                           { 1,1,1,1,1,1,1 },  // = 08
                                                           { 1,1,1,0,0,1,1 },   // = 09
                                                            };
    void setup()
{
  Serial.begin(9600);          //  setup serial
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT); 
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);  
  pinMode(12, OUTPUT);  
  pinMode(13, OUTPUT);  

}

void loop()
{

  val = analogRead(analogPin);    // read the input pin
  float temp= val*5 ; //calculating the voltage
  temp /= 1024 ;    //calculating the voltage
  temp = (temp) * 100 ;// as 1V/100c
  int pin=0 ; //for first seven segment pins 0,1,2,3,4,5,6 is connected with a,b,c,d,e,s,g
  int pin1=7;
  Serial.println("temperature in C =");Serial.println(temp);             // debug value
  int tempL; //low number
  tempL=int(temp*10);
  int tempH;//high number
  tempH=int(temp/10);
  for(int j=0;j<7;j++) 
  {
    digitalWrite(pin,seven_seg_digits[tempL-1][j]);
  pin++;}
  for(int i=0;i<7;i++)
  {
   digitalWrite(pin1,seven_seg_digits[tempL-1][i]);
 pin1++;}
  delay(2000);
}

Ich habe ein Schleppproblem: 1- Pin 0 und Pin 1 immer hoch. 2- Wenn ich die Temperatur aus der Umwandlung der zurückgegebenen Zahl in Volt und dann in Temperatur berechne, hatte ich eine falsche Antwort, wie ich auf dem Monitor sehe, und die Zahl der Anzeige ist auch falsch, die Zahl, die angezeigt wird, stimmt nicht einmal mit überein

Wenn ich die Ausgabe von LM35 mit einem Spannungsmesser sehe, sehe ich 0,3 [v], was vernünftig ist, weil es hier im Nahen Osten Sommer und eine Temperatur von etwa 30 ist.

Dieses Video habe ich live aufgenommen (entschuldigen Sie mein schlechtes Englisch), um mehr zu erklären: http://youtu.be/iQobAe4ie_8

und ich hoffe, wenn jemand etwas über "Offset" erklären kann, über das dieser Link spricht.

Geben Sie hier die Bildbeschreibung ein

Bitte fügen Sie hinzu, was Sie im Monitor sehen.
@jippie Temperatur in C = 109,37 Temperatur in C = 101,07 Temperatur in C = 118,65 Temperatur in C = 116,21 Temperatur in C = 115,23 Temperatur in C = 104,49
Sind Sie sicher, dass das Programm in Ihrer obigen Frage mit der Version identisch ist, die Sie ausführen? Welche Werte erwarten Sie? Bitte fügen Sie die Antwort zur Anfangsfrage hinzu.
ja natürlich ist es das gleiche
@jippie Es tut mir leid, dass ich den Code nicht kopiert habe ... das a oben ist nach dem Wechsel von int zu float
das erklärt einiges, ok. Thnx für diese Klarstellung.

Antworten (1)

Schätzen Sie, was das Problem ist, mit dem Sie konfrontiert sind, da Sie nicht genügend Details angeben.

int val = 0;
val = analogRead(analogPin);    // read the input pin
int temp= val*5 ; //calculating the voltage
temp /= 1024 ;    //calculating the voltage
temp = (temp) * 100 ;// as 1V/100c

Sie verwenden ganzzahlige Mathematik, für Arduino bedeutet dies, dass sowohl val als auch temp ganze Zahlen sind, die von -32768 bis +32767 reichen.

Sie lesen einen Wert vom ADC, dieser Wert reicht von 0-1023 und Sie haben die Referenzspannung nicht eingestellt. Dies bedeutet, dass das Lesen von 0 gleich GND / 0 V und das Lesen von 1023 gleich + Vdd = 5 V ist (ungefähr abhängig von Ihrer Stromversorgung, möglicherweise USB).

Angenommen, Ihre Versorgungsspannung beträgt 5 V und die Spannung am Eingangspin 0,7 V. Der analogRead(analogPin);gibt 1024 × 0,7 / 5 = 143 zurück.

Als nächstes multiplizierst du diese Zahl: 143 × 5 = 715, so weit, so gut.

Dann dividieren Sie diese Zahl durch 1024, hier geht Ihr Programm schief: 715 / 1024 = 0,689, aber wir machen ganzzahlige Mathematik, und ganze Zahlen enthalten nur ganze Zahlen und alle Zahlen nach dem Dezimalpunkt werden abgeschnitten! Also tempist an dieser Stelle 0. Es spielt keine Rolle, wie viel Sie das Ergebnis von diesem Punkt aus multiplizieren, es wird immer sein 0.

Wechseln Sie int tempzu float temp, das sollte Ihr Problem lösen. Es weist den Compiler an, keine ganzen Zahlen zu verwenden, sondern stattdessen eine Gleitkommazahl.

Auch hier ist ein Fehler:

int tempL; //low number
tempL=int(temp*10);
int tempH;//high number
tempH=int(temp/10);

Ändern Sie es in:

int tempH;//high number
tempH=int(temp/10);
int tempL; //low number
tempL=int(temp-tempH*10);