[Gelöst]Bestimmte Stelle einer Variablen(int/double) auslesen.

Hi,

ich möchte ein 7segment ansteuern und überlege nun wie ich den Wert meines Temp-Sensors so teile für jedes Segment.

Bsp
Temp = 25.15

ich möchte jetzt daraus
stelle1= 2
stelle2= 5 usw.

Habe es versucht mit charAt indem ich das ganze in nen String speicher, nur komme ich dann später nicht weiter wenn ich diese Werte vergleichen will.

Gibt es sowas wie das charAt auch für int/double?

  int tmp = bmp.readTemperature();
  temp = String(tmp);
  char1 = temp.charAt(0);
  char2 = temp.charAt(1);
 if(char1 == 1){tu etwas;} //geht nicht, glaube er übersetzt den char in nen int irgenwie 50 oder so
 if(char1 == "1"){tu etwas;} //gibt fehler beim compilieren  von wegen nicht verbleichbar

Hi,

charAt geht nur für Strings. Wenn du Zeichen vergleichen willst, dann musst du für Zeichen-Literale (konstante Werte) einfache Hochzeichen verwenden. Das sind nämlich keine Strings, sondern char-Werte und die brauchen einfache Hochzeichen.

Also statt

if(char1 == 1){tu etwas;} //geht nicht
 if(char1 == ""){tu etwas;} //gibt fehler beim compilieren

muss es heißen:

if(char1 == '1'){tu etwas;}

Was du mit dem zweiten Statement erreichen willst, ist mir nicht ganz klar. Was soll denn die zweite Bedingung genau bedeuten?

Rudi

Temp = 25.15 ist mal kein int oder long -Typ sondern Float.
Multiplizieren den Wert damit die letzte Kommastelle die Du haben willst zur einerstelle wird.

Dan zum Zerlegen der Zahl in einer zehner hunderte usw einfach:

byte stelle[6];
int zahl;
int i;

for i00; i<6;a++)
{
stelle[i]=zahl%10;
zahl=zahl/10;
}

Dann hast Du jede Stelle im Array stelle.
PS den Kode hab ich nicht ausprobiert als könnten noch Syntaxfehler drin sein.

Grüße Uwe

@rz259

Ja bei dem zweiten if sollte "1" stehen und net "" :slight_smile:

Damit wollte ich genau das if(char1 == '1') umsetzen.

Mir war aber nicht bewusst, dass zwischen " und ' ein Unterschied ist :slight_smile:

Aber es funktioniert jetzt, freut mich total. Hab ewig gebraucht das Segment ausm alten Reciever zu baun und mich mit Shift-register und Multiplexing auseinanderzusetzen.

Thermometer funzt jetzt aber super :slight_smile:

Falls jemand genaueres wissen will hier mal der "Wilde" Code:

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <SoftwareSerial.h>

SoftwareSerial bluetooth(2, 3); // RX, TX
Adafruit_BMP085 bmp;

/*
billiges China Tempsensor mti Adadfruit libary an A4/A5
Shift Register HC595 wie angegeben
Bluetooth immer als Softserial an 2,3 :)

*/

//Pin connected to ST_CP of 74HC595
int latchPin = 4;
//Pin connected to SH_CP of 74HC595
int clockPin = 6;
////Pin connected to DS of 74HC595
int dataPin = 5;
int wechsel = 500;
int stelle3 = 9;
int stelle2 = 8;
int stelle1 = 7;
char value1 = 0;
char value2 = 0;
int tmp = 0;
String temp = "";
int char1 = 0;
int char2 = 0;

int frame = 5;

void setup() {
  bluetooth.begin(9600);
  Serial.begin(9600);
  if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
  }
  
  //Shift-Register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(stelle1, OUTPUT);
  pinMode(stelle2, OUTPUT);
  pinMode(stelle3, OUTPUT);
 
}

void loop() {
  
  //Zahlenwert der Anzeige für Shift-Output umsetzen
if (value1 == '0') char1 = 20;
if (value2 == '0') char2 = 20;
if (value1 == '1') char1 = 215;
if (value2 == '1') char2 = 215;
if (value1 == '2') char1 = 76;
if (value2 == '2') char2 = 76;
if (value1 == '3') char1 = 69;
if (value2 == '3') char2 = 69;
if (value1 == '4') char1 = 135;
if (value2 == '4') char2 = 135;
if (value1 == '5') char1 = 37;
if (value2 == '5') char2 = 37;
if (value1 == '6') char1 = 36;
if (value2 == '6') char2 = 36;
if (value1 == '7') char1 = 23;
if (value2 == '7') char2 = 23;
if (value1 == '8') char1 = 4;
if (value2 == '8') char2 = 4;
if (value1 == '9') char1 = 5;
if (value2 == '9') char2 = 5;

/*if(char2 <11) char2 ++;
if(char2 == 10){
  char2 = 0;
  char1 = char1++;
 
 } */
  
  
  //Temp einlesen und Speichern in zwei Chars je nach Stelle
  tmp = bmp.readTemperature(); //als Int einlesen
 //Serial.print(tmp);
 //Serial.print(" ");
 
 temp = String(tmp); //als String speichern
 Serial.print(temp);
 Serial.print(" ");
 
 value1= temp.charAt(0); //1stelle speichern
 value2= temp.charAt(1); //2stelle speichern
 Serial.print(value1);
 Serial.print(value2);
  
  //Shift-Register beschreiben
   digitalWrite(stelle1, HIGH);
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, char1);
   digitalWrite(latchPin, HIGH);
   delay(frame);
   digitalWrite(stelle1,LOW);
   
   digitalWrite(stelle2, HIGH);
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, char2);
   digitalWrite(latchPin, HIGH);
   delay(frame);
   digitalWrite(stelle2,LOW);
   
   digitalWrite(stelle3, HIGH);
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, 60);
   digitalWrite(latchPin, HIGH);
   delay(frame);
   digitalWrite(stelle3,LOW);

}

@uwefed

Ja stimmt, bekomme ihn als solchen, speicher ihn aber immer als int. Habs an der Stelle vergessen.

Vielen Dank für deine Anregung. Das hatte ich die ganze Zeit gesucht, weil ichs vorher schonmal so gesehen hatte, aber nicht mehr gefunden.

Werds bei Gelegenheit auch nochmal ausprobieren :slight_smile: