Pages: [1]   Go Down
Author Topic: Arduino hängt sich auf  (Read 2207 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo liebe Leute,
ich bin relativ neu im Arduinogeschäft und hab mich gleich an ein relativ großes Projekt herangewagt.
Also zuerst zu Hardware:
-Arduino UNO
-LCD(16x2)
-GPS
-LM35 Temperaturfühler

Nun hab ich mir da einen Code zusammengebastelt, der soweit auch funktioniert, nur! nach ner Zeit hängt sich das ganze auf, was sich auf dem Display durch irgendwelche zufällige Zeichen zeigt.


Code:
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
SoftwareSerial nss(6, 7);
TinyGPS gps;

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 1);
int tempPin = 0;
int temp = 0;




void setup()
{
  nss.begin(9600);
  lcd.begin(16, 2);
  lcd.print("GPS-DISPLAY");
  lcd.setCursor(0, 1);
  lcd.print("Version: 0.1");
  delay(2000);
  lcd.clear();
  
    bool newdata = false;
 
 {
  if (newdata = false)
  lcd.setCursor(0, 0);
  lcd.print("Suche");
  lcd.setCursor(0, 1);
  lcd.print("Satelliten...    ");
  
 }
}

void loop()
  {
 
  {
    temp = ( 5.0 * analogRead(tempPin) * 1000.0) / 1024.0;
  }
  
  
  bool newdata = false;
  {
    if (feedgps())
      newdata = true;
  }
  
  
  if (newdata)
  {  
    gpsdump(gps);
  }
}

void printFloat(double number, int digits)
{
  if (number < 0.0)
  {
     lcd.print('-');
     number = -number;
  }

  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  lcd.print(int_part);

  if (digits > 0)
    lcd.print(".");

  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    lcd.print(toPrint);
    remainder -= toPrint;
  }
}
void gpsdump(TinyGPS &gps)
{
 
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  
  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  lcd.clear();
  lcd.setCursor(0, 0);   lcd.print("Zeit: ");
  lcd.setCursor(0, 1);
  lcd.print(static_cast<int>(hour + 1)); lcd.print(":"); lcd.print(static_cast<int>(minute));
  delay(2000);

  feedgps();

  lcd.clear();  
  lcd.print("Temperatur: ");
  lcd.setCursor(0, 1);
  lcd.print(temp/10.0, 1); lcd.print(" Celsius");
  delay(2000);
  
  feedgps();
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Hoehe: ");
  lcd.setCursor(0, 1);
  lcd.print(gps.f_altitude()); lcd.print(" m");
  delay(2000);
  
  feedgps();
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Geschwindigkeit: ");
  lcd.setCursor(0, 1);
  lcd.print(gps.f_speed_kmph()) + 1; lcd.print(" km/h");
  delay(2000);
  
  feedgps();
    
  lcd.clear();
  lcd.print("Kurs:");
  lcd.setCursor(0, 1);
  lcd.print(TinyGPS::cardinal(gps.f_course()));
  delay(2000);
  
  
  feedgps();
    
  lcd.clear();  
  lcd.print("Temperatur: ");
  lcd.setCursor(0, 1);
  lcd.print(temp/10.0, 1); lcd.print(" Celsius");
  delay(2000);
  
  feedgps();
  
}
  
bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

Ich verstehe es einfach nicht.
Schon mal vielen Dank für eure Hilfe

Beste Grüße
Emanuel

« Last Edit: March 06, 2012, 06:16:16 am by der-manu » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

zusammen gebastelt triffts sehr gut ^^

Hier mal etwas was mir auf -Anhieb auffällt, ich selber hab nur das Display selber schon mal verwendet aber es könnte an deiner Programmierweise liegen:

Code:
{
  if (newdata = false)
  lcd.setCursor(0, 0);
  lcd.print("Suche");
  lcd.setCursor(0, 1);
  lcd.print("Satelliten...    ");
 
}
zu
Code:

  if (newdata==false){
  lcd.setCursor(0, 0);
  lcd.print("Suche");
  lcd.setCursor(0, 1);
  lcd.print("Satelliten...    ");
 
}

 == ist der Vergleichsoperator
=  ist der Zuweisungsoperator
geschweifte klammern werden nur gesetzt nach:
Schleifen:
z.B.
while (Bedingung) { ... }
for (Initialisierung; Test; Fortsetzung) { ... }

Bedingungen:
z.B.
if(Bedingung) { ... }

oder Methoden:

void bla() { ... }

Die Klammern können weg gelassen werden, wenn nur eine Anweisung ausgeführt werden soll, außer bei Methoden.

Code:
number = -number;
soll bestimmt
Code:
number -= number;
sein

Auch sollte man entweder einheitlich " " oder ' ' verwenden.

Wenn du so dein Code durchgehst könnte es sein, dass es einfach nur ein Klammerfehler o.ä. ist der RAM zum überlaufen bringt.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke dir, werds gleich mal ausprobieren.
Logged

Pages: [1]   Go Up
Jump to: