Go Down

Topic: implementare tiny web server arduino (Read 5268 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... :)

marcobiondo13


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