Negatieve getallen weergeven in Arduino

Mijn vriend en ik zijn bezig met het bedraden/coderen van een digitale thermometer op een Arduino-bord en ik schrijf de code. We werken met de thermometer, en de basis tempgegevens gaan naar het 4-cijferige 7-segment LED-scherm dat we gebruiken voor de uitvoer. Ik probeer de code te schrijven om negatieve (sub-nul) temperaturen weer te geven en ondervind problemen bij het verkrijgen van de juiste uitvoer. In plaats van een negatief teken af ​​te geven, geeft het een 8 uit.

Dit is de methode loop ():

void loop(void) {
 int temp = getTemp();
 boolean neg = false;
 if (temp < 0) {
  //Since the temperature is negative, multiplying it by -2 and adding it
  //to itself gives us the absolute value of the number
   temp += (temp * (-2));
  //We set the neg boolean to true, indicating that we're dealing with a negative number
   neg = true;
 }
 displayNumber(temp, neg);
}

Dit is de (ingekorte) methode displayNumber ():

void displayNumber(int toDisplay, boolean negative) {

int num = toDisplay;

// The digits are 1-4, left to right
for(int digit = 4; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
 //The leftmost digit only needs to be on for temps 100.0 or above, 
 //or to display the negative sign for temps -10.0 or below
  if (num >= 1000 || (num >= 100 && negative == true)) {
    digitalWrite(digit1, HIGH);
    }
  if (num >= 100 && negative == true) {
    lightNumber(11);
  }
  break;
case 2:
 //Only needs to be on for temps 10.0 degrees or above, or 
 //for single-digit subzero temps.
  if (num >= 100 || negative == true) {
    digitalWrite(digit2, HIGH);
  }
  if (num < 100 && negative == true) {
    lightNumber(11);
  }
  break;
case 3:
  digitalWrite(digit3, HIGH);
  break;
case 4:
  digitalWrite(digit4, HIGH);
  break;
}

//Turn on the right segments for this digit
lightNumber(toDisplay % 10);
toDisplay /= 10;

//Turn off all segments
lightNumber(10); 

//Turn off all digits
digitalWrite(digit1, LOW);
digitalWrite(digit2, LOW);
digitalWrite(digit3, LOW);
digitalWrite(digit4, LOW);    
}
}

... En de code voor de methode lightNumber() schakelt de segmenten correct in of uit voor de cijfers 0-9, waarbij 10 alle segmenten uit is en 11 alleen het middensegment is voor een negatief teken. Het gebruikt een switch-instructie met de integer-parameter als de schakelaar. Het probleem is, wanneer ik displayNumber() een negatieve waarde stuur, in plaats van een negatief teken voor het nummer, krijg ik een acht weergegeven waar het negatieve teken zou moeten zijn. Om het even welke ideeën waarom?

1
Waar is lightNumber , digitalWrite ? Ik denk dat ik waarschijnlijk meer code moet zien om te beantwoorden.
toegevoegd de auteur Tim, de bron
Doe dit niet: temp + = (temp * (-2)); ! Het is verwarrend en inefficiënt2. Hoe zit het met temp = temp * (-1); ?
toegevoegd de auteur JimmyB, de bron

1 antwoord

Ik denk dat je overweegt om te denken als je verklaringen hebt. In uw versie worden beide if-instructies uitgevoerd als het aantal negatief is. Tyr dit:

case 1:
 //The leftmost digit only needs to be on for temps 100.0 or above, 
 //or to display the negative sign for temps -10.0 or below
  if (num >= 1000 ){
    digitalWrite(digit1, HIGH);
    }
  if (num >= 100 && negative == true) {
    lightNumber(11);
  }
  break;
0
toegevoegd