Twitter Client=> naar eigen account veranderen [OPGELOST!]

Ik wil het twitterclient maken voor school. Maar ik vind niet hoe ik hem moet aanpassen. Nu heb ik al connectie met twitter en lees ik blijkbaar de tweets van een 'RusselOffical' uit.
De bedoeling zou zijn dat ik dan voor elke letter/cijfer/symbool uit de tweet een licht code maak.
bv A= Rood aan, Rood Aan, Rood aan, en dan B= Rood Aan, Rood Aan, en Blauw aan,...
Deze code wou ik gebruiken omdat hij gebruikt maakt van de DHCP om zijn IP-adres te bepalen en ik hem daardoor makkelijk op verschillende plaatsen kon aansluiten.

/*
  Twitter Client with Strings
 
 This sketch connects to Twitter using an Ethernet shield. It parses the XML
 returned, and looks for <text>this is a tweet</text>
 
 You can use the Arduino Ethernet shield, or the Adafruit Ethernet shield,
 either one will work, as long as it's got a Wiznet Ethernet module on board.
 
 This example uses the DHCP routines in the Ethernet library which is part of the
 Arduino core from version 1.0 beta 1
 
 This example uses the String library, which is part of the Arduino core from
 version 0019.  
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 21 May 2011
 by Tom Igoe
 
 This code is in the public domain.
 
 */
#include <SPI.h>
#include <Ethernet.h>


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
IPAddress ip(192,168,1,20);

// initialize the library instance:
EthernetClient client;

const unsigned long requestInterval = 60000;  // delay between requests

char serverName[] = "api.twitter.com";  // twitter URL

boolean requested;                   // whether you've made a request since connecting
unsigned long lastAttemptTime = 0;            // last time you connected to the server, in milliseconds

String currentLine = "";            // string to hold the text from server
String tweet = "";                  // string to hold the tweet
boolean readingTweet = false;       // if you're currently reading the tweet

void setup() {
  // reserve space for the strings:
  currentLine.reserve(256);
  tweet.reserve(150);
  // initialize serial:
  Serial.begin(9600);
  // attempt a DHCP connection:
  Serial.println("Attempting to get an IP address using DHCP:");
  if (!Ethernet.begin(mac)) {
    // if DHCP fails, start with a hard-coded address:
    Serial.println("failed to get an IP address using DHCP, trying manually");
    Ethernet.begin(mac, ip);
  }
  Serial.print("My address:");
  Serial.println(Ethernet.localIP());
  // connect to Twitter:
  connectToServer();
}

void loop()
{
  if (client.connected()) {
    if (client.available()) {
      // read incoming bytes:
      char inChar = client.read();

      // add incoming byte to end of line:
      currentLine += inChar;

      // if you get a newline, clear the line:
      if (inChar == '\n') {
        currentLine = "";
      }
      // if the current line ends with <text>, it will
      // be followed by the tweet:
      if ( currentLine.endsWith("<text>")) {
        // tweet is beginning. Clear the tweet string:
        readingTweet = true;
        tweet = "";
      }
      // if you're currently reading the bytes of a tweet,
      // add them to the tweet String:
      if (readingTweet) {
        if (inChar != '<') {
          tweet += inChar;
        }
        else {
          // if you got a "<" character,
          // you've reached the end of the tweet:
          readingTweet = false;
          Serial.println(tweet);  
          // close the connection to the server:
          client.stop();
        }
      }
    }  
  }
  else if (millis() - lastAttemptTime > requestInterval) {
    // if you're not connected, and two minutes have passed since
    // your last connection, then attempt to connect again:
    connectToServer();
  }
}

void connectToServer() {
  // attempt to connect, and wait a millisecond:
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
    Serial.println("making HTTP request...");
    // make HTTP GET request to twitter:
    client.println("GET /1/statuses/user_timeline.xml?screen_name=arduino&count=1 HTTP/1.1");
    client.println("HOST: api.twitter.com");
    client.println();
  }
  // note the time of this connect attempt:
  lastAttemptTime = millis();
}

Er zit een twitter name in de code en die moet je aanpassen. Om te weten waar die zit moet je de code begrijpen, daarvoor leze men eerst de twitter api documentatie :slight_smile:

Ik heb het uiteindelijk gevonden, niet op https://dev.twitter.com/, want dat was te moeilijk voor mij. Gewoon door 3dagen te googlen.

void connectToServer() {
  // attempt to connect, and wait a millisecond:
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
    Serial.println("making HTTP request...");
  // make HTTP GET request to twitter:
    client.println("GET /1/statuses/user_timeline.xml?screen_name=jariboe&count=1 HTTP/1.1");  // jariboe is de account naam, gewoon dit aanpassen en klaar is klaas. 
    client.println("HOST: api.twitter.com");
    client.println();
  }
  // note the time of this connect attempt:
  lastAttemptTime = millis();
}

Nu nog proberen mijn string deftig te verwerken.

Omdat er aanvankelijk problemen waren met mijn Ethernet shield, had ik al een code uitgeschreven met de Serial Monitor

int leD1 = 8;                
int leD2 = 7;
int leD3 = 6;
int leD4 = 5;
                                        // de led als een integer instellen, dan kan hij verschillende waarden aan nemen
void setup ()
{
Serial.begin(38400);                    //de arduino kan seriele waarden lezen, met een snelheid van 9600 baud/s
  pinMode(leD1, OUTPUT);
  pinMode(leD2, OUTPUT);
  pinMode(leD3, OUTPUT); 
  pinMode(leD4, OUTPUT);
}

void loop()                              // dit is de volledige bassiscode via de serial monitor, hier uit kan zeker al de lichtcode gevormd worden, 
                                         // als er dan moet worden aangepast is het waarschijnlijk enkel de "val"
{   while (Serial.available() == 0);     // pas reageren als er iets is in de serail monitor
   char val = Serial.read();             // het teken direct inlezen
                                         //De "val" is weergegeven als een ASCII-waarde; dit kan zo blijven, want dan is er een aparte en al juiste onder verdeling    
if (val ==97)                            //is de ingegeven waarde a dan...
      {digitalWrite (leD1, HIGH);        //led 1 aan
       delay (1000);                     // laatste actie aanhouden
       digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
       delay (100);
      digitalWrite (leD1, HIGH);        //led 1 aan
       delay (1000);                    // laatste actie aanhouden
       digitalWrite (leD1, LOW);        //led 1 uit en naar de volgende
       delay (100);
       digitalWrite (leD1, HIGH);       //led 1 aan
       delay (1000);                    // laatste actie aanhouden
       digitalWrite (leD1, LOW);        //led 1 uit en naar de volgende
       delay (100);
       digitalWrite (leD1, HIGH);       //led 1 aan
       delay (1000);                    // laatste actie aanhouden
       digitalWrite (leD1, LOW);        //led 1 uit en naar de volgende
       delay (100); }
Serial.println(val);                  
}

Ik hoopte dat ik dan gewoon die 'val' mocht gelijk zetten aan de 'client' dat het dan zou werken. Blijkbaar niet. Zelf snap ik echt niet meer waarom.
Bij de serialmonitor lees in principe toch ook een string die wordt doorgestuurd. Of zijn dit direct Char's ? Is er dan een simpel manier om de string 'client' naar Char's te brengen?
En nog een laatste vraagje is er een trukje om de refresh-rate (ik weet niet de officiele benamming) van twitter te omzeilen bij het testen? Want ik ben blijkbaar al meer dan 150 per uur mijn tweets aan het inlezen.
Mijn code nu:

/*
  Twitter Client with Strings
 
 This sketch connects to Twitter using an Ethernet shield. It parses the XML
 returned, and looks for <text>this is a tweet</text>
 
 You can use the Arduino Ethernet shield, or the Adafruit Ethernet shield, 
 either one will work, as long as it's got a Wiznet Ethernet module on board.
 
 This example uses the DHCP routines in the Ethernet library which is part of the 
 Arduino core from version 1.0 beta 1
 
 This example uses the String library, which is part of the Arduino core from
 version 0019.  
 
 Circuit:
  * Ethern
  et shield attached to pins 10, 11, 12, 13

 
 
 created 21 May 2011
 by Tom Igoe
 
 This code is in the public domain.
 
 */
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {   0x90, 0xA2, 0xDA, 0x07, 0x00, 0x2B };
IPAddress ip(10,25,32,60);

// initialize the library instance:
EthernetClient client;
// de tijd waarmee ge hercheckt word, best hoger dan 1440, want je mag maar zo'n 150 keer de status van twitter aanvragen per uur. 
const int requestInterval = 6000
;  // delay between requests

char serverName[] = "api.twitter.com";  // twitter URL

boolean requested;                   // whether you've made a request since connecting
long lastAttemptTime = 0;            // last time you connected to the server, in milliseconds

String currentLine = "";            // string to hold the text from server
String tweet = "";                  // string to hold the tweet
boolean readingTweet = false;       // if you're currently reading the tweet

// de mogelijke variabelen om te schakelen benoemen
int leD1 = 8;                
int leD2 = 7;
int leD3 = 6;
int leD4 = 5
;

void setup() {
  // de leds als output benoemen
  pinMode(leD1, OUTPUT);
  pinMode(leD2, OUTPUT);
  pinMode(leD3, OUTPUT); 
  pinMode(leD4, OUTPUT);
  
  // reserve space for the strings:
  currentLine.reserve(256);
  tweet.reserve(150);

// initialize serial:
  Serial.begin(9600);
  // attempt a DHCP connection:
  if (!Ethernet.begin(mac)) {
    // if DHCP fails, start with a hard-coded address:
    Ethernet.begin(mac, ip);
  }
  // connect to Twitter:
  connectToServer();
}

void loop()
{
  if (client.connected()) {
    if (client.available()) {
      // read incoming bytes:
      char inChar = client.read();
      // add incoming byte to end of line:
      currentLine += inChar; 
      // if you get a newline, clear the line:
      if (inChar == '\n') {
        currentLine = "";
      } 
      // if the current line ends with <text>, it will
      // be followed by the tweet:
      if ( currentLine.endsWith("<text>")) {
        // tweet is beginning. Clear the tweet string:
        readingTweet = true; 
        tweet = "";
      }
      // if you're currently reading the bytes of a tweet,
      // add them to the tweet String:
      if (readingTweet) {
        if (inChar != '<') {
          tweet += inChar;
        } 
        else {
          // if you got a "<" character,
          // you've reached the end of the tweet:
          readingTweet = false;
          Serial.println(tweet);   
          // close the connection to the server:
          client.stop(); 
        }
      }
    }   
  }
  else if (millis() - lastAttemptTime > requestInterval) {
    // if you're not connected, and two minutes have passed since
    // your last connection, then attempt to connect again:
    connectToServer();
  }
}

void connectToServer() {
  // attempt to connect, and wait a millisecond:
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
     Serial.println("making HTTP request...");
  // make HTTP GET request to twitter:
    client.println("GET /1/statuses/user_timeline.xml?screen_name=jaribeo&count=1 HTTP/1.1");
    client.println("HOST: api.twitter.com");
    client.println();

   if (client ==97)                   //werkt nog niet!
   //is de ingegeven waarde a dan...
      {digitalWrite (leD1, HIGH);        //led 1 aan
       delay (100);                     // laatste actie aanhouden
       digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
       delay (100);
      digitalWrite (leD1, HIGH);        //led 1 aan
       delay (100);                    // laatste actie aanhouden
       digitalWrite (leD1, LOW);        //led 1 uit en naar de volgende
       delay (100);
       digitalWrite (leD1, HIGH);       //led 1 aan
       delay (100);                    // laatste actie aanhouden
       digitalWrite (leD1, LOW);        //led 1 uit en naar de volgende
       delay (100);
  }
}
  // note the time of this connect attempt:
  lastAttemptTime = millis();
}

Ik heb een Uno als basis. Jullie kunnen me echt massa's helpen, ik ben geen programeur en probeer me het zelf te leren. Maar dat gaat soms veel te langzam :~

Misschien helpt het om mijn code eens te proberen. Ik heb het anders aangepakt. Je kan er over lezen in deze forum post:

http://arduino.cc/forum/index.php/topic,93480.0.html

Jouw code is echt veel beter, toch lukt het me nog niet volledig :blush:
Ik heb (denk ik) de tweet naar char's omgezet en dan in een while lus gezet.
Mijn probleem is dat hij volgens mij enkel de eerste letter verwerkt terwijl hij zou moeten in een grote loop gaat tot de karaters 'op' zijn.
Mijn test tweet is abaaabbb. Zodat ik alle 'eerste' letters kan verwerken en zo naar het het ASCCI-alfabet.
Waarschijnlijk is het de omzetting naar de chars waar het fout loopt.

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


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x07, 0x00, 0x2B };
byte ip[] =  { 10,25,32,90}; //change this
byte subnet[] = {255,255,0,0}; //change this
byte gateway[] = {10,25,255,254}; //change this
byte dns[] = {10,56,1,1}; //change this
EthernetClient client;
String TwitterName ="jariboe"; //change this to your own twittername, or follow me ;-)
char tweet[140];
String SearchString ="<title>";
byte charsize;
char serverName[] = "api.twitter.com";  // twitter URL
int leD1 = 8;                
int leD2 = 7;
int leD3 = 6;
int leD4 = 5;

void setup() {
  pinMode(leD1, OUTPUT);
  pinMode(leD2, OUTPUT);
  pinMode(leD3, OUTPUT); 
  pinMode(leD4, OUTPUT);
  // initialize serial:
  Serial.begin(9600);
  // attempt a DHCP connection:
  Ethernet.begin(mac, ip, dns, gateway, subnet);
  // connect to Twitter:
  delay(3000);
}

void loop(){
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
        TextFinder  finder( client,2 );
        Serial.println("making HTTP request...");
        // make HTTP GET request to twitter:
        client.print("GET /1/statuses/user_timeline.rss?screen_name=");
        client.print(TwitterName);
        client.println("&count=1 HTTP/1.1");
        client.println("HOST: api.twitter.com");
        client.println();
        Serial.println("sended HTTP request...");
    while (client.connected()) {
      if (client.available()) {
        Serial.println("looking for tweet...");
        SearchString = SearchString + TwitterName + ": ";
        charsize = SearchString.length() + 1;
        char StartHere[charsize];
        char EndHere[] = "</title>";
        SearchString.toCharArray(StartHere,charsize);
        if((finder.find("<item>")&&(finder.getString(StartHere,EndHere,tweet,140)!=0)))
        Serial.println(tweet);
                         char tweet;
                        {   while (tweet > 0);     // pas reageren als er iets is in de tweet zit
                           Serial.println("in de while lus");
                                             
                      if (tweet == 97 )                       //is de ingegeven waarde a dan... Telt enkel voor chars 
                            {digitalWrite (leD1, HIGH);        //led 1 aan
                             delay (1000);                     // laatste actie aanhouden
                             digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
                             delay (100);
                              Serial.println("in de if lus");}
                      else 
                            {digitalWrite (leD2, HIGH);        //led 2 aan
                              delay (1000);                     // laatste actie aanhouden
                              digitalWrite (leD2, LOW);         //led 2 uit en naar de volgende
                              delay (100);
                              {Serial.println("in de else lus");}
                     }}
                     
  break;
  
  
      }
    }
    delay(1);
    client.stop();
  }
  Serial.println("delay...");
  delay (60000); 
  // don't make this less than 30000 (30 secs), because you can't connect to the twitter servers faster (you'll be banned)
  // off course it would be better to use the "Blink without delay", but I leave that to you.
}

En dit komt dan uit mijn serial monior

connecting to server...
making HTTP request...
sended HTTP request...
looking for tweet...
abaaabbb
in de while lus
in de else lus
delay...

Alvast bedankt voor jullie tijd!

Wat je eigenlijk moet doen, is de twitter in een buffer laden, wat mijn code al doet en in plaats van de buffer dan op de serial monitor te tonen, moet je hem weer laten "onderzoeken".

Dat kan heel simpel door te kijken naar de het eerste teken in de buffer en te vergelijken met een voorwaarde in de trend van if tweet[0] == "a" en dan de tweede: if tweet[1] == "b"

Je moet wel zelf de code schrijven, ik geef jou de aanzet.

Ik heb het getest met jouw systeem en nog krijg ik het niet goed. Als ik gewoon 'if tweet[0] == "a"' er insteek krijg ik een waarschuwing dat hij haakjes verwacht.
Als ik die er bij doe zegt hij dat er fout is namelijk: ' TwitterBeter:60: error: ISO C++ forbids comparison between pointer and integer'
Moet er wel bij zeggen dat ik hiervoor al de lijn 'char tweet' er uit heb gehaald. Met die er in kreeg ik andere fout: 'TwitterBeter:60: error: invalid types 'char[int]' for array subscript'.
:grin:
Graag wil ik mijn code zelf opstellen :slight_smile:
En nog een vraagje als ik werk met if tweet[0] == "a"' vergelijkt hij dan enkel de eerste letter met a of gaat hij dan uiteindelijk alle letters vergelijken daarmee? :cold_sweat:
Ik bedoel moet ik mijn code dan uiteindelijk zo uitwerken:
if tweet[0] == "a"'
if tweet[0] == "b"'
if tweet[0] == "c"'
.....
if tweet[1] == "a"'
if tweet[1] == "b"'
if tweet[1] == "c"'
....
En dat dan tot if tweet[140] == "?"'

Na weekendje sukkelen zou ik graag weer op de rails komen, of de arduino gaat hier nog eens vleugels krijgen :smiley:

probeer effe

if (tweet[0] == 'a')
{
}

Die 'a' werkt, allezins heb ik er geen foutmeldingen meer door. Maar nog krijg ik het niet goed.
De tweetverwerking zelf krijg ik nog altijd niet goed :(. Ik heb het nu zo aangepast:
De 97 staat er in omdat ik zeker wou zijn als hij misschien toch nog op de ASSCI-code zou overgaan, dat ik het dan ook kon verwerken.

Serial.println(tweet);
                          char tweet;
                        {   while (tweet > 0);     // pas reageren als er iets is in de tweet zit
                           Serial.println("in de while lus");
                                             
                      if (tweet == '97' )                       //is de ingegeven waarde a dan... Telt enkel voor chars 
                            {//digitalWrite (leD1, HIGH);        //led 1 aan
                             //delay (1000);                     // laatste actie aanhouden
                             //digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
                             //delay (100);
                              Serial.println("97 verwerkt!");}
                       if (tweet == 'a' )                       //is de ingegeven waarde a dan... Telt enkel voor chars 
                            {//digitalWrite (leD1, HIGH);        //led 1 aan
                             //delay (1000);                     // laatste actie aanhouden
                             //digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
                             //delay (100);
                              Serial.println("a verwerkt!");}
                      else 
                            {//digitalWrite (leD2, HIGH);        //led 2 aan
                              //delay (1000);                     // laatste actie aanhouden
                              //digitalWrite (leD2, LOW);         //led 2 uit en naar de volgende
                              //delay (100);
                              {Serial.println("Niets verwerkt");}
                     }}
                     
  break;

En dat wordt dan

connecting to server...
making HTTP request...
sended HTTP request...
looking for tweet...
abaaabbb
in de while lus
Niets verwerkt
delay...

Mijn tweet is nog altijd abaaabbb.
Ik heb echt het gevoel dat ik er zo dicht bij ben.... Nog iemand een (hopelijk) laatste tip? :stuck_out_tongue:

Joost

De code uit je post kan volgens mij niet compileren.
Ik zie volgende fouten

if (tweet == '97' )

'97' slaat nergens op in C.

Serial.println(tweet);
                          char tweet;

Je gebruikt tweet voor je het declareerd wat niet kan in C.

                          char tweet;
                        {   while (tweet > 0);     // pas reageren als er iets is in de tweet zit

tweet kan van alles bevatten.

while (tweet > 0);

als tweet ==0 is dit een oneindige lus.

Ik snap ook niet hoe deze code kan leiden tot de output die je geeft.

Met vriendelijke groet
Jantje

                      if (tweet == '97' )                       //is de ingegeven waarde a dan... Telt enkel voor chars 
                            {//digitalWrite (leD1, HIGH);        //led 1 aan
                             //delay (1000);                     // laatste actie aanhouden
                             //digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
                             //delay (100);
                              Serial.println("97 verwerkt!");}

Je mist een ; op het einde

voeg ook een

Serial.println(tweet);

toe onder

Serial.println("in de while lus");

Dan weet je wat je binnen krijgt. Misschien krijg je gewoon een 'A' binnen in plaats van een 'a'.

Lees alle opmerkingen van Jantje aandachtig, want ze zijn terecht.

MAAR ...

eerst moet je de code die je gebruikt om te vergelijken, uit de code om de tweet te zoeken, halen.

Laat eerste de tweet ophalen (while connected).
en als dat gebeurt is, vergelijk dan wat er in tweet staat met je voorwaarden.

while (tweet > 0); is nutteloos want de char tweet is altijd > 0.

probeer dit eens voor de void loop:

void loop(){
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
    TextFinder  finder( client,2 );
    Serial.println("making HTTP request...");
    // make HTTP GET request to twitter:
    client.print("GET /1/statuses/user_timeline.rss?screen_name=");
    client.print(TwitterName);
    client.println("&count=1 HTTP/1.1");
    client.println("HOST: api.twitter.com");
    client.println();
    Serial.println("sended HTTP request...");
    memset (tweet,0x03,sizeof(tweet)); //we vullen de tweet met ETX (End of Text)
    while (client.connected()) {
      if (client.available()) {
        Serial.println("looking for tweet...");
        SearchString = SearchString + TwitterName + ": ";
        charsize = SearchString.length() + 1;
        char StartHere[charsize];
        char EndHere[] = "</title>";
        SearchString.toCharArray(StartHere,charsize);
        if((finder.find("<item>")&&(finder.getString(StartHere,EndHere,tweet,140)!=0)))
          Serial.println(tweet);
        break;
      }
    }
    delay(1);
    client.stop();
  }
  Serial.println("start de verwerking ...");
  if (tweet[0] != 0x03) { //als het eerste karakter in de char tweet niet gelijk is aan 0x03, dan staat er dus iets anders bv a of b of q
      for (byte i = 0; i <140; i++){ // we zoeken de a op alle 140 plaatsen
        if (tweet[i] == 'a' ){
          Serial.print("a verwerkt! op plaats: ");
          Serial.println(i); // laat ons zien op welke plaats je een a vond. want mogelijks is dat niet op de eerste plaats in de tweet
        }
      }
    }
  Serial.println("delay...");
  delay (60000); 
  // don't make this less than 30000 (30 secs), because you can't connect to the twitter servers faster (you'll be banned)
  // off course it would be better to use the "Blink without delay", but I leave that to you.
}

Met jullie hulp werkt het zo goed als perfect!
Mijn voorlopig tussen test zijn voor de rest ook super. Van retweet's trek hij hem niets aan en van antwoorden op de tweeds ook niet. En dat was wel de bedoeling. :grin:
Enkel leest hij eenmalig de tweet zelf in en als er een nieuwe verschijnt trek de arduino er zich niks van aan en doet gewoon lustig voort.
@jantje en JO3RI: Willen jullie met naam en toenaam in mijn eindproject ? Want dankzij jullie kreeg ik weer op de rails. Stuur me dan een prive-bericht.

Echt merci! :smiley:

Goed om te horen dat het gelukt is. Zou je zo vriendelijk willen zijn, om het eindresultaat met ons te delen? eventueel met een filmpje (in een nieuwe topic :slight_smile: )

JO3RI:
Goed om te horen dat het gelukt is. Zou je zo vriendelijk willen zijn, om het eindresultaat met ons te delen? eventueel met een filmpje (in een nieuwe topic :slight_smile: )

Ik vind dat beter dan een vermelding.

Groeten uit Belgie
Jantje

Ik vind dat beter dan een vermelding.

ik vind alle twee nog beter :smiley:

Blijkbaar heb ik iets te vroeg gejuigd. Mijn nieuwe tweets leest hij niet (meer) in. Ik ga de code hier nog eens onder zetten, heb enkel maar de a-check er in gezet. Dit om het overzichtelijk te houden.

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


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x07, 0x00, 0x2B };
byte ip[] =  { 10,25,32,90}; //change this
byte subnet[] = {255,255,0,0}; //change this
byte gateway[] = {10,25,255,254}; //change this
byte dns[] = {10,56,1,1}; //change this
EthernetClient client;
String TwitterName ="jariboe"; //change this to your own twittername, or follow me ;-)
char tweet[140];
String SearchString ="<title>";
byte charsize;
char serverName[] = "api.twitter.com";  // twitter URL
int leD1 = 8;                
int leD2 = 7;
int leD3 = 6;
int leD4 = 5;

void setup() {
  pinMode(leD1, OUTPUT);
  pinMode(leD2, OUTPUT);
  pinMode(leD3, OUTPUT); 
  pinMode(leD4, OUTPUT);
  // initialize serial:
  Serial.begin(9600);
  // attempt a DHCP connection:
  Ethernet.begin(mac, ip, dns, gateway, subnet);
  // connect to Twitter:
  delay(3000);
}

void loop(){
  
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
    TextFinder  finder( client,2 );
    Serial.println("making HTTP request...");
    // make HTTP GET request to twitter:
    client.print("GET /1/statuses/user_timeline.rss?screen_name=");
    client.print(TwitterName);
    client.println("&count=1 HTTP/1.1");
    client.println("HOST: api.twitter.com");
    client.println();
    Serial.println("sended HTTP request...");
    memset (tweet,0x03,sizeof(tweet)); //we vullen de tweet met ETX (End of Text)
    while (client.connected()) {
      if (client.available()) {
        Serial.println("looking for tweet...");
        SearchString = SearchString + TwitterName + ": ";
        charsize = SearchString.length() + 1;
        char StartHere[charsize];
        char EndHere[] = "</title>";
        SearchString.toCharArray(StartHere,charsize);
        if((finder.find("<item>")&&(finder.getString(StartHere,EndHere,tweet,140)!=0)))
          Serial.println(tweet);
        break;
      }
      
      
    }
    delay(1);
    client.stop();
  }
  Serial.println("start de verwerking ...");
  if (tweet[0] != 0x03) { //als het eerste karakter in de char tweet niet gelijk is aan 0x03, dan staat er dus iets anders bv a of b of q
      for (byte i = 0; i <140; i++){ // we zoeken de a op alle 140 plaatsen
        if (tweet[i] == 'a' ){
          Serial.print("a verwerkt! op plaats: ");
          Serial.println(i); // laat ons zien op welke plaats je een a vond. want mogelijks is dat niet op de eerste plaats in de tweet
                             digitalWrite (leD1, HIGH);        //led 1 aan
                             delay (1000);                     // laatste actie aanhouden
                             digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
                             delay (100);
                              digitalWrite (leD1, HIGH);        //led 1 aan
                             delay (1000);                     // laatste actie aanhouden
                             digitalWrite (leD1, LOW);         //led 1 uit en naar de volgende
                             delay (100);
                              digitalWrite (leD3, HIGH);        //led 1 aan
                             delay (1000);                     // laatste actie aanhouden
                             digitalWrite (leD3 , LOW);         //led 1 uit en naar de volgende
                             delay (100);
        }
        if (tweet[i] == 'b' ){
          Serial.print("b verwerkt! op plaats: ");
          Serial.println(i); // index b printen
        }
      }
      
    }
  Serial.println("delay...");
  delay (60000); 
  // don't make this less than 30000 (30 secs), because you can't connect to the twitter servers faster (you'll be banned)
  // off course it would be better to use the "Blink without delay", but I leave that to you.
}

Met de Tweet: Allez Hupla (was goed om ook de hoofdletters te checken)

connecting to server...
making HTTP request...
sended HTTP request...
looking for tweet...
Allez Hupla
start de verwerking ...
a verwerkt! op plaats: 10
delay...
connecting to server...
making HTTP request...
sended HTTP request...
looking for tweet...
start de verwerking ...
delay...

Filmpje komt er zeker aan als ik mijn nieuwe camera heb, pas na de examens.

En blijkbaar leest hij ze wel altijd opnieuw in als ik de serial montior opnieuw open.
Zelfs met een lege sketch of niet de originele sketch.

Raar, vre raar :~

Ik weet niet hoe het tweet verhaal in elkaar zit maar wel hoe je moet programmeren.
Hieronder de stukjes code van jou waar ik 2 problemen zie:

...
String SearchString ="<title>";
...

void loop(){
  
  if (client.connect(serverName, 80)) {
...
    while (client.connected()) {
      if (client.available()) {
        Serial.println("looking for tweet...");
        SearchString = SearchString + TwitterName + ": ";
...
        break;
      }
      
      
    }
    delay(1);
    client.stop();
  }
  Serial.println("start de verwerking ...");
...      
    }
  Serial.println("delay...");
  delay (60000); 
  // don't make this less than 30000 (30 secs), because you can't connect to the twitter servers faster (you'll be banned)
  // off course it would be better to use the "Blink without delay", but I leave that to you.
}

SearchString is gedefineerd al een globale variabele met als waarde "".
Als je dan schrijft SearchString = SearchString + TwitterName + ": ";
krijg je de eeste keer SearchString = ""+ TwitterName + ": ";
de 2 de keer krijg je SearchString = ""+ TwitterName + ": "+ TwitterName + ": ";
de 3 de keer krijg je SearchString = ""+ TwitterName + ": "+ TwitterName + ": " + TwitterName + ": ";
en zo door.
Niet alleen is de string verkeerd maar je gaat ook je geheugen opgebruiken met als gevolg dat Arduino 'raar' gaat doen.
Verhuis StringSearchString = ""+ TwitterName + ": "; naar de setup functie en opgelost.
De Serial monitor opstarten reset de arduino. Daarom ook dat na het opstarten van de serial monitor je sketch weer voor 1 maal werkt.

Het nut van de break ontgaat me.
Waarom niet gewoon een functie schrijven voor de verwerking? Je vervangt de break dan door de functie aan te roepen.
Dan hoef je niet steeds weer de client te stoppen en starten en een connectie maken.

Met vriendelijke groet
Jan

@jantje,

De break komt uit mijn code en de reden was dat in mijn origineel er nog heel wat andere dingen gebeuren via ethernet. Er werd ook een webpage getoond. Dus de ethernet server en cliënt wisselen elkaar af in mijn originele code. Ook deed ik zelf maar een check om de 10 minuten, dus sloot ik de cliënt telkens af.

over de SearchString.

Het zou eigenlijk nog simpeler zijn moest je die gewoon weglaten. Want mijn code was bedoeld om eenvoudig je twitternaam te kunnen aanpassen. Hier mag je dat allemaal weglaten en gewoon zoeken op het volgende:

if((finder.find("<item>")&&(finder.getString("<title>twittername: ","</title>",tweet,140)!=0)))

en je kan nog heel wat andere strings en chars weglaten.
dat wordt dan:

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


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x07, 0x00, 0x2B };
byte ip[] =  { 10,25,32,90}; //change this
byte subnet[] = {255,255,0,0}; //change this
byte gateway[] = {10,25,255,254}; //change this
byte dns[] = {10,56,1,1}; //change this
EthernetClient client;
char tweet[140];
int leD1 = 8;                
int leD2 = 7;
int leD3 = 6;
int leD4 = 5;

void setup() {
  pinMode(leD1, OUTPUT);
  pinMode(leD2, OUTPUT);
  pinMode(leD3, OUTPUT); 
  pinMode(leD4, OUTPUT);
  // initialize serial:
  Serial.begin(9600);
  // attempt a DHCP connection:
  Ethernet.begin(mac, ip, dns, gateway, subnet);
  // connect to Twitter:
  delay(3000);
}

void loop(){
  
  Serial.println("connecting to server...");
  if (client.connect( "api.twitter.com", 80)) { //twitter url
    TextFinder  finder( client,2 ); // 2 seconds to wait for output
    Serial.println("making HTTP request...");
    // make HTTP GET request to twitter:
    client.print("GET /1/statuses/user_timeline.rss?screen_name=jariboe"); //twittername to look for
    client.println("&count=1 HTTP/1.1");
    client.println("HOST: api.twitter.com"); //twitter url
    client.println();
    Serial.println("sended HTTP request...");
    memset (tweet,0x03,sizeof(tweet)); //we vullen de tweet met ETX (End of Text)
    while (client.connected()) {
      if (client.available()) {
        Serial.println("looking for tweet...");
        if((finder.find("<item>")&&(finder.getString("<title>jariboe: ","</title>",tweet,140)!=0))) //let's find the tweet itself between "<title>jariboe: " and "</title>" but only for 140 characters
          Serial.println(tweet);
        break;
      }
      
      
    }
    delay(1);
    client.stop();
  }