Arduino mega2560 R3 + ] ETHERNET shield = DOMOTICA ON LINE - READ IT!

ciao, avrei bisogno di alcune indicazioni per il mio progetto. vorrei comprare un dominio (es. www.provadomoticaarduino.it) e installare sullo stesso server del dominio un database che tramite autenticazione mi consenta di controllare Arduino, leggere temperature, attivare sensori ecc...) volevo chiedervi: 1) come deve essere strutturata la pagina web che andrò a caricare sul server 2) immagino che avrò bisogno di un ip statico per Arduino per essere raggiunto dal server 3) è possibile creare una mappa cliccabile in html IN MODO da mettere delle parti cliccabili di una foto (es. foto del salone di casa, clicco sul lampadario o sul televisore e arduino mi accende o spegne questi dispositivi).

insomma volevo delle linee guida generali, ad esempio che comandi utilizzare in php, ecc...

Se poi riusciste ad aiutarmi anche con il problema della mia shield wifi ( http://arduino.cc/forum/index.php?topic=162985.0 ), sarebbe veramente il top... grazie in anticipo, Valerio.

[ENG] hello, I need some guidance for my project. I would like to buy a domain (eg www.provadomoticaarduino.it) installed on the same server and domain authentication via a database that allows me to control Arduino, read temperatures, activate sensors etc ...) I wanted to ask: 1) how it should be structured web page I'm going to upload to the server 2) I guess I'll need a static ip for Arduino to be reached by the server 3) you can create a clickable map in html SO to put a clickable parts of the photo (eg photo of the living room of the house, I click on the chandelier or on the TV and arduino I turn on or off these devices).

in short, I wanted a general guideline, for example, that use commands in php, etc ...

And if you managed to help me with the problem of my wifi shield ( http://arduino.cc/forum/index.php?topic=162985.0 ), it would be really the top ...

thanks in advance, Valerio.

ciao valerio io sto sviluppando un sito (www.dataino.it) che permette di creare queste applicazioni online
il server il database e il software per vreare il tutto è gratuito ed è online
crei tu il database e il relativo pannello di controllo e ti crei anche i grafici dai dati raccolti
io ci sto lavorando da mesi ed è a buon punto e mi farebbe piacere una tua opinione e come tester dell’applicazione

se invece vuoi ti aiuto e molto volentieri se vuoi creartene uno tuo.

Si ti serve un ip statico in teoria poi alcuni provider non lo sanno ma c’è un modo per bypassare
il problema e con pochi euro hai un sito con ip statico anche se non lo è

per la creazione del tuo sito avrei necessità di maggiori info

quante stanze quante luci

on off o dimmer

quanti sensori ecc. ecc…

Ciao

dataino-doc.pdf (1.12 MB)

@maremosso68, intanto ti ringrazio per la disponibilità e volevo confermarti che ci hai preso in pieno, il tuo sito è moooolto simile a quello che vorrei progettare io (il mio sarebbe un po piu sempliciotto). complimenti per il lavoro svolto, è fatto davvero bene!

io dovrei realizzare una cosa del genere ma il tutto dovrebbe essere hostato su un server (er es su aruba) e dovrei raggiungerlo dalla mia rete di casa (alla quale è connesso arduino) attraversando internet.

il mio proggetto di sito web include: -possibilita di creare utenti CON PRIVILEGI DIVERSI -registrare temperature -accendere o spegnere relè e luci e poi integrare il tutto con una mappa cliccabile HTML (parte più facile)...

mi farebbe molto comodo se potessi darmi diciamo le linee guida principali su come far comunicare arduino con il server, ovvero, i comandi principali per far si che ciò che viene modificato dal web abbia conseguenze sul modellino.

grazie mille, Valerio.

allora parti da qua per il tuo progetto

http://playground.arduino.cc/Code/WebClient

la versione GET

e segui la mia guida per il mio sito ti aiuta sicuramente

http://www.dataino.it/help/help.htm

occhio … usa sempre questo formato Serial.println(F(“Ready”));

F(“Stringa da stampare sulla seriale”) ti eviti un casino di crash e cose strane

altra cosa usa solo >>>> char var = “&Temp=”; <<<< per definire le stringe
e soprattutto le variabili stringhe non usarle proprio fanno casino ci ho perso una giornata

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

codice funzionante che legge un sensore e manda la temp online
per vederlo all’opera in locale cambia la apy-key con e gli ip del server

//===================
// dataino.it
//===================
#include <Ethernet.h>
#include <SPI.h>
//===================
// DS18B20
//===================
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// Assign the addresses of your 1-Wire temp sensors.
DeviceAddress insideThermometer = { 
  0x28, 0x67, 0xE7, 0x47, 0x04, 0x00, 0x00, 0x2B };
//===================
//dataino.it
//===================
//~~~~~~~~~~~~~~~~~~~
// remember to chang mac!!!
// this must be unique
//~~~~~~~~~~~~~~~~~~~~
byte mac[] = {
  0x90,0xA2,0xDA,0x0D,0x82,0x39};
// change to your network settings
IPAddress ip(192,168,6,91);
IPAddress gateway(192, 168, 6, 90);
IPAddress subnet(255, 255, 255, 0);
//~~~~~~~~~~~~~~~~~~~~
// LOCAL HOST SERVER
//~~~~~~~~~~~~~~~~~~~~
//IPAddress server(192,168,6,90); //localhost
//char API_key[] = "41uX-u50e-84d4-8f0u-kP0s";
//~~~~~~~~~~~~~~~~~~~~
//~ ONLINE SERVER !!!
//~~~~~~~~~~~~~~~~~~~~~
IPAddress server(94,23,64,3); //dataino.it
String API_key = "68bS-4p6r-r8FR-3W0X-bZ68";
//~~~~~~~~~~~~~~~~~~~~~~

char cmd_find[] = "find_value";
char cmd_add[] = "add_value";
char cmd_read[] = "read_value";
char cmd_delete[] = "delete_value";
char cmd_set[] = "set_value";
char var[] = "&Temp=";

int totalCount = 0;
int loopCount = 0;
char pageAdd[128];

//~~~~~~~~~~~~~~~~~~~
EthernetClient client;
//===================
// S E T U P
//===================
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  //===================
  // DS18B20
  //===================
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  //===================
  //dataino.it
  //=================== 
  // Start ethernet
  Serial.println(F("Starting ethernet..."));
  Ethernet.begin(mac, ip, gateway, gateway, subnet);

  // If using dhcp, comment out the line above 
  // and uncomment the next 2 lines

  // if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  // else Serial.println(F("ok"));
  //digitalWrite(10,HIGH);

  Serial.println(Ethernet.localIP());

  delay(2000);
  Serial.println(F("Ready"));
}
//===================
// PRINT TEMP
//===================
void printTemperature(DeviceAddress deviceAddress)
{
  //===================
  // DS18B20
  //===================
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print(F("Error getting temperature"));
  } 
  else {
    Serial.print(F("C: "));
    Serial.print(tempC);
    Serial.print(F(" F: "));
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    //===================
    // dataino.it
    //===================
    //dtostrf(FLOAT,WIDTH,PRECSISION,BUFFER);
    char buffer[10];
    dtostrf(tempC, 5, 2, buffer);
    sprintf(pageAdd ,"/dataino.it/api/%s.php?api-KEY=%s%s%s" ,cmd_add, API_key, var,buffer);
  }
}
//===================
// DS18B20
//===================
void loop(void)
{
  if(loopCount < 50)
  {
    // if loopCount is less than 50, just delay a 100 millisecond
    delay(100);
    Serial.print(F("."));
  }
  else
  {
    // every tree seconds this runs
    loopCount = 0;
    Serial.print(F("\n\r"));
    //===================
    // DS18B20
    //===================
    Serial.print(F("Getting temperatures...\n\r"));
    sensors.requestTemperatures();
    Serial.print(F("Inside temperature is: "));
    printTemperature(insideThermometer);
    Serial.print(F("\n\r"));

    //================
    if(!getPage(server,pageAdd)) Serial.print(F("Fail "));
    else Serial.print(F("Pass "));
    totalCount++;
    Serial.println(totalCount,DEC);
  }    

  loopCount++;

}
//===================
// dataino.it
//===================
byte getPage(IPAddress ipBuf,char *page)

{
  int inChar;
  char outBuf[128];
  Serial.print(F("connecting..."));
  if(client.connect(ipBuf,80))
  {
    Serial.println(F("connected"));
    sprintf(outBuf,"GET %s HTTP/1.0\r\n\r\n",page);
    client.write(outBuf);
    Serial.println(F("outBuf"));
  } 
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

  // connectLoop controls the hardware fail timeout

  int connectLoop = 0;
  //Unsigned long variables are extended size variables for number storage, 
  //and store 32 bits (4 bytes). Unlike standard longs unsigned longs 
  //won't store negative numbers, making their range from 0 to 4,294,967,295
  long VAL[16];
  while(client.connected())
  {
    while(client.available())
    {
      //=======
      inChar = client.read();

      if (inChar==char('#'))
      {
        inChar = client.read();
        //======= 
        while (inChar!='#'){
          int count_val =0 ;
          unsigned long i = 1;
          VAL[count_val]=0; 
          //=======
          do {
            VAL[count_val] = VAL[count_val] + (inChar-48) * i;
            i=i*10;
            inChar = client.read();
          }
          while ((inChar!=char(';')));
          //=======
          //Serial.print(var[count_val]);
          //Serial.print("=");
          //Serial.print(VAL[count_val]);
          //Serial.println();

          inChar = client.read();
          //Serial.print(inChar);
          //=======
          if (inChar==char('*')){ 
            Serial.print(F("Query="));
            Serial.print(VAL[count_val]);
            break;             
          }
          count_val=count_val+1;
        }
      }
      
      // set connectLoop to zero if a packet arrives
      connectLoop = 0;
    }
    connectLoop++;
  }
  // if more than 10000 milliseconds since the last packet
  if(connectLoop > 10000)
  {
    // then close the connection from this end.
    Serial.println();
    Serial.println(F("Timeout"));
    client.stop();
  }
  // this is a delay for the connectLoop timing
  delay(1);


  Serial.println();

  Serial.println(F("disconnecting."));
  // close client end
  client.stop();

  return 1;
}

Sei il mio nuovo dio!
grazie 1000 per il supporto, era proprio quello che cercavo.
ti aggiorno sull’andamento del progetto! :wink:

si fammi sapere magari li integriamo

ok, mi sono un po bloccato, innanzitutto sono passato alla ethernet shield ma VORREI che la shield si connettesse ad un sito HOSTATO su un server dal quale riceva i vari parametri per commutare le uscite, NON VOGLIO che la shield ospiti il sito…

Potreste darmi qualche linea guida per piacere?
(vi posto lo schema concettuale del progetto).

schema funzionale progetto.png

Scusa il ritardo… ma sto traslocando…

dunque come sistema di sviluppo ti consiglio http://www.apachefriends.org/it/xampp.html

ha tutto quello che ti serve database Mysql , server apache

insallato crea un database che chiameremo dbcasa con http://localhost/phpmyadmin/

e selezionato il dbcasa esegui questa query che crea la tabella dove sono memorizzati i tuoi valori e inserisce a zero tutti i valori

CREATE TABLE IF NOT EXISTS casabit (
id int(11) NOT NULL AUTO_INCREMENT,
relay1 tinyint(1) NOT NULL DEFAULT ‘0’,
relay2 tinyint(4) NOT NULL DEFAULT ‘0’,
luce1 tinyint(1) NOT NULL DEFAULT ‘0’,
luce2 tinyint(1) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;


– Dumping data for table casabit

INSERT INTO casabit (id, relay1, relay2, luce1, luce2) VALUES
(1, 0, 0, 0, 0),

sotto “C:\xampp\htdocs”

crei una cartella chiamata casa

quindi in C:\xampp\htdocs\casa

crei il file casa.php
con dentro questo codice
che leggere i valori

//======================

<?php define('DB_HOST', 'localhost:3306'); define('DB_USER', 'root'); define('DB_PASSWORD', ''); define('DB_DATABASE', 'dbcasa'); $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); if (!$con) { die('Could not connect: ' . mysql_error()); } $read_bit_var=$_GET['var']; mysql_select_db(DB_DATABASE, $con); $qry = "SELECT ". $read_bit_var . " AS bit FROM casabit;" ; //echo $qry; $result = mysql_query($qry); if ($result) { $rowsfound = mysql_num_rows($result); //echo $rowsfound; if ($rowsfound > 0) { while ($row = mysql_fetch_array($result)) { echo $row['bit']; } } else { // variabile inesistente echo "V"; } } else { //errore query echo "Q"; } //====================== e questo è il comando che arduino deve dare per leggerli http://localhost/casa/casa.php?var=[nome_della_variabile] dove [nome_della_variabile] = a relay1 oppure relay2 ecc. ecc. quindi http://localhost/casa/casa.php?var=relay1 il server rispondera con il valore contenuto nel database **(0/1)** oppure **V** se non trova la variabile o **M** se è errata la richiesta dimm quando sei pronto