Go Down

Topic: implementare tiny web server arduino (Read 5572 times) previous topic - next topic

marcobiondo13

ho risolto. era l' alimentatore esterno. adesso ho rpovato con un altro e tutto ok. adesso un altra domanda:
usando questo codice:
Code: [Select]
// -*- c++ -*-
//
// Copyright 2010 Ovidiu Predescu <ovidiu@gmail.com>
// Date: December 2010
// Updated: 08-JAN-2012 for Arduno IDE 1.0 by <Hardcore@hardcoreforensics.com>
//

#include <pins_arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Flash.h>
#include <SD.h>
#include <TinyWebServer.h>

/****************VALUES YOU CHANGE*************/
// The LED attached to PIN X on an Arduino board.
const int LEDPIN = 7;

// pin 4 is the SPI select pin for the SDcard
const int SD_CS = 4;

// pin 10 is the SPI select pin for the Ethernet
const int ETHER_CS = 10;

// Don't forget to modify the IP to an available one on your home network
byte ip[] = { 192, 168, 5, 177 };
/*********************************************/

static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// The initial state of the LED
int ledState = LOW;

void setLedEnabled(boolean state) {
  ledState = state;
  digitalWrite(LEDPIN, ledState);
}

inline boolean getLedState() { return ledState; }

boolean file_handler(TinyWebServer& web_server);
boolean blink_led_handler(TinyWebServer& web_server);
boolean led_status_handler(TinyWebServer& web_server);
boolean index_handler(TinyWebServer& web_server);

TinyWebServer::PathHandler handlers[] = {
  // Work around Arduino's IDE preprocessor bug in handling /* inside
  // strings.
  //
  // `put_handler' is defined in TinyWebServer
  {"/", TinyWebServer::GET, &index_handler },
  {"/upload/" "*", TinyWebServer::PUT, &TinyWebPutHandler::put_handler },
  {"/blinkled", TinyWebServer::POST, &blink_led_handler },
  {"/ledstatus" "*", TinyWebServer::GET, &led_status_handler },
  {"/" "*", TinyWebServer::GET, &file_handler },
  {NULL},
};

const char* headers[] = {
  "Content-Length",
  NULL
};

TinyWebServer web = TinyWebServer(handlers, headers);

boolean has_filesystem = true;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void send_file_name(TinyWebServer& web_server, const char* filename) {
  if (!filename) {
    web_server.send_error_code(404);
    web_server << F("Could not parse URL");
  } else {
    TinyWebServer::MimeType mime_type
      = TinyWebServer::get_mime_type_from_filename(filename);
    web_server.send_error_code(200);
    web_server.send_content_type(mime_type);
    web_server.end_headers();
    if (file.open(&root, filename, O_READ)) {
      Serial << F("Read file "); Serial.println(filename);
      web_server.send_file(file);
      file.close();
    } else {
      web_server << F("Could not find file: ") << filename << "\n";
    }
  }
}

boolean file_handler(TinyWebServer& web_server) {
  char* filename = TinyWebServer::get_file_from_path(web_server.get_path());
  send_file_name(web_server, filename);
  free(filename);
  return true;
}

boolean blink_led_handler(TinyWebServer& web_server) {
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
  // Reverse the state of the LED.
  setLedEnabled(!getLedState());
  Client& client = web_server.get_client();
  if (client.available()) {
    char ch = (char)client.read();
    if (ch == '0') {
      setLedEnabled(false);
    } else if (ch == '1') {
      setLedEnabled(true);
    }
  }
  return true;
}

boolean led_status_handler(TinyWebServer& web_server) {
  web_server.send_error_code(200);
  web_server.send_content_type("text/plain");
  web_server.end_headers();
  Client& client = web_server.get_client();
  client.println(getLedState(), DEC);
  return true;
}

boolean index_handler(TinyWebServer& web_server) {
  send_file_name(web_server, "INDEX.HTM");
  return true;
}

void file_uploader_handler(TinyWebServer& web_server,
   TinyWebPutHandler::PutAction action,
   char* buffer, int size) {
  static uint32_t start_time;
  static uint32_t total_size;

  switch (action) {
  case TinyWebPutHandler::START:
    start_time = millis();
    total_size = 0;
    if (!file.isOpen()) {
      // File is not opened, create it. First obtain the desired name
      // from the request path.
      char* fname = web_server.get_file_from_path(web_server.get_path());
      if (fname) {
Serial << F("Creating ") << fname << "\n";
file.open(&root, fname, O_CREAT | O_WRITE | O_TRUNC);
free(fname);
      }
    }
    break;

  case TinyWebPutHandler::WRITE:
    if (file.isOpen()) {
      file.write(buffer, size);
      total_size += size;
    }
    break;

  case TinyWebPutHandler::END:
    file.sync();
    Serial << F("Wrote ") << file.fileSize() << F(" bytes in ")
   << millis() - start_time << F(" millis (received ")
           << total_size << F(" bytes)\n");
    file.close();
  }
}

void setup() {
  Serial.begin(115200);
  Serial << F("Free RAM: ") << FreeRam() << "\n";

  pinMode(LEDPIN, OUTPUT);
  setLedEnabled(false);

  pinMode(SS_PIN, OUTPUT); // set the SS pin as an output
                                // (necessary to keep the board as
                                // master and not SPI slave)
  digitalWrite(SS_PIN, HIGH); // and ensure SS is high

  // Ensure we are in a consistent state after power-up or a reset
  // button These pins are standard for the Arduino w5100 Rev 3
  // ethernet board They may need to be re-jigged for different boards
  pinMode(ETHER_CS, OUTPUT); // Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for
                                // configuration)
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); // Turn off the SD card! (wait for
                                // configuration)

  // initialize the SD card.
  Serial << F("Setting up SD card...\n");
  // Pass over the speed and Chip select for the SD card
  if (!card.init(SPI_FULL_SPEED, SD_CS)) {
    Serial << F("card failed\n");
    has_filesystem = false;
  }
  // initialize a FAT volume.
  if (!volume.init(&card)) {
    Serial << F("vol.init failed!\n");
    has_filesystem = false;
  }
  if (!root.openRoot(&volume)) {
    Serial << F("openRoot failed");
    has_filesystem = false;
  }

  if (has_filesystem) {
    // Assign our function to `upload_handler_fn'.
    TinyWebPutHandler::put_handler_fn = file_uploader_handler;
  }

  // Initialize the Ethernet.
  Serial << F("Setting up the Ethernet card...\n");
  Ethernet.begin(mac, ip);

  // Start the web server.
  Serial << F("Web server starting...\n");
  web.begin();

  Serial << F("Ready to accept HTTP requests.\n");
}

void loop() {
  if (has_filesystem) {
    web.process();
  }
}

posso fare una pagina web con 4 comandi attraverso il click di 4 immagini che facciamo andare a livello alto ( attiva) le porte digitali di arduino?

pablos

#16
Apr 11, 2012, 06:10 pm Last Edit: Apr 11, 2012, 06:21 pm by pablos Reason: 1
si lo puoi fare, è tutta una questione di crearti una pagina web con le 4 immagini .png un po' di css e jquery POST e GET, far poi riconoscere i messaggi ad arduino ed eseguire quello che vuoi, tutto dentro la SD card. Se hai un pò di dimestichezza con javascript e html non è difficile altrimenti lo diventa.

qui c'e' quello che cerchi http://arduino.cc/forum/index.php?topic=56928.0

ciao
no comment

marcobiondo13

per non far rimanere il tasto schiacciato quindi quando il mouse lo schiaccia arduino accende il led e quando mollo non lo accende più cosa dovrei fare? che file dovrei modificare?

pablos

no comment

marcobiondo13

per esempio se devo far accendere il led uno schiaccio e rimane acceso fino a quando non lo schiaccio di nuovo che torna in off. volendo è possibile che il tasto rimanga in on solo mentre clicco sul tasto con il mouse? e poi come mollo il mouse torna automaticamente su off? così mi sono spiegato? grazie comunque per le risposte di voi tutti... :)

marcobiondo13

ho il seguente problema con questo codice:

si lo puoi fare, è tutta una questione di crearti una pagina web con le 4 immagini .png un po' di css e jquery POST e GET, far poi riconoscere i messaggi ad arduino ed eseguire quello che vuoi, tutto dentro la SD card. Se hai un pò di dimestichezza con javascript e html non è difficile altrimenti lo diventa.

qui c'e' quello che cerchi http://arduino.cc/forum/index.php?topic=56928.0

ciao

http://arduino.cc/forum/index.php?action=dlattach;topic=56928.0;attach=14965


mi da questo errore:
Code: [Select]

C:\Users\marco\Desktop\arduino-1.0\libraries\ardserver\TinyWebServer.cpp:36:16: error: SD.h: No such file or directory
C:\Users\marco\Desktop\arduino-1.0\libraries\ardserver\TinyWebServer.cpp: In member function 'void TinyWebServer::send_file(SdFile&)':
C:\Users\marco\Desktop\arduino-1.0\libraries\ardserver\TinyWebServer.cpp:489: error: invalid use of incomplete type 'struct SdFile'
C:\Users\marco\Desktop\arduino-1.0\libraries\ardserver\/TinyWebServer.h:15: error: forward declaration of 'struct SdFile'

la libreria sdflat la ho aggiunta e scaricata da qui:
http://code.google.com/p/sdfatlib/downloads/detail?name=sdfatlib20111205.zip&can=2&q=
e non capisco perche mi continua a dare qull errore..

mauroz

dall'errore sembra proprio che non hai installato la libreria:
Code: [Select]
SD.h: No such file or directory
prova con l'ide 0.23.. :D

marcobiondo13

la libreria è installata... comunque provo con l' altro ide... :)


mauroz

difficile aiutarti senza conoscere il "problemino", mi servirebbe la sfera che usano quelli dei pieni alti   ]:D

pablos

Lascia perdere il tinywebserver damme retta.
ciao
no comment

marcobiondo13

e cosa potrei usare? mi servirebbe qualcosa che tramite una pagina web da dei commandi alle 5 uscite di arduini... cosa altro potrei usare? possibilemnte qualcosa di già costruito... :)

marcobiondo13

risolto il problema dell errore sostituendo le varie librerie che utilizzava il programma per la sd con un unica libreria sd.h . adesso mi mancherebbe solo il commando per far si che il tasto rimanga su on solo se lo tengo cliccato e non che devo fare un altro click per disattivarlo...

marcobiondo13

invece di utilizzare i tasti per accendere i vari led è possibile utilizzare le frecce direzionali? avete qualche idea per fare questo?

pablos

Allora tu vuoi premere un pulsante su pag web, che esegua un ON fino a quando lo tieni premuto e un OFF quando lo rilasci, ora pensi di usare i 4 tasti di direzione, che non si capisce se parli di una tastiera di un pc di uno smarphone o cosa..... perchè non dici che cosa vuoi fare?
vuoi comandare una macchinina con una pag web? allora ti dicevamo subito che non è proprio l'idea migliore.
Quando rilasci il dito la macchina viaggia ancora per 1-2 secondi, la latenza che c'e' tra lo start del comando e l'arrivo ad arduino via web non ti permette di fare un controllo preciso e istantaneo.
Devi usare altri sistemi di trasmissione, ma specifica cosa vuoi fare e spendi qualche parola in più, altrimenti non otterrai risposte, quello che sembra per te scontato non lo è per gli altri.

ciao
no comment

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy