Pin status werden nicht aktuell gehalten

Hallo

Mein Arduino mega 2560 fragt einige pins ab und versendet die dann über ein WIFI shield.
Verändere ich aber den status eines pins vergeht einige zeit bis es sich bemerkbar macht.
Ich habe es schon mit digitalReadFast versucht was aber keinen effekt hatte.

Main:

#include <SD.h>

#include"Sitze.h"
#include "Filemen.h"//holt  daten von der sd
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>
char filename[] = "test.txt";
int port = 1511;
int status = WL_IDLE_STATUS;     // the Wifi radio's status
IPAddress server(192,168,43,1); //wird im setup mit der getawey ip bestückt
WiFiClient client;
int time = 0; //sende intervall vom datensatz 
String maca = "";// macadresse


Filemen sdmen;
Sit as;

void ssetup(){
  Serial.begin(9600);  
}


void lloop(){
  as.get_data_d("test","test");
  Serial.println("data");
}


void setup()
{ 
  Serial.begin(9600); 
  pinMode(10, OUTPUT);
  digitalWrite(17,HIGH);  //reset
  sdmen.set_daten();
  as.mount();//Set OUTPUT/INPUT



  Serial.println("Attempting to connect to WPA network...");  
  
  byte mac[6];
  char pw[20];
  char ssid[20];
  sdmen.get_pw().toCharArray(pw,20);
  sdmen.get_ssid().toCharArray(ssid,20);
  
  
  WiFi.macAddress(mac);    
  maca =  String(mac[5],HEX);
  maca += String(":");
  maca += String(mac[4],HEX);
  maca += String(":");
  maca += String(mac[3],HEX);
  maca += String(":");
  maca += String(mac[2],HEX);
  maca += String(":");
  maca += String(mac[1],HEX);
  maca += String(":");
  maca += String(mac[0],HEX);
  
  
  status = WiFi.begin(ssid,pw); 
  
  if ( status != WL_CONNECTED) {
    Serial.println("wifi not connect");
    reboot();    
  }  
  else{    
    Serial.println("Connected to network");
    //Serial.println(WiFi.gatewayIP()[1]);
    server[0] = WiFi.gatewayIP()[0];
    server[1] = WiFi.gatewayIP()[1];
    server[2] = WiFi.gatewayIP()[2];
    server[3] = WiFi.gatewayIP()[3];
   
    if(client.connect(server,port)){      
      Serial.println("port connect");
    }
  }
}


void loop()
{
  String teil = as.get_data_Fast(sdmen.get_akey(),maca);//maca mac adresse, 
  client.println(teil);//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  Serial.println(teil);

  
  
  if(!client.connected() )
  {
    Serial.println("Verbindung verloren");
    client.stop();
    reboot();      
  }
 
}

sitz.cpp

#include <Arduino.h>
#include "Sitze.h"
#include "digitalWriteFast.h"

#define DEB 0

Sit::Sit()
{
   Sit::pin = 10;
   //pins der sensoren
   Sit::pinarr[0] = 2;
   Sit::pinarr[1] = 3;
   Sit::pinarr[2] = 22;//4
   Sit::pinarr[3] = 5;
   Sit::pinarr[4] = 6;
   Sit::pinarr[5] = 8;
   Sit::pinarr[6] = 9;
   Sit::pinarr[7] = 14;
   Sit::pinarr[8] = 15;
   Sit::pinarr[9] = 16;

   int one = 23;
   for(int i = 10;i < 36;i++)
   {
     Sit::pinarr[i] = one; 
     one++;
   }
   
   create();  
   set_zustand();
}

int Sit::get_gurt(int f) //liest den pin für den gurt des sitzes f aus 
{
  int out = 0;
  for(int i =0; i < ARRLEN;i++)
  {
    if(f == i)
    {
      out = digitalRead(Sit::reihe[i][1]);
    }  
  }
  return out;
}


int Sit::get_sitz(int f)//liest den pin für die Sitzfläche des sitzes f aus 
{
  int out = 0;
  for(int i =0; i < ARRLEN;i++)
  {
    if(f == i)
    {
      out = digitalRead(Sit::reihe[i][2]);
    }  
  }
  return out;
}


int Sit::get_zustand(int f)//liest den wert für den zutand(I/O) des sitzes f aus 
{
  int out = 0;
  for(int i =0; i < ARRLEN;i++)
  {
    if(f == i)
    {
      out = digitalRead(Sit::reihe[i][0]);
    }
  }
  return out;
}



String Sit::get_data_d(String key_sd,String mac ){

  String tmp  = "#," + key_sd + ","+mac +","; 
  for(int i =0; i < ARRLEN;i++){
    tmp.concat(digitalRead(Sit::reihe[i][0]));
    tmp.concat(digitalRead(Sit::reihe[i][1]));
    tmp.concat(digitalRead(Sit::reihe[i][2]));
    tmp.concat(",");
  }
  tmp.concat("#");
  //Serial.println(tmp);
  return tmp;

}


String Sit::get_data_Fast(String key_sd,String mac ){

  String tmp  = "#," + key_sd + ","+mac +","; 
  for(int i =0; i < ARRLEN;i++){
    tmp.concat(digitalReadFast(Sit::reihe[i][0]));
    tmp.concat(digitalReadFast(Sit::reihe[i][1]));
    tmp.concat(digitalReadFast(Sit::reihe[i][2]));
    tmp.concat(",");
  }
  
  tmp.concat("#");
  //Serial.println(tmp);
  return tmp;

}



String Sit::get_data(String key_sd,String mac){//modeliert einen string der die werte der sitzgruppe zusammenfast{
  
  String mess = "#," + key_sd + ","+mac;
  mess.concat(",");  
  for(int i =0; i < ARRLEN;i++)
  {
      // zustand_gurt_sitz
      mess.concat(Sit::get_zustand(i));
      mess.concat(Sit::get_gurt(i));  
      mess.concat(Sit::get_sitz(i)); 
      mess.concat(",");
     // Serial.print("Lese aus");
  }
  mess.concat("#");
  return mess;

}

void Sit::showSit()
{
  for(int i=0; i<ARRLEN;i++)
  {
    Serial.println();
    Serial.print("Nr. : ");
    Serial.println(i);
    Serial.print("Zustand : ");
    Serial.println(Sit::reihe[i][0]);

    Serial.print("Gurt Pin : ");
    Serial.print(Sit::reihe[i][1]);
    Serial.print("\t ");
    Serial.println(digitalRead(Sit::reihe[i][1]));
    
    Serial.print("Sitz Pin : ");
    Serial.print(Sit::reihe[i][2]);
    Serial.print("\t ");
    Serial.println(digitalRead(Sit::reihe[i][2]));
  }
}

void  Sit::create()//pins werden sitze zugeteilt
{
  int op = 0;
  for(int i =0;i<ARRLEN;i++)
  {
     Sit::reihe[i][0] = 0;
     Sit::reihe[i][1] = Sit::pinarr[op];
     Sit::reihe[i][2] = Sit::pinarr[op+1];     
     op = op +2;
  }
}

void Sit::set_zustand()//Fragt einen schalter x ab, ob sitz x aktiv ist
{
  digitalWrite(19,HIGH);
  for(int i =0;i<ARRLEN;i++)
  {
    Sit::reihe[i][0] = digitalRead(Sit::reihe[i][1]);  
    #if DEB
    Serial.println();
    Serial.print("Pin: ");
    Serial.print(Sit::reihe[i][1]);
    Serial.print("  |  wert : ");
    Serial.print(digitalRead(Sit::reihe[i][1]));
    Serial.println();
    #endif
  }
  digitalWrite(19,LOW);
}

void Sit::mount()//mountet pins , die fuer das programm benutzt werden
{
  for(int i =0; i< (ARRLEN*2);i++ ){
    pinMode(pinarr[i],INPUT); 
    //digitalWrite(pinarr[i],LOW);
   
  }
  pinMode(17,OUTPUT);//analog 5 (UNO)// für den reset 
}



void reboot()
{
  Serial.println("REBOOT,  i kill my self ");
  Serial.println();
  delay(1000);
  digitalWrite(17,LOW);
  while(1);
}

sitz.h

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

#ifndef SIT_H
#define SIT_H
#define ARRLEN 18


class Sit
{
  private:
    int reihe[ARRLEN][3];
    int cs;
    int  pin;
    int pinarr[ARRLEN];
    
    
  public:
   
    Sit();
    void set_zustand();
    void create();
    void showSit();// ausgabe über die seriellen
    int get_gurt(int);//sensor abfrage
    int get_sitz(int);//Sensor abfrage
    int get_zustand(int);//abfrage sitz I/O
    String get_data();// modeliert einen string #,key,data,data,data,data,data,#
    String get_data(String key); //key für die daten 
    String get_data(String key,String macad); //key für die daten 
    String get_data_d(String key,String macad); //key für die daten //direkter zugrif auf member
    String get_data_Fast(String key,String macad);
    void mount();
};

void mount();//mount der wichtigen 
void reboot();// reset funktion // programm startet neu 

#endif

Du solltest das F() Makro benutzen um RAM zu sparen.
Statt Serial.print("text"); oder client.print("text");
Serial.print(F("text")); oder client.print(F("text"));
Das macht es aber nicht schneller.
Grüße Uwe

digitalReadFast() hat hier keinen Effekt, da dazu die Pin Nummer zur Compile-Zeit fests stehen muss. Man kann die Pins daher nicht über Arrays ansprechen

Meine erste schritt ware warscheinlich das client.println(teil) raus zu holen um zu sehen wo die delay ist.
When die status update onle client.println ueber die serielle schnittstelle gut functioniert weist du das die delay in client.println ist.

Mann konnte auch die as.get_data rausnehemn und eine feste string senden, dass wurde dan die delay nog weiter einschranken auf die sub-routine. Und auch die client.connected abfrage kann man rausnehem.

Diese schritten sollte eine guten anweisung geben woh dass delay im sketch passiert.

Viel Spass,
Danke,
Guido

habe mal ein einfaches auslesen in einer loop gemacht.

int inpin =2;

void setup(){
  Serial.begin(9600);
  pinMode(inpin,INPUT);
  
  
}

void loop(){
  Serial.println(digitalRead(inpin));
  delay(100);

}

Lege ich eine brücke auf 5v. Die ausgabe reagiert und gibt eine 1 aus. Bei der trennung vergehen ca. 3 Sek bis die ausgabe eine zeigt. Woran Kann das liegen ?

Leg Masse an, dann hast du gleich ne 0. :wink: Eingänge solltest du nie frei un der Luft hängen lassen, immer einen Pull-up- oder einen Pull-down-Widerstand verwenden!