Probleme mit der Berechnung von Integer-Werten

Hallo ich habe folgendes Problem
Ich versuche eine über Schalter gestzte Bit-Kombination als Dezimalzahl auf auf einem LCD auszugeben.
Also wenn Schalter 1 HIGH ist dann soll das 2^0 sein wenn Schalter 2 HIGH ist dann soll 2^1 usw.
das berechnete Ergebnis soll dann als Dezimalzahl auf dem LCD erscheinen.
Nun mein Problem wenn ich das Array h[] und die Variable t als Integer deklariere dann bekomme ich falsche Ergebnise
mit float funktioniert ist. Kann mir bitte einer sagen warum das so ist??? Ich habe schon Stunden nach ähnlichen Problemen im Netz gesucht

Hier der Sketch:

#include <LiquidCrystal.h> //Aufruf der Bibliothek LCD


LiquidCrystal lcd(24,25,26,27,28,29); //Initialisierung der Anschlusspins

void setup() 
{
  

  lcd.begin(16, 2); //Definition der Spalten und Reihen des LCD's
  lcd.clear();      //Display löschen
  
 pinMode(38, INPUT);  //Deklarierung der Pins als Eingänge
 pinMode(39, INPUT);
 pinMode(40, INPUT);
 pinMode(41, INPUT);
 pinMode(42, INPUT);
 pinMode(43, INPUT);
 pinMode(44, INPUT);
 pinMode(45, INPUT);


}

void loop() 
{
 
boolean z[8];  //eindimensionale Array-Variable z wird dem Datentyp boolean zugewiesen
float h[8]={0,0,0,0,0,0,0,0};  //eindimensionale Array-Variable h wird dem Datentyp float zugewiesen und erhält den Wert 0
float t=0;  //Variable t wird dem Datentyp float zugewiesen und erhält den Wert 0
for (int j=0;j<=7;j++)
{
z[j] = digitalRead (45-j);  //Einlesen der digitalen Eingänge in die eindimensionale Array-Variable z
}

for(int i=0;i<=7;i++)  //for-Schleife für 8 Durchläufe
{
  if (z[i]==HIGH)  //if-Abfrage des Arrays z[] nach ihren Zuständen
  {
  h[i]=pow(2,i);  //Array h[] erhält die zugehörigen Binärwerte
  }
  else
  {
  h[i]=0;  //Array h[] erhält den Wert 0
  }
  
 t=t+h[i];  //Addition der eingestellten Binärwerte 
} 

 lcd.setCursor(0,0);  //Position des Cursors in der Anzeige; Zeile 1 und Spalte 0
 lcd.print("Dezimalwert:");  //Ausgabe des Wortes "Dezimalwert:"
 lcd.setCursor(0,1);  //Position des Cursors in der Anzeige; Zeile 2 und Spalte 0
 lcd.print(t);  //Ausgabe der Variable t 
}

Das Problem könnte sein, dass pow(int,int) nicht definiert ist.
pow(float,int) ist außerdem ziemlich Ressourcenaufwändig, genau wie float-Arithmetik an sich. Ich würde zu einer Variablen raten, die in jedem Schleifendurchlauf verdoppelt wird. Falls du das ganze dann weiter optimieren willst kannst du die Verdoppelung dann anstatt per Multiplikation auch per Addition realisieren oder per Bitverschiebung. Aber das ist auch nicht unbedingt nötig.

Ich würde die 8 Eingänge eines Ports wählen und den entsprechenden Wert direkt aus dem Eingangsregister auszulesen.
Teorie für den ATmega328: Arduino Reference - Arduino Reference

Die Entsprechung der Pins mit den Ports kannst Du aus dem Schaltbild des Arduino Mega2560
http://arduino.cc/en/uploads/Main/arduino-mega2560_R3-schematic.pdf bzw aus diesem Dokument http://arduino.cc/en/Hacking/PinMapping2560 herauslesen.

Die Ansteuerung der Ports des ATmega2560 ist analog zu denen des ATmega328.

Einmal den Wert der 8 Schalter eingelesen kann er als Dezimalzahl ausgegeben werden.

Grüße Uwe

Danke für die schnelle Antwort ich werde es mal ausprobieren. Ich habe mir eben auch nochmal die pow(x,y) genau angesehen und denke das die Funktion float-Werte erwartet und es deshalb zu Fehlern kommt.
Aber nochmals vielen Dank

wenn Du meinst und meinen Vorschlag zu kompliziert findest...

Du nimmst die Pins von 22 bis 29 wobei 22 das niederwertigste ist (PORTA)

setup(){
DDRA =B00000000; definiert die Pins als Eingänge.
PORTA=B11111111; aktiviert die Pullupwiderstände
}

loop()
{
lcd.print(PINA,dec);  liest die 8 Eingänge und druckt das Ergebnis.
}

Grüße Uwe

Natürlich ist Uwes Lösung die eleganteste, aber ob direkte Portmanipulation bei der Vermeidung von Fehlern hilft ist immer recht zweifelhaft.

Ja, dass ist bestimmt schon eine sehr gute Lösung aber ich bereite ein Schülerprojekt vor woran ein paar Grundlagen erlernt werden sollen und ich denke dafür ist die Lösung zu komplex.
Ich hätte aber noch eine weitere Frage .. Ich habe es jetzt anstatt mit der pow()-Funktion über die bit()-Funktion geschrieben und es funktioniert auch gut aber wenn ich zweistellige Werte habe und die Schalter ausschalte behält das Display immer die letzten Zeilen Bsp: 128 wird angezeigt und nach abschalten des Schalter steht im Display für etwa 30 Sekunden 28. Warum ist das so???

Das liegt in den meisten Fällen an der Programmierung. :wink: Schreibt man eine dreistellige Zahl auf ein Display und will sie mit einer einstelligen überschreiben, muss man entweder den Displayinhalt komplett löschen oder die ursprünglichen Stellen mit Leerzeichen überschreiben.