Verwendung von Teleduino API und Erweiterung dieser!

Hallo zusammen,

im Rahmen eines Projektes verwende ich die Teleduino API um den Arduino Mega 2560 über das Internet zu steuern. Wenn ich dafür das Beispiel Programm von der API verwende funktioniert die Verbindung mit dem Internet wunderbar und ich kann meinen Arduino Controller steuern. ( Pins einschalten, ausschalten usw.)

Zusätzlich zu dem Beispielprogramm von Teleduino habe ich ein Programm geschrieben das den Arduinio ohne Internetverbindung steuert. Im Printip ist dieses Programm relativ simpel. Es liest von Sensoren (Temp, Bodenfeuchtigkeit, Licht) Daten aus und schält je nach den Ausgelesen Daten verschiedene pins auf HIGH oder nicht.

Nun habe ich versucht diese beiden Programme in ein Programm zu verpacken und es funktioniert nichts. Ich kann die Fehler auch nicht nachvollziehen. Mal verbindet sich das Programm mit dem Internet, mal nicht. Die Werte werden an sich ausgelesen aber die entspechenden PINS werden nicht richtig gesetzt.

Kennt sich jemand mit Teleduino aus? Auch mit der Erweitung des Programmes?

Anbei findet ihr noch die Progamme

Vielen Dank im Vorraus
David

Beispielprogramm von Teleduino:

#include <EEPROM.h>
#include <Servo.h>
#include <Wire.h>
#include <Teleduino2560.h>

#include <SPI.h>
#include <Ethernet.h>

// User configurable variables
byte useDhcp = true;
byte useDns = true;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x47, 0xF7 };
IPAddress deviceIp(192, 168, 1, 100); // Only if useDhcp is false
IPAddress gatewayIp(192, 168, 1, 1); // Only if useDhcp is false
IPAddress dnsIp(192, 168, 1, 1); // Only if useDhcp is false
IPAddress subnet(255, 255, 255, 0); // Only if useDhcp is false
IPAddress serverIp(173, 230, 152, 173); // Only if useDns is false
char serverName[] = "us01.proxy.teleduino.org"; // Only if useDns is true
unsigned int serverPort = 5353; // Can be set to either 53 or 5353
byte statusLedPin = 8;

// User configurable key, this is used to authenticate with the proxy server
// This is checked against the EEPROM on boot and written if necessary
// The proxy server retreives the key from the EEPROM
byte key[] = { 0x00, 0x00, 0x99, 0x54,
               0x8D, 0x33, 0x7B, 0xD9,
               0x50, 0x00, 0x00, 0xD7,
               0xCD, 0xFC, 0xB8, 0x27 };

// Other required variables
byte data[257];
byte dataLength;
byte hexStage;
unsigned long lastInstruction = 0;
unsigned long lastRefresh = 0;
byte stage = 0;

// Declare client object
EthernetClient Client;

void setup()
{   
  // This is here purely to add a bit of padding to the sketch to fix a compiling bug
  // http://arduino.cc/forum/index.php/topic,60649.0.html
  EEPROM.read(0);
  
  // Load presets
  Teleduino2560.loadPresets();
  
  // Set status LED pin
  Teleduino2560.setStatusLedPin(statusLedPin);

  Teleduino2560.setStatusLed(1); // Initialisation
  // Check the EEPROM header and check to see if the key is correct
  // This is to ensure the key is not cleared from the EEPROM
  if(EEPROM.read(0) != '#')
  {
    EEPROM.write(0, '#');
  }
  if(EEPROM.read(1) != 1)
  {
    EEPROM.write(1, 1);
  }
  if(EEPROM.read(2) != '#')
  {
    EEPROM.write(2, '#');
  }
  if(EEPROM.read(395) != '#')
  {
    EEPROM.write(395, '#');
  }
  for(byte i = 0; i < 16; i++)
  {
    if(EEPROM.read(396 + i) != key[i])
    {
      EEPROM.write(396 + i, key[i]);
    }
  }
  if(EEPROM.read(412) != '#')
  {
    EEPROM.write(412, '#');
  }

  // Start network and attempt to connect to proxy server
  Teleduino2560.setStatusLed(2); // Network configuration
  if(useDhcp)
  {
    if(!Ethernet.begin(mac))
    {
      Teleduino2560.setStatusLed(2, false, 10000);
      Teleduino2560.reset();
    }
  }
  else
  {
    Ethernet.begin(mac, deviceIp, dnsIp, gatewayIp, subnet);
  }
  delay(1000);

  Teleduino2560.setStatusLed(3); // Connect to server
  if((useDns && !Client.connect(serverName, serverPort)) || (!useDns && !Client.connect(serverIp, serverPort)))
  {
    Teleduino2560.setStatusLed(3, false, 10000);
    Teleduino2560.reset();
  }
  lastInstruction = millis();
   
}

void loop()
{
 ethernetConnection();
}

void ethernetConnection() {

 if(Client.connected())
  {
    // What we need to do depends on which 'stage' we are at
    switch(stage)
    {
      case 0: // Wait for start byte
        if(Client.available())
        {
          char c = Client.read();
          if(c == '?')
          {
            stage++;
          }
        }
        break;
      case 1: // Reset variables
        dataLength = 0;
        hexStage = 0;
        stage++;
        break;
      case 2: // Instruction byte
        if(Client.available())
        {
          char c = Client.read();
          if(c == '?')
          {
            stage = 1;
            break;
          }
          else if(c == '\r' || c == '\n' || c == '.')
          {
            stage = 0;
            break;
          }
          if(!hexStage)
          {
            data[0] = Teleduino2560.hexDecode(c) * 16;
          }
          else
          {
            data[0] += Teleduino2560.hexDecode(c);
          }
          hexStage = !hexStage;
          if(!hexStage)
          {
            stage++;
          }
        }
        break;
      case 3: // Data length byte
        if(Client.available())
        {
          char c = Client.read();
          if(c == '?')
          {
            stage = 1;
            break;
          }
          else if(c == '\r' || c == '\n' || c == '.')
          {
            stage = 0;
            break;
          }
          if(!hexStage)
          {
            data[1] = Teleduino2560.hexDecode(c) * 16;
          }
          else
          {
            data[1] += Teleduino2560.hexDecode(c);
          }
          hexStage = !hexStage;
          if(!hexStage)
          {
            stage++;
          }
        }
        break;
      case 4: // Data
        if(Client.available())
        {
          char c = Client.read();
          if(c == '?')
          {
            stage = 1;
            break;
          }
          else if(c == '\r' || c == '\n' || c == '.')
          {
            if(dataLength == data[1])
            {
              stage++;
              break;
            }
            else
            {
              stage = 0;
              break;
            }
          }
          if(!hexStage)
          {
            data[2 + dataLength] = Teleduino2560.hexDecode(c) * 16;
          }
          else
          {
            data[2 + dataLength] += Teleduino2560.hexDecode(c);
          }
          hexStage = !hexStage;
          if(!hexStage)
          {
            dataLength++;
          }
        }
        break;
      case 5: // Execute instruction and return result
        Teleduino2560.instruction(data);
        Client.write('!');
        for(int i = 0; i < data[1] + 2; i++)
        {
          Client.write(Teleduino2560.hexEncode(data[i] / 16));
          Client.write(Teleduino2560.hexEncode(data[i] % 16));
        }
        Client.write('\n');
        lastInstruction = millis();
        stage = 0;
        break;
    }
  }
  else
  {
    Teleduino2560.setStatusLed(10);
    Teleduino2560.reset();
  }

  // Has the instruction timeout been reached?
  if(millis() - lastInstruction > 30000)
  {
    Client.flush();
    Client.stop();
    Teleduino2560.setStatusLed(9);
    Teleduino2560.reset();
  }

  // Process refreshes every 50ms
  if(millis() - lastRefresh >= 50)
  {
    Teleduino2560.pinTimers();
    Teleduino2560.shiftRegisterTimers();
    Teleduino2560.shiftRegisters();
    lastRefresh = millis();
  }

  // Check to see if reset has been requested
  Teleduino2560.checkReset(); 
}

Selbstgeschriebenes Programm:

#define LIGHTSENSOR A1
#define LED 4

void setup(){
  Serial.begin(9600);
  delay(300);//Let system settle
  Serial.println("Humidity, temperature und Bodenfeuchtigkeit \n\n");
  pinMode(LED, OUTPUT);
  delay(1000);//Wait rest of 1000ms recommended delay before accessing sensor
}//end "setup()"

void loop(){
  readLight();
  delay(1000);
}

void readLight(){
  int lightValue = analogRead(LIGHTSENSOR);
  Serial.print("Lichtverhältnis ANALOG: ");
  Serial.println(lightValue);
  
  if(lightValue > 200) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }

Zusammengesetztes Programm ( Habe ethernetConnection, setup() und VAriablen entfernt da equivalent zu beipielprogramm ist):

// define digital pins
#define LED 4
// define analog pins
#define LIGHTSENSOR A1

void setup()
{
  lastInstruction = millis();

  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop()
{
 readLight();
 delay(1000);
 ethernetConnection();
}
void readLight(){
  int lightValue = analogRead(LIGHTSENSOR);
  Serial.print("Lichtverhältnis ANALOG: ");
  Serial.println(lightValue);

  if(lightValue > 200) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }  
}  

void ethernetConnection() {
// equvalent zu Beispielprogramm
}

Habe ethernetConnection, setup() und VAriablen entfernt da equivalent zu beipielprogramm ist

Hast sie aber drin in deinem kombinierten Programm ?

Wenn man dir glauben soll, dass da das Problem nicht liegt, hängst also nur an dem delay(1000) in deinem Kombi-Prtogramm.

Bau das delay(1000) doch spasseshalber mal in "Teleduino" - Beispielprogramm loop ein ein, und schau ob es immer noch funktioniert.
Vermutlich nicht so gut, denn da sehe ich z.B.

// Process refreshes every 50ms
  if(millis() - lastRefresh >= 50)
 ...

Aber Teleduino kenn ich nicht, leider

Hast sie aber drin in deinem kombinierten Programm ?

Ja in meinem Programm sind die Varialen drin. Habe diese nur für den Post entfernt da dieser auf 9000 Zeichen beschränkt ist.

Das heist wenn ich dich richtig verstehe ist es nicht gut das ich den delay(1000) in das kombinierte Programmübernommen habe.
Habe den delay in das Beispielprogramm eingebaut und wie du gesagt hast funktioniert die Verbindung nun nicht mehr.
Nun schliese ich draus das ich keine delays in meinem kombinierten Programm verwenden darf. Gibt es eine mögliche alternative dazu?

Vielen Dank für die schnelle Antwort.

Gibt es eine mögliche alternative dazu?

Aber sicher. Der erste Schritt ist "BlinkWithoutDelay".
Wenn du etwas nur jede Sekunde machen willst, merkst du dir, wann es das letzte Mal dran war, und fragst ab, ob das länger als 1 Sekunde her ist.

void loop()
{
  static unsigned long lastreadLight;
  if (millis() - lastreadLight > 1000) 
  { 
    lastreadLight = millis();
    readLight();
  }
  ethernetConnection();
}

Hallo,

Funktioniert die Api bei dir noch? Ich bekomme nur eine 6mal blinkende led und die Meldung Apo ungültig....

Gruß

Thomas