Hilfestellung beim Kombinieren von Sketchen

Hallo,

Ich hoffe Ihr könnt mir helfen ich versuche zwei von meinen Sketchen zu kombinieren, aber es will nicht so richtig klappen!

Sketch1:Motorsteuerung

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M1 Direction Control

//int E1 = 6; //M1 Speed Control
//int E2 = 9; //M2 Speed Control
//int M1 = 7; //M1 Direction Control
//int M2 = 8; //M1 Direction Control

void stop(void) //Stop
{
digitalWrite(E1,LOW);
digitalWrite(E2,LOW);
}
void advance(char a,char b) //Vor
{
analogWrite (E1,a); //PWM Speed Control
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
void back_off (char a,char b) //Rückwärts
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void turn_L (char a,char b) //Links
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
void turn_R (char a,char b) //Rechts
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void setup(void)
{
int i;
for(i=4;i<=7;i++)
pinMode(i, OUTPUT);
Serial.begin(9600); //Set Baud Rate
Serial.println(“Run keyboard control”);
}
void loop(void)
{
if(Serial.available()){
char val = Serial.read();
if(val != -1)
{
switch(val)
{
case ‘w’://Vor
advance (500,500); //max Vor
break;
case ‘s’://Rück
back_off (500,500); //max Rück
break;
case ‘a’://Links
turn_L (255,255);
break;
case ‘d’://Rechts
turn_R (255,255);
break;
case ‘z’:
Serial.println(“Guten TAG”);
break;
case ‘x’:
stop();
break;
}
}
else stop();
}
}

Sketch2: Temperatur

#define DHT11_PIN 0 // ADC0

byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PINC & _BV(DHT11_PIN))); // wait for 50us
delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN))); // wait ‘1’ finish
}
return result;
}

void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600);
Serial.println(“Ready”);
}

void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;// start condition
// 1. pull-down i/o pin from 18ms
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);

dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in)
{
Serial.println(“dht11 start condition 1 not met”);
return;
}
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
Serial.println(“dht11 start condition 2 not met”);
return;
}

delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
dht11_dat = read_dht11_dat();

  • DDRC |= _BV(DHT11_PIN);*
  • PORTC |= _BV(DHT11_PIN);*
  • byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum*
  • if(dht11_dat[4]!= dht11_check_sum)*
  • {*
  • Serial.println(“DHT11 checksum error”);*
  • }*
  • Serial.print("Current humdity = ");*
  • Serial.print(dht11_dat[0], DEC);*
  • Serial.print(".");*
  • Serial.print(dht11_dat[1], DEC);*
  • Serial.print("% ");*
  • Serial.print("temperature = ");*
  • Serial.print(dht11_dat[2], DEC);*
  • Serial.print(".");*
  • Serial.print(dht11_dat[3], DEC);*
  • Serial.println("C ");*
  • delay(2000);*
    }[/quote]
    Vielleicht hat ja jemand eine Idee.
    MfG Dominik

Das Auslesen des Sensors ist auf Hardwarelevel realisiert. Hast Du es mit der Bibliothek versucht? http://playground.arduino.cc/Main/DHTLib Grüße Uwe

Hallo Uwe,

Leider komme ich mit der Bibliothek nicht wirklich weiter.

Dome: Vielleicht hat ja jemand eine Idee.

Im Prinzip machst Du es so, dass Du den setup() und loop() Funktionen neue Namen gibst:

Z.B. im Motor-Sketch

void setup() umbenennen zu ==> void motorSetup()

void loop() umbenennten ==> void motorLoop()

Und im DHT-Sketch:

void setup() umbenennen zu ==> void DhtSetup()

void loop() umbenennten ==> void DhtLoop()

Dann kopierst Du beide Programme untereinander weg in einen neuen Sketch und schreibst ans Ende neue setup() und loop() Funktionen, die die alten Funktionen aufrufen:

void setup() { motorSetup(); DhtSetup(); }

void loop() { motorLoop(); DhtLoop(); }

Das wird dann wegen der "delay(2000)" in der DhtLoop zu schrecklich lahmen Reaktionszeiten bei der Motorsteuerung führen, die dann bis zu 2 Sekunden lang nicht reagieren wird.

Da mußt Du Dir für die DhtLoop natürlich was einfallen lassen, um das große delay() da weg zu bekommen. Z.B. beim Eingang in die Funktion den letzten Stand des millis()-Timers merken und vergleichen, und die Funktion gleich wieder ohne Temperaturmessung verlassen, wenn sie innerhalb der letzten 2 Sekunden schon mal aufgerufen wurde.

Du kannst in einem Sketch auch mehrere Tabs haben. Der DHT hätte dann seinen eigenen Tab - das ganze wäre dann übersichtlicher.

Mit STRG + Umschalt + N bekommst du einen neuen Tab. Dann musst du die DHT Funktionen wie von jurs beschrieben umbenennen und reinkopieren.

Eine Anmerkung noch: Variablen, die in einem Tab deklariert wurden, kann nicht in jedem Tab darauf zugegriffen werden. Diese müssten dann im Main Tab deklariert werden.

Vielen Dank für die super Hilfe , jetzt funktioniert es.

Auf zum nächsten Projekt. 8)

Dank.