TextFinder and Ethercard

Hallo mede gebruikers,

Had deze vraag ook al in het Engels geplaatst maar misschien fijn om hier ook in het Nederlands over te praten.

Ik heb de volgende code:

#include <SoftwareSerial.h>
#include <EtherCard.h>
#include <TextFinder.h>

//Ethernet needs this
#define REQUEST_RATE 5000 // milliseconds
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

char website[] PROGMEM = "jecom.nl";

byte Ethernet::buffer[400];
static long timer;

void Beep(){
 digitalWrite(7, HIGH);
 delay(300);
 digitalWrite(7, LOW); 
 delay(300);
 digitalWrite(7, HIGH);
 delay(300);
 digitalWrite(7, LOW); 
}



// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  Serial.println((const char*) Ethernet::buffer + off);
  Beep();
}

//Parallax RFID Reader 
#define RFIDEnablePin 2 //Pin that enables reading. Set as OUTPUT and LOW to read an RFID tag
#define RFIDSerialRate 2400 //Parallax RFID Reader Serial Port Speed

//Using SoftwareSerial Library to locate the serial pins off the default set
//This allows the Arduino to be updated via USB with no conflict
#define RxPin 5 //Pin to read data from Reader 
#define TxPin 4 //Pin to write data to the Reader NOTE: The reader doesn't get written to, don't connect this line.
SoftwareSerial RFIDReader(RxPin,TxPin);

String RFIDTAG=""; //Holds the RFID Code read from a tag
String DisplayTAG = ""; //Holds the last displayed RFID Tag

void setup() 
{
  // RFID reader SOUT pin connected to Serial RX pin at 2400bps
  RFIDReader.begin(RFIDSerialRate);

  // Set Enable pin as OUTPUT to connect it to the RFID /ENABLE pin
  pinMode(RFIDEnablePin,OUTPUT); 
  pinMode(7, OUTPUT);

  // Activate the RFID reader
  // Setting the RFIDEnablePin HIGH will deactivate the reader
  // which could be usefull if you wanted to save battery life for
  // example.
  digitalWrite(RFIDEnablePin, LOW);

  Serial.begin(9600);           // set up Serial library at 9600 bps
  
   Serial.println("\n[getDHCPandDNS]");
  
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");

  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
  
  ether.printIp("My IP: ", ether.myip);
  // ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
  ether.printIp("Server: ", ether.hisip);
  Beep();
  timer = - REQUEST_RATE; // start timing out right away

}

void loop() 
{
  ether.packetLoop(ether.packetReceive());
  if(RFIDReader.available() > 0) // If data available from reader
  { 
    ReadSerial(RFIDTAG);  //Read the tag number from the reader. Should return a 10 digit serial number
  }

  //This only displays a tag once, unless another tag is scanned
  if(DisplayTAG!=RFIDTAG)
  {
    DisplayTAG=RFIDTAG;
    Serial.println(RFIDTAG);
    delay(1000);
     digitalWrite(7, HIGH);
 delay(300);
 digitalWrite(7, LOW); 
    if (millis() > timer + REQUEST_RATE) {
    timer = millis();
    Serial.println("\n>>> REQ");
    char RFT[25];
    DisplayTAG.toCharArray(RFT,25);

    ether.browseUrl(PSTR("/frizzbar.php?tag="), RFT, website, my_result_cb);
    delay(1000);
    
   

    
    
  }
  }
}


// Magical stuff below

void ReadSerial(String &ReadTagString)
{
  int bytesread = 0;
  int  val = 0; 
  char code[10];
  String TagCode="";

  if(RFIDReader.available() > 0) {          // If data available from reader 
    if((val = RFIDReader.read()) == 10) {   // Check for header 
      bytesread = 0; 
      while(bytesread<10) {                 // Read 10 digit code 
        if( RFIDReader.available() > 0) { 
          val = RFIDReader.read(); 
          if((val == 10)||(val == 13)) {   // If header or stop bytes before the 10 digit reading 
            break;                         // Stop reading 
          } 
          code[bytesread] = val;           // Add the digit           
          bytesread++;                     // Ready to read next digit  
        } 
      } 
      if(bytesread == 10) {                // If 10 digit read is complete 

        for(int x=0;x<10;x++)              //Copy the Chars to a String
        {
          TagCode += code[x];
        }
        ReadTagString = TagCode;          //Update the caller
        while(RFIDReader.available() > 0) //Burn off any characters still in the buffer
        {
          RFIDReader.read();
        } 

      } 
      bytesread = 0;
      TagCode="";
    } 
  } 
}

Bij elkaar geschraapt.

Zoals jullie kunnen zien wacht hij op een RFID tag die hij dan in een URL zet en naar een pagina transporteert.
Ik krijg dan van die pagina een inhoud terug met de volgende waardes:
hier nu nog kopie van de TAG

Met TextFinder wil ik die code in een integer zetten of iets anders dat ik kan vergelijken of gebruiken. Alleen weet ik niet hoe ik dit precies kan doen en welke stream ik moet gebruiken om dit waar te maken.

Dieter
Welkom op het nederlandse forum.
Wat mij niet zo duidelijk is aan je vraag is waarom je textfinder wilt gebruiken. Je hebt een string en je weet dat die string een getal voorstelt. Dan kan je toch makkelijk met

long rfIdTag= atol(RFIDTAG);

Of mis ik iets?
Met vriendelijke groet
Jantje

Hoi Jantje,

Hartelijk dank!

Nee, het gaat in dit geval niet om RFIDTAG maar om de pagina die ik terug krijg.

In de code gaat het om:

Serial.println((const char*) Ethernet::buffer + off);

Deze lijn spuugt de pagina uit die ik terug krijg en de content van die pagina bevat een "code/string/oid" die ik wil vergelijken met een aantal waarde en dan een actie uitvoeren. (Leg ik het zo duidelijk uit?)

Zoiets?

 void zoek_pagina(){
          
              //zoek naar pagina's
 
          int index_start = HttpHeader.indexOf('/');
          int index_stop = HttpHeader.indexOf(' ',index_start);
 
         for (int i = index_start; i <= index_stop; i++){
         char c=  HttpHeader.charAt(i);
          Pagina =  Pagina + c;
       }
        
        if (Pagina.startsWith("/start_stop_knop")) {  
        
          if (Pagina.length() > 8){
            if (Pagina.charAt(7) == '?'){
       
            int index_start = Pagina.indexOf('?');
            int index_stop = Pagina.indexOf(' ',index_start)-1;
                 
            for (int i = index_start + 1; i <= index_stop; i++){
            char c=  Pagina.charAt(i);
            Dataregel =  Dataregel + c;
            }

            Pagina = "/start_stop_knop ";

Dit is welliswaar voor zoeken in een HttpHeader,
maar het princiepe is min of meer hetzelfde.

PS.

 }}}}

Ja, zo zou het ook kunnen maar ik dacht dat TextFinder makkelijk zou werken :grin:

Het probleem is dat ik uit een voorbeeld heb dat die Ethercard informatie uitspuugt naar de seriele monitor maar dat ik geen enkel idee heb hoe ik iets met die informatie kan.

TextFinder kan iets uit een stream halen, maar hoe zorg ik dat die stream mijn pagina is? Als ik een Ethernet shield had dan was het niet zo lastig, maar 7 euro ipv 35 veranderd de zaak!

Ik snap het niet.
Wat heb je aan een Ethernetcard, als je toch serieel communiceerd?

Maar goed.

Als je met de Ethernetcard wilt communiceren, moet je toch in staat zijn, die Arduino een website te laten maken, een "Hallo Wereld, dat is stap 1.
De Arduino is dan server.
Ik zag een dergelijk subroutinetje NIET in de librarie staan zo snel, maar ik ben ervan overtuigd dat dat kan.

En Serieel communiceren, voor Linux:

Voor Windows heb ik gelukkig geen idee;-)

Hoi Rikky,

Uiteindelijk moet het gewoon over Ethernet werken! Overigens was het geen probleem om verbinding te maken met mijn router en een IP adres toegewezen te krijgen over DHCP.

Ik snap wat je bedoelt, maar ik gebruik arduino niet als server maar als client. Door middel van de link kan ik informatie verzenden: iets.php?id=123 verstuurd id=123 naar de php pagina.

Maar wat ik wilde is gelukt!