Arduino e FTP

Ciao a tutti essendo un novellino di questo meraviglioso mondo di arduino vi chiedo un piccolo aiuto volevo inviare un file salvato sulla Sd via FTP. Siccome con labview ho già fatto questo lavoro per poter leggere da un sito dei valori volevo evitare l'utilizzo del PC ed usare arduino. Chi può darmi due dritte?

Mai usato, ma prova questo: http://playground.arduino.cc/Code/FTP.

Ho provato ma pensavo che al posto della riga dove mettere indirizzo del server dovessi mettere l'host dove mandare il file via ftp ma non è così! Hai altri suggerimenti ! Sono un po' in confusione. Siccome ho già fatto il sito web che legge un file invito tramite il PC e programma labview e mi fà vedere i valori che ho messo al suo interno, volevo evitare l'uso del PC e fare leggere uno o più valori di volt scriverli sul un file della micro sd ed inviare il file al sito.

Devi mettere l'indirizzo IP, non l'hostname. Almeno credo! :sweat_smile:

Ma se cambia indirizzo ip il server devo impostarlo ogni volta invece mettendo l'hostname questa operazione non serve

Certo, ma inserire un hostname in quello sketch non è immediato, incominciamo con l'IP.

E poi, sei sicuro che cambi così spesso?

No però adesso seguo i tuoi consigli ed iniziò a fare delle con questo. Appena riesco vi faccio sapere

mi sa che hai ragione mi sono bloccato mooooolto prima.

premessa utilizzo arduino uno r3 +ethernet shild 2

ho utilizzato questo codice

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



byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xD2, 0x92 }; 
 IPAddress ip( 192, 168, 0, 50 );    
 IPAddress gateway( 192, 168, 0, 1 );
 IPAddress subnet( 255, 255, 255, 0 );

void setup()
{
  
  Serial.begin(9600);
  
  Ethernet.begin(mac, ip, gateway, subnet);

  
  delay(1000); 

 
  Serial.print("Indirizzo");
  IPAddress myIPAddress = Ethernet.localIP();
  Serial.println(myIPAddress);
}

void loop() {
  // put your main code here, to run repeatedly:

}

come mai sul monitor seriale mi compare ip 0.86.86.86 e non 192.168.0.50?

La Ethernet shield 2, prodotta da Arduino.org (... e, ti ricordo, [u]questo è il forum di Arduino.cc[/u]) richiede un'altra libreria (usa un chip diverso) ... devi installare (dal Library Manager del IDE) ed includere la libreria Ethernet2, non la Ethernet.

Guglielmo

Si io mi riferisco a quella originale di arduino! Grazie per il consiglio provo subito

ciao a tutti dopo quello che mi ha detto il Sig. Guglielmo ho fatto un po’ di ricerche e vi assicuro che mi hanno mandato in confusione TOTALE.

Non ero a conoscenza di due produttori di arduino e soprattutto a sketch che non vanno bene con diversi ide.

sono qua comunque a chiedervi aiuto in quanto sono finalmente riuscito a collegare arduino alla rete ma lo sketch non funziona

messaggio di errore

SD opened
Command connection failed
FTP FAIL

#include <SD.h>
#include <SPI.h>
#include <Ethernet2.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp2.h>


// comment out next line to write to SD from FTP server
#define FTPWRITE

// this must be unique
 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  

// change to your network settings
 IPAddress ip( 192, 168, 0, 50 );    
 IPAddress gateway( 192, 168, 0, 1 );
 IPAddress subnet( 255, 255, 255, 0 );

// change to your server
 IPAddress server( nn, nn, nn, nn );

 EthernetClient client;
 EthernetClient dclient;

char outBuf[128];
char outCount;

// change fileName to your file (8.3 format!)
char fileName[13] = "fore.txt";

void setup()
{
   Serial.begin(9600);

   digitalWrite(10,HIGH);

   if(SD.begin(4) == 0)
   {
     Serial.println(F("SD init fail"));          
   }

   Ethernet.begin(mac, ip, gateway, server, subnet); 
   digitalWrite(10,HIGH);
   delay(2000);
   Serial.println(F("Ready. Press f or r"));
}

void loop()
{
   byte inChar;

   inChar = Serial.read();

   if(inChar == 'f')
   {
     if(doFTP()) Serial.println(F("FTP OK"));
     else Serial.println(F("FTP FAIL"));
   }

   if(inChar == 'r')
   {
     readSD();    
   }

}

 File fh;

 byte doFTP()
{
#ifdef FTPWRITE
   fh = SD.open(fileName,FILE_READ);
#else
   SD.remove(fileName);
   fh = SD.open(fileName,FILE_WRITE);
#endif

   if(!fh)
   {
     Serial.println(F("SD open fail"));
     return 0;    
   }

#ifndef FTPWRITE  
   if(!fh.seek(0))
   {
     Serial.println(F("Rewind fail"));
     fh.close();
     return 0;    
   }
#endif

   Serial.println(F("SD opened"));

   if (client.connect(server,21)) {
     Serial.println(F("Command connected"));
   } 
   else {
     fh.close();
     Serial.println(F("Command connection failed"));
     return 0;
   }

   if(!eRcv()) return 0;

   client.println(F("user"));

   if(!eRcv()) return 0;

   client.println(F("password"));

   if(!eRcv()) return 0;

   client.println(F("SYST"));

   if(!eRcv()) return 0;

   client.println(F("Type I"));

   if(!eRcv()) return 0;

   client.println(F("PASV"));

   if(!eRcv()) return 0;

   char *tStr = strtok(outBuf,"(,");
   int array_pasv[6];
   for ( int i = 0; i < 6; i++) {
     tStr = strtok(NULL,"(,");
     array_pasv[i] = atoi(tStr);
     if(tStr == NULL)
     {
       Serial.println(F("Bad PASV Answer"));    

     }
   }

   unsigned int hiPort,loPort;

   hiPort = array_pasv[4] << 8;
   loPort = array_pasv[5] & 255;

   Serial.print(F("Data port: "));
   hiPort = hiPort | loPort;
   Serial.println(hiPort);

   if (dclient.connect(server,hiPort)) {
     Serial.println(F("Data connected"));
   } 
   else {
     Serial.println(F("Data connection failed"));
     client.stop();
     fh.close();
     return 0;
   }

#ifdef FTPWRITE 
   client.print(F("STOR "));
   client.println(fileName);
#else
   client.print(F("RETR "));
   client.println(fileName);
#endif

   if(!eRcv())
   {
     dclient.stop();
     return 0;
   }

#ifdef FTPWRITE
   Serial.println(F("Writing"));

   byte clientBuf[64];
   int clientCount = 0;

   while(fh.available())
   {
     clientBuf[clientCount] = fh.read();
     clientCount++;

     if(clientCount > 63)
     {
       dclient.write(clientBuf,64);
       clientCount = 0;
     }
   }

   if(clientCount > 0) dclient.write(clientBuf,clientCount);

#else
   while(dclient.connected())
   {
     while(dclient.available())
     {
       char c = dclient.read();
       fh.write(c);      
       Serial.write(c); 
     }
   }
#endif

   dclient.stop();
   Serial.println(F("Data disconnected"));

   if(!eRcv()) return 0;

   client.println(F("QUIT"));

   if(!eRcv()) return 0;

   client.stop();
   Serial.println(F("Command disconnected"));

   fh.close();
   Serial.println(F("SD closed"));
   return 1;
}

 byte eRcv()
{
   byte respCode;
   byte thisByte;

   while(!client.available()) delay(1);

   respCode = client.peek();

   outCount = 0;

   while(client.available())
   {  
     thisByte = client.read();    
     Serial.write(thisByte);

     if(outCount < 127)
     {
       outBuf[outCount] = thisByte;
       outCount++;      
       outBuf[outCount] = 0;
     }
   }

   if(respCode >= '4')
   {
     efail();
     return 0;  
   }

   return 1;
}


void efail()
{
   byte thisByte = 0;

   client.println(F("QUIT"));

   while(!client.available()) delay(1);

   while(client.available())
   {  
     thisByte = client.read();    
     Serial.write(thisByte);
   }

   client.stop();
   Serial.println(F("Command disconnected"));
   fh.close();
   Serial.println(F("SD closed"));
}

void readSD()
{
   fh = SD.open(fileName,FILE_READ);

   if(!fh)
   {
     Serial.println(F("SD open fail"));
     return;    
   }

   while(fh.available())
   {
     Serial.write(fh.read());
   }

   fh.close();
}

Dove posso ordinare la Ethernet shild di arduino.cc

Così per provare se dipende da questo l’errore?

Ciao qualcuno riesce mica ad aiutarmi?

spero che non gli invii questo

   client.println(F("user"));

   if(!eRcv()) return 0;

   client.println(F("password"));

perche' deve essere

   client.println(F("USER tuonomeutente"));

   if(!eRcv()) return 0;

   client.println(F("PASS tuapassword"));

Grazie provo al più presto