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

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();
  }

Nu dacht ik dat helemaal in orde was, blijkbaar nog niet. Zolang de software loopt met de serailmonitor loopt hij perfect, vanaf dat er software (serial is al uit) volledig afgesloten is leest hij niks nieuws meer binnen.
Is er misschien een truckje om hem telkens te resten? Want ik maak op uit het antwoord van Jantje dat dit is wat de serail monitor doet.
Wat rond surfen leert me dat ik dan in de sourcecode zou moeten gaan prutsen. Ik ga ervan uit dat ze dan gewoon de sketch bedoelen. Of is het beter om het hardware matig te doen? zoals Enabling auto-reset on the Arduino NG and serial boards. | Arduino Blog

Ofwel moet ik mijn delay groter maken en op het einde een poortje hoog maken en die verbinden met de reset ingang? Straks test ik of hij bij de 'gewone' resetknop de tweets inleest. Zonder het programma zelf op te starten.

Blijkbaar was ik mis, door dat mijn ledje er niet perfect in zat :slight_smile:
Werkt perfect nu! Super hard bedankt nog eens aan iedereen en aan Jantje en JO3RI in het bijzonder

Altijd de meest voor de hand liggende oorzaken controleren 8)
Ik ben blij dat het werkt XD
Hiep Hiep Hiep Hoeraaaaaaaaaaaaaaa

Jantje

PS ja de zon heeft geschenen vandaag in België

:smiley:

Vergeet niet als je volledig klaar bent, om een post te maken met een video en de code. En wil je iedereen bereiken ipv van alleen de Nederlandstaligen, dat doe je dat het best in deze sectie: http://arduino.cc/forum/index.php/board,29.0.html en dan zet je hier maar een linkje naar je post.

PS: laat je ons ook weten hoeveel punten je haalde met je project? :slight_smile:

Hier ben ik weer :slight_smile:

Ondertussen heb ik al een presenatie gegeven met mijn arduino en mijn docenten vonden het heel goed. De uiteindelijke punten krijg ik op het einde van de maand. Daarnaast heb ik een nieuwe router en deze heeft een extra utp uitgang. Dus ik dacht ik test hem thuis ook nog eens, maar nu krijg ik een probleem

byte mac[] = { 0x90, 0xA2, 0xDA, 0x07, 0x00, 0x2B };        
byte ip[] =  { 192,168,1,90}; //change this          //instellingen labo domoctica 10,25,90         thuis 192,168,1,90
byte subnet[] = {255,255,255,0}; //change this        //instellingen labo domoctica 255,255,0,0     thuis 255,255,255,0
byte gateway[] = {192,168,1,1}; //change this       //instellingen labo domoctica 10,25,255,254     thuis 192,168,1,1
byte dns[] = { 192, 168, 1, 1 }; //change this             //instellingen labo domoctica 10,65,1,     thuis 192,168,1,1

Maar als fouten:

TwitterCall_thuis:10: error: 'byte dns []' redeclared as different kind of symbol
C:\Users\Paul\Desktop\arduino-1.0.1\libraries\Ethernet/Dhcp.h:64: error: previous declaration of '<anonymous enum> dns'

Iemand een idee wat het zou kunnen zijn ?

BTW; in mijn paper stonden er 3 vermeldingen voor het forum, 2 voor het nederlandstallig en nog eens een paar extra voor jo3ri en jantje.
Joost

Hoi, fijn te horen je presentatie goed ging.

is het probleem ondertussen van de baan? Ik vermoed dat er een dubbele dns in je code zit?