EPA20 EPaper

Sehr geehrte Community,

Ich habe zwei kleine Probleme bei mir die ich irgendwie schlecht beheben kann.

In meinem Projekt verwende ich einen Arduino Uno, GSM Shield und ein ePaper shield(EPA20-A Bibliothek sende ich mit da die so nicht existiert)

Bei meinem projekt versuche ich eine SMS auszulesen und auf dem Display anzuzeigen und das anderstrum auch ich sende eine SMS und will diese auf einen anderen Arduino mit den Gleichen Shield anzeigen lassen.

Hier mal der Sender die stellen wo ich bräuchte makiere ich dick und unterstrichen.

#include <GSM.h>
#include <Arduino.h>
#include <SPI.h>
#include <epa20.h>
#include <logo_ea.h>
#include <font_6x8.h>
#include <font_8x8.h>
#include <font_8x16.h>
#include <font_16x32nums.h>

// PIN Number
#define PINNUMBER ""

// Initialisiere Bibliotek
GSM gsmAccess;
GSM_SMS sms;
epa20 EPA20;

//Telefonnummer
char remoteNumber[20]= "";  

char charbuffer[20];

void setup()
{
 // initialisiere Seriele ausgabe
 Serial.begin(9600);
 EPA20.initialize(10,0,0,0,9,8);
 EPA20.clear();
 //DEBUG
 Serial.println("SMS SenderSystem");
 //NORMAL
 EPA20.clear();
 EPA20.string(43,54,font_8x16,"Sendesystem",BLACK,WHITE);
 EPA20.string(50,38,font_8x16,"startet...",BLACK,WHITE);
 EPA20.update();

 // Verbindungsstatus
 boolean notConnected = true;

 while(notConnected)
 {
   if(gsmAccess.begin(PINNUMBER)==GSM_READY)
     notConnected = false;
   else
   {
     //DEBUG
     Serial.println("Nicht verbunden(SIM Karten Fehler/Falsche Pin");
     //NORMAL
     EPA20.clear();
     EPA20.string(25,54,font_8x16,"SIM KARTEN ERROR",BLACK,WHITE);
     EPA20.string(73,38,font_8x16,"ODER",BLACK,WHITE);
     EPA20.string(25,20,font_8x16,"PIN NUMMER ERROR",BLACK,WHITE);
     EPA20.update();
     delay(10000);
     //DEBUG
     Serial.println("Gerät wurde ausgeschaltet");
     //Normal
     EPA20.clear();
     EPA20.string(40,54,font_8x16,"SYSTEM WURDE",BLACK,WHITE);
     EPA20.string(35,38,font_8x16,"AUSGESCHALTEN",BLACK,WHITE);
     EPA20.update();
     delay(999999999999999999999);
    }
 }
 //DEBUG
 Serial.println("GSM Initialisiert");
 Serial.println("Daten werden übertragen");
 //Normal
 EPA20.clear();
 EPA20.string(20,38,font_8x16,"GSM Initialisiert",BLACK,WHITE);
 EPA20.update();
 delay(3000);
 EPA20.clear();
 EPA20.string(43,38,font_8x16,"Sende Daten",BLACK,WHITE);
 EPA20.update();
}

void loop()
{
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);

  Serial.print("Sende Nachricht an:");
  Serial.println(remoteNumber);

  //DEBUG
  Serial.println("Sende");
  Serial.println();
  Serial.println("Nachricht:");
  Serial.println(voltage);
  Serial.println("V");

  //NORMAL
  EPA20.clear();
  EPA20.string(40,22,font_8x16,voltage,BLACK,WHITE);
  EPA20.string(110,22,font_8x16,"V",BLACK,WHITE);
  EPA20.update();

  /* send the message
  sms.beginSMS(remoteNumber);
  sms.print(ausgabe);
  sms.endSMS();
  Serial.println("\nCOMPLETE!\n");  
  delay(3000);*/
}
Hier der Empfänger

#include <GSM.h>
#include <Arduino.h>
#include <SPI.h>
#include <epa20.h>
#include <font_6x8.h>
#include <font_8x8.h>
#include <font_8x16.h>
#include <font_16x32nums.h>

// PIN Nummer
#define PINNUMBER ""

GSM gsm;
epa20 EPA20;
GSM gsmAccess; 
GSM_SMS sms;

char remoteNumber[20]; 

void setup()
{
 // initialisiere Serielen Monitor DEBUG
 Serial.begin(9600);
 // initialisiere ePaper
 EPA20.initialize(10,0,0,0,9,8);
 EPA20.clear();

 //DEBUG
 Serial.println("SMS Empfangssystem");
 //NORMAL
 EPA20.clear();
 EPA20.string(33,54,font_8x16,"Empfangssystem",BLACK,WHITE);
 EPA20.string(48,38,font_8x16,"Startet...",BLACK,WHITE);
 EPA20.update();

 // Verbindungsstatus
 boolean notConnected = true;

 // Starte GSM Shield
 while(notConnected)
 {
   if(gsmAccess.begin(PINNUMBER)==GSM_READY)
     notConnected = false;
   else
   {
     //DEBUG
     Serial.println("Nicht verbunden(SIM Karten Fehler/Falsche Pin");
     //NORMAL
     EPA20.clear();
     EPA20.string(25,54,font_8x16,"SIM KARTEN ERROR",BLACK,WHITE);
     EPA20.string(73,38,font_8x16,"ODER",BLACK,WHITE);
     EPA20.string(25,20,font_8x16,"PIN NUMMER ERROR",BLACK,WHITE);
     EPA20.update();
     delay(10000);
     //DEBUG
     Serial.println("Gerät wurde ausgeschaltet");
     //Normal
     EPA20.clear();
     EPA20.string(40,54,font_8x16,"SYSTEM WURDE",BLACK,WHITE);
     EPA20.string(35,38,font_8x16,"AUSGESCHALTEN",BLACK,WHITE);
     EPA20.update();
     delay(999999999999999999999);
    }
 }
 //DEBUG
 Serial.println("GSM Initialisiert");
 Serial.println("Warte auf SMS");
 //Normal
 EPA20.clear();
 EPA20.string(20,38,font_8x16,"GSM Initialisiert",BLACK,WHITE);
 EPA20.update();
 delay(3000);
 EPA20.clear();
 EPA20.string(28,38,font_8x16,"Warte auf Daten",BLACK,WHITE);
 EPA20.update();
}

void loop()
{
char c;
 // If there are any SMSs available()  
 if (sms.available())
 {
   //DEBUG
   Serial.println("Nachricht erhalten von:");

   // Get remote number
   sms.remoteNumber(remoteNumber, 20);
   Serial.println(remoteNumber);

   // This is just an example of message disposal    
   // Messages starting with # should be discarded
   if(sms.peek()=='#')
   {
     Serial.println("Discarded SMS");
     sms.flush();
   }

   // Read message bytes and print them
    while(c=sms.read())
    
      //DEBUG
      Serial.print(c);
      
      //NORMAL
      EPA20.clear();
      EPA20.string(0,0,font_8x16,c,BLACK,WHITE);
      EPA20.update();
      }
     
   Serial.println("\nEND OF MESSAGE");

   // delete message from modem memory
   sms.flush();
   Serial.println("Nachricht gelöscht");
 }

 delay(1000);

}

Zur erklärung
EPA20.clear(); // ist zum löschen des Displays

EPA20.string(0,0,font_8x16,"",BLACK,WHITE); //(x-Koordinate,y-Koordinate,Schriftart,const char *str,Farbe text, Farbe hintergrund)

EPA20.update(); //aktuallisierung des Displays

Hier ist leider das problem das ich beim empfangen ein á ganze zeit auf dem display rausbekomme
und beim senden hab ich das problem das float hier nicht akzeptiert wird ich müsste dies in char oder in ein int umwandeln korrekt

Würde mich freuen wenn einer eine lösung wüsste.

mit freundlichen grüßen

Ray

Damit der Sketch gut gelesen werden kann, auch auf mobilen Geräten, setze den bitte in Code-Tags.
Schaltfläche </> oben links im Editorfenster. Das kannst du auch noch nachträglich machen.

Dann teile uns bitte mit, was in deinem Sketch funktioniert und was nicht funktioniert.

Danke HotSystem,

hab leider noch nicht soviel auf dem forum gemacht habe die 2 codes jetzt als code deklariert und unten das hingeschrieben was ich genau für ein problem habe

mit freundlichen grüßen

Ray

Habe beide Sketche nur kurz überflogen.
Was hast du da für eine Pinnummer drin ?
Das funktioniert sicher nicht.

Und bei dem delay, das du verwendest, kann ich mir nicht vorstellen, dass überhaupt etwas funktioniert.

Edit:
Pinnummer ist schon klar, Gedankenfehler. :wink:

Doch das funktioniert einwandfrei es ist nur die übertragung aufs display im seriellen monitor ist alles korrekt angezeigt nur auf dem display da hab ich entweder nix oder á

Kannst Du denn unabhängig vom Empfang einen konstanten Text aufs Display bringen?

Gruß Tommy

Ja ich kann einen Konstanten text anzeigen es ist nur das anzeigen des ergebnisses der Voltmessung vom senden so wie auch vom empfangen.

c ist ein einzelnes char, kein char-Array.
Suche mal mach Routinen, die von Serial Zeichenketten einlesen. Davon gibt es hier im Forum eine ganze Menge. Das Prinzip kannst Du auch verwenden.

Wenn Du außerdem bei jedem Zeichen das Display löschst, wirst Du nicht viel zu sehen bekommen.

Gruß Tommy

Es geht mutmaßlich um diese Zeile?

EPA20.string(40,22,font_8x16,voltage,BLACK,WHITE);

Das wäre dann dies: const char *str (mich irritiert "const", das wären nur feste Texte)

Versuche mal:

char spannung[10] = {"999.99V"};
...
EPA20.string(40,22,font_8x16,spannung,BLACK,WHITE);

Wenn das geht, dann den Inhalt der Zeichenkette spannung verändern, beispielsweise mit snprintf(spannung,sizeof(spannung), ...).

char spannung[10] = {"999.99V"};

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Anfang"));
}

void loop()
{
  uint16_t sensorValue = analogRead(A0);
  uint32_t voltage = sensorValue * 500UL / 1023UL;
  snprintf(spannung,sizeof(spannung), "%ld.%ld V", voltage/100,voltage%100);
  Serial.print("Text: ");
  Serial.println(spannung);
  Serial.println();
  delay(500);
}

Es müßte auch mit float gehen, will mir aber nicht gelingen :confused:

Applaus an agmue

Ich hab gerade das untere Programm getestet ich bekomme jetzt die werte aufs display so.
leider hab ich diese Zeichenkette nicht ganz verstanden aber es geht :slight_smile: .

Jetzt bekomme ich die Volt auf dem Display angezeigt jetzt muss ich es nur noch anpassen das ich bei 1V auch 1 Volt angezeigt bekomme da auf dem display 0,1V rauskommt

Ich bin mir gerade nicht sicher, ob voltage%100 immer zweistellig, also mit führender Null angezeigt wird. Bitte überprüfen!

Beispiel: Wert 1,04 wird als 1.04 oder 1.4 angezeigt?

Ich habe das jetzt so geschrieben das ich ohne nach kommastelle habe

void Spannungsmessung()
{
  //Spannungsmessung
  uint32_t sensorValue = analogRead(A0);
  uint32_t voltage = sensorValue * 5 / 1023;
  snprintf(Volt,sizeof(voltage), "%ld V", voltage/1,voltage%100);
  
  //Debug
  Serial.println(Volt);
  
  //Normal
  EPA20.clear();
  EPA20.string(0,0,font_8x16,Volt,BLACK,WHITE);
  EPA20.update();
}

leider bekomme ich die andere seite immer noch nicht hin das ich die empfangene sms=c aufs display bekomme :confused:

void loop()
{
 char c;
  // If there are any SMSs available()  
  if (sms.available())
  {
    //DEBUG
    Serial.println("Nachricht erhalten von:");

    // Get remote number
    sms.remoteNumber(remoteNumber, 20);
    Serial.println(remoteNumber);

    // This is just an example of message disposal    
    // Messages starting with # should be discarded
    if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }

    // Read message bytes and print them
    while(c=sms.read())
    
      //DEBUG
      Serial.print(c);
      
      //NORMAL
      EPA20.clear();
      EPA20.string(0,0,font_8x16,c,BLACK,WHITE);
      EPA20.update();
      }
      
    Serial.println("\nEND OF MESSAGE");

    // delete message from modem memory
    sms.flush();
    Serial.println("Nachricht gelöscht");
  

  delay(1000);

}

Bitte schaue Dir die Parameter von snprintf an, m. E. machst Du einen Fehler bei der Länge. Sollte es nicht die Länge der Zeichenkette sein?

Also ich habe jetzt das Empfänger programm so geschrieben das ich jetzt den wert angezeigt bekomme leider bekomme ich diesen in GSM Alphabet nur rein ich habe nur 6 Werte 0-5 V und die hätte ich hier jetzt mit switch case eingegeben aber dies wird komplett ignoriert z.B. ich sage 1 dann bekomme ich die 49 raus auf der anderen seite jetzt wollte ich die 49 wieder auf 1 umwandeln im programm aber switch case wird complett ignoriert hier das Programm.

#include <GSM.h>
#include <Arduino.h>
#include <epa20.h>
#include <font_8x16.h>
#include <font_16x32nums.h>

#define PINNUMBER ""

epa20 EPA20;
GSM gsmAccess;
GSM_SMS sms;

char remoteNumber[20];

void setup() {
  //Seriel initialisieren
  Serial.begin(9600);

  //Display Initialisieren
  EPA20.initialize(10,0,0,0,9,8);
  EPA20.clear();

  //DEBUG
  Serial.println("SMS Empfangssystem");
  //NORMAL
  EPA20.clear();
  EPA20.string(33,54,font_8x16,"Empfangssystem",BLACK,WHITE);
  EPA20.string(48,38,font_8x16,"Startet...",BLACK,WHITE);
  EPA20.update();

  //PIN CHECK
  boolean notConnected = true;
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      //DEBUG
      Serial.println("Nicht verbunden(SIM Karten Fehler/Falsche Pin");
      //NORMAL
      EPA20.clear();
      EPA20.string(25,54,font_8x16,"SIM KARTEN ERROR",BLACK,WHITE);
      EPA20.string(73,38,font_8x16,"ODER",BLACK,WHITE);
      EPA20.string(25,20,font_8x16,"PIN NUMMER ERROR",BLACK,WHITE);
      EPA20.update();
      delay(3000);
      //DEBUG
      Serial.println("Gerät wurde ausgeschaltet");
      //Normal
      EPA20.clear();
      EPA20.string(40,54,font_8x16,"SYSTEM WURDE",BLACK,WHITE);
      EPA20.string(35,38,font_8x16,"AUSGESCHALTEN",BLACK,WHITE);
      EPA20.update();
      delay(999999999999999999999);
    }
  }
  //DEBUG
  Serial.println("GSM Initialisiert");
  Serial.println("Warte auf SMS");
  //Normal
  EPA20.clear();
  EPA20.string(20,38,font_8x16,"GSM Initialisiert",BLACK,WHITE);
  EPA20.update();
  delay(3000);
  EPA20.clear();
  EPA20.string(28,38,font_8x16,"Warte auf Daten",BLACK,WHITE);
  EPA20.update();
}

void loop() {
  Abfrage();
  delay(500);
}

void Abfrage() {
  uint32_t c;
  char Volt[20];

  if (sms.available())
  {
    Serial.println("Nachricht von:");

    sms.remoteNumber(remoteNumber, 20);
    Serial.println(remoteNumber);

    if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }
    
    while(c=sms.read())
      //Serial.print(c);
      snprintf(Volt,sizeof(c), "%ld", c/1,c%100);
      Serial.println(Volt);
      EPA20.clear();
      EPA20.string(0,0,font_8x16,Volt,BLACK,WHITE);
      EPA20.update();
      delay(5000);
      
      switch((int)Volt){
        case 48:
        EPA20.clear();
        EPA20.string(0,0,font_16x32nums,"0",BLACK,WHITE);
        EPA20.update();
        break;
        case 49:
        EPA20.clear();
        EPA20.string(0,0,font_16x32nums,"1",BLACK,WHITE);
        EPA20.update();
        break;
        case 50:
        EPA20.clear();
        EPA20.string(0,0,font_16x32nums,"2",BLACK,WHITE);
        EPA20.update();
        break;
      }

    Serial.println("\nEnde der Nachricht");

    sms.flush();
    Serial.println("Nachricht gelöscht");
  }
}

Du hast in c ein einzelnes Zeichen. Das kannst Du nicht sinnvoll als %ld (long decimal) ausgeben.

Gruß Tommy

Ich weis aber ich hab dies erstmal so behalten wegen dem switch case das ich sagen kann ok die 49 ist die 1 50 die 2 usw. zur vereinfachung erstmal