INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino hängt sich auf
24.01.2015, 15:30
Beitrag #1
Arduino hängt sich auf
Hallo,

ich darf mich kurz vorstellen. Mein Name ist Daniel und ich bin 28 Jahre alt.
Ich habe eine Ausbildung zum Elektroniker hinter mir und bin so auf die Programmierung gekommen. Leider war es durch die Verkürzung meiner Ausbildung ein Thema was nur noch angeschnitten wurde. Ich hatte aber dennoch interesse daran und habe mich selbst ein bissl reingefuchst.

Soweit zu mir.

Nun zu meinem Problem:

Ich habe eine Steuerung für die Wachtelbrut entwickelt. Nach anfänglichen Hardware-Schwierigkeiten die ich gelöst habe, haben sich nun Softwareprobleme eingeschlichen.

Mein Problem ist, dass sich nach ca. 3 Stunden die ganze Steuerung aufhängt.

hier mal mein Code:

Zitat:/*******************************************************
**            Brutkastensteuerung V1.0                **
**  Daniel Sundmacher    16.06.2014                   **
** Idealwerte                                         **
** Luftfeuchtigkeit 50 - 65%                          **
** Temperatur        37,6                             **
** Ab Tag 5  10-15 Minuten Kühlen lassen              **
** Ab Tag 14 Luftfeuchtigkeit 80 - 90%                **
********************************************************/

//Bibliotheken einbinden
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <DHT.h>
#include <avr/wdt.h>



//********************************************************************************​****************************

//Konstante Werte definieren
#define waitTime      100                            // Aktualisierungszeit in ms
#define DS1307_I2C_ADDRESS 0x68                      // I2C Adresse des DS1307-Chips
#define DHTPIN 8                                     // Anschlusspin der Sensorleitung

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22 (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
// NOTE: For working with a faster chip, like an Arduino Due or Teensy, you
// might need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// Example to initialize DHT sensor for Arduino Due:
//DHT dht(DHTPIN, DHTTYPE, 30);


//********************************************************************************​****************************


//Objekte initialisieren

float Temperature; // Temperatur Variable

int Heizung = 6;
int Nebler = 5;
int FAN = 4;
int Motor = 9;
int MotorPWM = 10; //Lüfter nach außen
int Starttaster = 21;
int Stoptaster = 20;
int Resettaster = 19;



     
     
     
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

char buffer[20] = "";
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

void getDateDs1307(int date[])
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten
  Wire.write(0x00); // Registerzeiger auf 0 setzen
  Wire.endTransmission(); // I2C-Kommunikation beenden
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten
 
  date[ 0 ] = bcdToDec(Wire.read() & 0x7f); // Sekunden
  date[ 1 ] = bcdToDec(Wire.read()); // Minuten
  date[ 2 ] = bcdToDec(Wire.read() & 0x3f); // Stunden
  date[ 3 ] = bcdToDec(Wire.read()); // Wochentag
  date[ 4 ] = bcdToDec(Wire.read()); // Tag
  date[ 5 ] = bcdToDec(Wire.read()); // Monat
  date[ 6 ] = bcdToDec(Wire.read()); // Jahr
}
byte thermometersymbol[8] = //icon for termometer
{
    B00100,
    B01010,
    B01010,
    B01110,
    B01110,
    B11111,
    B11111,
    B01110
};
byte tropfensymbol[8] = //icon for water droplet
{
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
};
//********************************************************************************​****************************

   void setup() {
     
     pinMode(Heizung, OUTPUT);
     pinMode(Nebler,OUTPUT);
     pinMode(FAN,OUTPUT);
     pinMode(Motor, OUTPUT);
     pinMode(MotorPWM, OUTPUT);
     pinMode(Resettaster, INPUT);
     pinMode(Stoptaster, INPUT);
     pinMode(Starttaster, INPUT);
     
     
     
     
     lcd.begin(16,2 ); // initialize the lcd for 16 chars 2 lines, turn on backlight
     //lcd.begin(20,4);
     Serial.begin(115200); // Serielle Schnittstelle(USB) initialisieren
     dht.begin();
     lcd.createChar(1,thermometersymbol);
     lcd.createChar(2,tropfensymbol);

    lcd.backlight();                 // finish with backlight on
    
     }
 

   
//********************************************************************************​****************************

void loop() {

  delay(waitTime);
  // Wait a few seconds between measurements.
  delay(1000);
  
  
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity(); // Read temperature as Celsius
  float t = dht.readTemperature(); // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
     lcd.clear(),
    lcd.println(" Sensor defekt! "),
           digitalWrite(Heizung, LOW),
           digitalWrite(FAN,LOW),
           digitalWrite(Nebler,LOW),
           digitalWrite(MotorPWM,LOW),
           digitalWrite(Motor, HIGH);
           delay(2500);
           lcd.clear();
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);



   lcd.setCursor(0,1);
   lcd.write(1);
   lcd.write(0xDF);
   lcd.setCursor(2,1);
   lcd.print(t);
   lcd.setCursor(6,1);
   lcd.write(0xDF);
   lcd.print("C");
   lcd.setCursor(9,1);
   lcd.write(2);
   lcd.print(h);
   lcd.print("%") ;
   
 
  
//ab hier das Programm starten wenn Starttaster gedrückt wurde  

    
  
  digitalWrite(Motor, HIGH);
  digitalWrite(FAN, HIGH);
  
{

        {
         if (t<=37.3)
         { 
         digitalWrite(Heizung,HIGH);
         //digitalWrite(MotorPWM,LOW);
         }

        if (t>=37.6)
               
         {
          digitalWrite(Heizung,LOW);
          //digitalWrite(MotorPWM,HIGH);
         }   
        }
            
           {
            if (h<=60.0)
             {
             digitalWrite(Nebler,HIGH);
             //digitalWrite(MotorPWM,LOW);
             }
      
            if (h>=62.0)
            {
             digitalWrite(Nebler,LOW);
             //digitalWrite(MotorPWM,HIGH);
            }
            }

}
int datum[ 7 ];
  
              getDateDs1307( datum );                            // Datum und Uhrzeit aus DS1307 holen
              delay(100);

              lcd.setCursor(0,0); // Datum und Uhrzeit in 2. Zeile schreiben
  
  
            if( datum[ 4 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 4 ], buffer, 10 ) );
              lcd.print( "." );
              if( datum[ 5 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 5 ], buffer, 10 ) );
              lcd.print( "." );

              if( datum[ 6 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 6 ], buffer, 10 ) );

             lcd.setCursor(11,0);

              if( datum[ 2 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 2 ], buffer, 10 ) );
              lcd.print( ":" );
              if( datum[ 1 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 1 ], buffer, 10 ) );
              
      
  
}

void software_Reboot()
{
  wdt_enable(WDTO_8S);
  while(1)
  {
  }

}
//********************************************************************************​****************************

den letzten Teil mit dem Watchdogtimer habe ich eben erst hinzugefügt.

Könnte das so klappen?

Vielen Dank schonmal!!!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2015, 17:16
Beitrag #2
RE: Arduino hängt sich auf
Hallo Suszuki,
auf die Schnelle fallen folgende Dinge auf:
- im Loop gibt es Syntaxfehler bei den digitalWrite()- Aufrufen ( , statt ; )
- die delay()-Aufrufe kannst du durch eine if-Abfrage mit millis() und Abfrageintervall ersetzen. Ansonsten bleibt der Ardu in vielen Komponenten stehen.
Typisches Beispiel hierfür: http://arduino.cc/en/Tutorial/BlinkWithoutDelay
- Bist du sicher, dass die If-Abfragen vor dem Reboot richtig geklammert sind. Ich frage nur, da in der aktuellen Schreibweise je if-Abfrage nur der erste Folgebefehl ausgeführt wird, danach jedoch auch der zweite und weitere Befehle der anderen If-Abfragen Huh
- den reboot brauchst du nicht, da es im Normallfall durchlaufen sollte.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2015, 16:36
Beitrag #3
RE: Arduino hängt sich auf
Hallo Ricardo,

erstmal vielen Dank für deine Antwort.

aus folgendem werde ich allerdings nicht so ganz schlau.

- die delay()-Aufrufe kannst du durch eine if-Abfrage mit millis() und Abfrageintervall ersetzen. Ansonsten bleibt der Ardu in vielen Komponenten stehen.
Typisches Beispiel hierfür: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Ich habe mir das Beispiel angeschaut und teile sogar schon eingefügt. Ob das jetzt so richtig ist weiß ich nicht.

Wie würde denn so eine If-Abfrage mit milli() und Abfrageintervall in meinem Beispiel aussehen?

So sieht es aktuell aus:



Zitat:/*******************************************************
**            Brutkastensteuerung V1.0                **
**  Daniel Sundmacher    16.06.2014                   **
** Idealwerte                                         **
** Luftfeuchtigkeit 50 - 65%                          **
** Temperatur        37,6                             **
** Ab Tag 5  10-15 Minuten Kühlen lassen              **
** Ab Tag 14 Luftfeuchtigkeit 80 - 90%                **
********************************************************/

//Bibliotheken einbinden
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <DHT.h>
#include <avr/wdt.h>



//********************************************************************************​****************************

//Konstante Werte definieren
#define waitTime      100                            // Aktualisierungszeit in ms
#define DS1307_I2C_ADDRESS 0x68                      // I2C Adresse des DS1307-Chips
#define DHTPIN 8                                     // Anschlusspin der Sensorleitung

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22 (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
// NOTE: For working with a faster chip, like an Arduino Due or Teensy, you
// might need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// Example to initialize DHT sensor for Arduino Due:
//DHT dht(DHTPIN, DHTTYPE, 30);


//********************************************************************************​****************************


//Objekte initialisieren

float Temperature; // Temperatur Variable

int Heizung = 6;
int Nebler = 5;
int FAN = 4;
int Motor = 9;
int MotorPWM = 10; //Lüfter nach außen
int Starttaster = 21;
int Stoptaster = 20;
int Resettaster = 19;

long previousMillis = 0;
long interval = 1000;
   
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

char buffer[20] = "";
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

void getDateDs1307(int date[])
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten
  Wire.write(0x00); // Registerzeiger auf 0 setzen
  Wire.endTransmission(); // I2C-Kommunikation beenden
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten
 
  date[ 0 ] = bcdToDec(Wire.read() & 0x7f); // Sekunden
  date[ 1 ] = bcdToDec(Wire.read()); // Minuten
  date[ 2 ] = bcdToDec(Wire.read() & 0x3f); // Stunden
  date[ 3 ] = bcdToDec(Wire.read()); // Wochentag
  date[ 4 ] = bcdToDec(Wire.read()); // Tag
  date[ 5 ] = bcdToDec(Wire.read()); // Monat
  date[ 6 ] = bcdToDec(Wire.read()); // Jahr
}
byte thermometersymbol[8] = //icon for termometer
{
    B00100,
    B01010,
    B01010,
    B01110,
    B01110,
    B11111,
    B11111,
    B01110
};
byte tropfensymbol[8] = //icon for water droplet
{
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
};


//********************************************************************************​****************************

   void setup() {
     
     pinMode(Heizung, OUTPUT);
     pinMode(Nebler,OUTPUT);
     pinMode(FAN,OUTPUT);
     pinMode(Motor, OUTPUT);
     pinMode(MotorPWM, OUTPUT);
     pinMode(Resettaster, INPUT);
     pinMode(Stoptaster, INPUT);
     pinMode(Starttaster, INPUT);
     
    
     lcd.begin(16,2 ); // initialize the lcd for 16 chars 2 lines, turn on backlight
     //lcd.begin(20,4);
     Serial.begin(115200); // Serielle Schnittstelle(USB) initialisieren
     dht.begin();
     lcd.createChar(1,thermometersymbol);
     lcd.createChar(2,tropfensymbol);

    lcd.backlight();                 // finish with backlight on
    
     }
 

   
//********************************************************************************​****************************

void loop() {

  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
  //delay(waitTime);
  // Wait a few seconds between measurements.
  //delay(1000);
  
  
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity(); // Read temperature as Celsius
  float t = dht.readTemperature(); // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
     lcd.clear(),
    lcd.println(" Sensor defekt! ");
           digitalWrite(Heizung, LOW);
           digitalWrite(FAN,LOW);
           digitalWrite(Nebler,LOW);
           digitalWrite(MotorPWM,LOW);
           digitalWrite(Motor, HIGH);
           millis();
           lcd.clear();
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);



   lcd.setCursor(0,1);
   lcd.write(1);
   lcd.write(0xDF);
   lcd.setCursor(2,1);
   lcd.print(t);
   lcd.setCursor(6,1);
   lcd.write(0xDF);
   lcd.print("C");
   lcd.setCursor(9,1);
   lcd.write(2);
   lcd.print(h);
   lcd.print("%") ;
   
 
  
//ab hier das Programm starten wenn Starttaster gedrückt wurde  

    
  
  digitalWrite(Motor, HIGH);
  digitalWrite(FAN, HIGH);
  
{

        {
         if (t<=37.3)
         { 
         digitalWrite(Heizung,HIGH);
         //digitalWrite(MotorPWM,LOW);
         }

        if (t>=37.6)
               
         {
          digitalWrite(Heizung,LOW);
          //digitalWrite(MotorPWM,HIGH);
         }   
        }
            
           {
            if (h<=60.0)
             {
             digitalWrite(Nebler,HIGH);
             //digitalWrite(MotorPWM,LOW);
             }
      
            if (h>=62.0)
            {
             digitalWrite(Nebler,LOW);
             //digitalWrite(MotorPWM,HIGH);
            }
            }

}
int datum[ 7 ];
  
              getDateDs1307( datum );                            // Datum und Uhrzeit aus DS1307 holen
              millis();

              lcd.setCursor(0,0); // Datum und Uhrzeit in 2. Zeile schreiben
  
  
            if( datum[ 4 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 4 ], buffer, 10 ) );
              lcd.print( "." );
              if( datum[ 5 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 5 ], buffer, 10 ) );
              lcd.print( "." );

              if( datum[ 6 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 6 ], buffer, 10 ) );

             lcd.setCursor(11,0);

              if( datum[ 2 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 2 ], buffer, 10 ) );
              lcd.print( ":" );
              if( datum[ 1 ] < 10 )
              lcd.print( "0" );
              lcd.print( itoa( datum[ 1 ], buffer, 10 ) );
  }
}
  

 // }
//void software_Reboot()
//{
//  wdt_enable(WDTO_8S);
 // while(1)
  //{
  //}

//}
//********************************************************************************​****************************
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2015, 19:59
Beitrag #4
RE: Arduino hängt sich auf
Zitat: if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
Fast richtig. An die Stelle der Kommentarzeile müssen die Aktionen rein, die ablaufen sollen wenn die Intervalzeit überschritten wurde, also das delay abgelaufen ist.
So etwa:
Zitat: if(currentMillis - previousMillis > interval) {
// hier die Aktionen im Loop
previousMillis = currentMillis;
}
Grüße RK
PS: Poste deinen Code bitte mit dem # - Symbol, sonst wird der Eintrag immer recht lang

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 147 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino hängt beim Upload deranda 11 505 12.08.2016 21:27
Letzter Beitrag: hotsystems
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 984 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Programme lassen sich nicht auf das Gemma Board downloaden! Jack Sparrow 13 565 08.04.2016 10:01
Letzter Beitrag: hotsystems
  Servo.h lässt sich nicht einbinden ^^ EvilBen 5 706 08.02.2016 18:07
Letzter Beitrag: hotsystems
  Daten auf SD-Card werden nur geschrieben, wenn Nano am USB-Port hängt Nathea 6 482 24.01.2016 16:42
Letzter Beitrag: Nathea
  Sketch läßt sich nicht hochladen - not in sync Stephan_56 20 1.779 17.01.2016 23:00
Letzter Beitrag: Bitklopfer
  Ergebnis lässt sich nicht speichern? schuballaa 2 624 30.08.2015 17:07
Letzter Beitrag: hotsystems
Shocked Arudrino Leonardo mit Display hängt sich auf EvilKnivel 0 551 26.08.2015 20:33
Letzter Beitrag: EvilKnivel
  serieller Monitor friert ein oder Programm hängt sich auf MaHaI976 3 784 22.06.2015 13:45
Letzter Beitrag: MaHaI976

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste