Go Down

Topic: Webbino - Server web "dinamico" per Arduino (Read 40293 times) previous topic - next topic

SukkoPera

Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Cosmo99

Se non posti lo sketch...
Eccolo


Code: [Select]


/***************************************************************************
    This file is part of Webbino.
*                                                                         *
    Copyright (C) 2012-2016 by SukkoPera
*                                                                         *
    Webbino is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
*                                                                         *
    Webbino is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
*                                                                         *
    You should have received a copy of the GNU General Public License
    along with Webbino. If not, see <http://www.gnu.org/licenses/>.
***************************************************************************/

#include <Webbino.h>

#include "DHT.h"
#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11



/* SS pin for the SD card reader. Pin 4 is used for the reader included
  on most WIZ5100-based Ethernet shields
*/
#define SD_SS 4

// Instantiate the WebServer
WebServer webserver;

// Instantiate the network interface defined in the Webbino headers
#if defined (WEBBINO_USE_ENC28J60)
#include <WebbinoInterfaces/ENC28J60.h>
NetworkInterfaceENC28J60 netint;
#elif defined (WEBBINO_USE_WIZ5100) || defined (WEBBINO_USE_WIZ5500)
#include <WebbinoInterfaces/WIZ5x00.h>
NetworkInterfaceWIZ5x00 netint;
#elif defined (WEBBINO_USE_ESP8266)
#include <WebbinoInterfaces/AllWiFi.h>

#include <SoftwareSerial.h>
SoftwareSerial swSerial (6, 7);

// Wi-Fi parameters
#define WIFI_SSID        "ssid"
#define WIFI_PASSWORD    "password"

NetworkInterfaceWiFi netint;
#elif defined (WEBBINO_USE_WIFI) || defined (WEBBINO_USE_WIFI101) || \
 defined (WEBBINO_USE_ESP8266_STANDALONE)
#include <WebbinoInterfaces/AllWiFi.h>

// Wi-Fi parameters
#define WIFI_SSID        "ssid"
#define WIFI_PASSWORD    "password"

NetworkInterfaceWiFi netint;
#elif defined (WEBBINO_USE_DIGIFI)
#include <WebbinoInterfaces/DigiFi.h>
NetworkInterfaceDigiFi netint;
#endif




/******************************************************************************
  DEFINITION OF TAGS
******************************************************************************/

#define REP_BUFFER_LEN 32
char replaceBuffer[REP_BUFFER_LEN];
PString subBuffer (replaceBuffer, REP_BUFFER_LEN);

PString& evaluate_ip (void *data __attribute__ ((unused))) {
 subBuffer.print (netint.getIP ());

 return subBuffer;
}

PString& evaluate_netmask (void *data __attribute__ ((unused))) {
 subBuffer.print (netint.getNetmask ());

 return subBuffer;
}

PString& evaluate_gw (void *data __attribute__ ((unused))) {
 subBuffer.print (netint.getGateway ());

 return subBuffer;
}

PString& evaluate_mac_addr (void *data __attribute__ ((unused))) {
 const byte *buf = netint.getMAC ();

 for (byte i = 0; i < 6; i++) {
   if (buf[i] < 16)
     subBuffer.print ('0');
   subBuffer.print (buf[i], HEX);

   if (i < 5)
     subBuffer.print (':');
 }

 return subBuffer;
}

PString& evaluate_ip_src (void *data __attribute__ ((unused))) {
 if (netint.usingDHCP ())
   subBuffer.print (F("DHCP"));
 else
   subBuffer.print (F("MANUAL"));

 return subBuffer;
}

PString& evaluate_webbino_version (void *data __attribute__ ((unused))) {
 subBuffer.print (WEBBINO_VERSION);

 return subBuffer;
}

PString& evaluate_uptime (void *data __attribute__ ((unused))) {
 unsigned long uptime = millis () / 1000;
 byte d, h, m, s;

 d = uptime / 86400;
 uptime %= 86400;
 h = uptime / 3600;
 uptime %= 3600;
 m = uptime / 60;
 uptime %= 60;
 s = uptime;

 if (d > 0) {
   subBuffer.print (d);
   subBuffer.print (d == 1 ? F(" day, ") : F(" days, "));
 }

 if (h < 10)
   subBuffer.print ('0');
 subBuffer.print (h);
 subBuffer.print (':');
 if (m < 10)
   subBuffer.print ('0');
 subBuffer.print (m);
 subBuffer.print (':');
 if (s < 10)
   subBuffer.print ('0');
 subBuffer.print (s);

 return subBuffer;
}



PString& evaluate_free_ram (void *data __attribute__ ((unused))) {
 // This only works on AVRs
#if defined (ARDUINO_ARCH_AVR)
 extern int __heap_start, *__brkval;
 int v;

 subBuffer.print ((int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval));
#else
 subBuffer.print (F("N/A"));
#endif

 return subBuffer;
}
EasyReplacementTag (tagMacAddr, NET_MAC, evaluate_mac_addr);
EasyReplacementTag (tagIPAddress, NET_IP, evaluate_ip);
EasyReplacementTag (tagNetmask, NET_MASK, evaluate_netmask);
EasyReplacementTag (tagGateway, NET_GW, evaluate_gw);
EasyReplacementTag (tagNetConfSrc, NET_CONF_SRC, evaluate_ip_src);
EasyReplacementTag (tagWebbinoVer, WEBBINO_VER, evaluate_webbino_version);
EasyReplacementTag (tagUptime, UPTIME, evaluate_uptime);
EasyReplacementTag (tagFreeRAM, FREERAM, evaluate_free_ram);
EasyReplacementTag (tagTemp, TEMP, evaluate_temp);

EasyReplacementTagArray tags[] PROGMEM = {
 &tagMacAddr,
 &tagIPAddress,
 &tagNetmask,
 &tagGateway,
 &tagNetConfSrc,
 &tagWebbinoVer,
 &tagUptime,
 &tagFreeRAM,
 &tagTemp,
 NULL
};


/******************************************************************************
  MAIN STUFF
******************************************************************************/

// Avoid some bug reports :)
#if !defined (WEBBINO_ENABLE_SD) && !defined (WEBBINO_ENABLE_SDFAT)
#error Please enable WEBBINO_ENABLE_SD or WEBBINO_ENABLE_SDFAT in webbino_config.h
#endif

DHT dht(DHTPIN, DHTTYPE);

void setup () {
 dht.begin();
 Serial.begin (9600);
 
 while (!Serial)
   ;

 Serial.println (F("Using Webbino " WEBBINO_VERSION));

 Serial.println (F("Trying to get an IP address through DHCP"));
#if defined (WEBBINO_USE_ENC28J60) || defined (WEBBINO_USE_WIZ5100) || defined (WEBBINO_USE_WIZ5500)
 byte mac[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
 bool ok = netint.begin (mac);
#elif defined (WEBBINO_USE_ESP8266)
 swSerial.begin (9600);
 bool ok = netint.begin (swSerial, WIFI_SSID, WIFI_PASSWORD);
#elif defined (WEBBINO_USE_WIFI) || defined (WEBBINO_USE_WIFI101) || \
 defined (WEBBINO_USE_ESP8266_STANDALONE)
 bool ok = netint.begin (WIFI_SSID, WIFI_PASSWORD);
#endif

 if (!ok) {
   Serial.println (F("Failed to get configuration from DHCP"));
   while (42)
     ;
 } else {
   Serial.println (F("DHCP configuration done:"));
   Serial.print (F("- IP: "));
   Serial.println (netint.getIP ());
   Serial.print (F("- Netmask: "));
   Serial.println (netint.getNetmask ());
   Serial.print (F("- Default Gateway: "));
   Serial.println (netint.getGateway ());

   Serial.print (F("Initializing SD card..."));
   if (!webserver.begin (netint, NULL, tags, SD_SS)) {
     Serial.println (F(" failed"));
     while (42)
       ;
   }
   Serial.println (F(" done"));
 }
}

void loop () {
 webserver.loop ();

}


float temp = dht.readTemperature();

static const char subDatoStr[] PROGMEM = "TEMP";
static const ReplacementTag subTempVarSub PROGMEM = {subDatoStr, evaluate_temp, NULL};

static const ReplacementTag * const substitutions[] PROGMEM = {
 &subTempVarSub
};
#define REP_BUFFER_LEN 32
//static char replaceBuffer[REP_BUFFER_LEN];
//PString subBuffer (replaceBuffer, REP_BUFFER_LEN);

static PString& evaluate_temp (void *data) {
 subBuffer.print (temp);
 return subBuffer;
}



nid69ita

Hai messo 
float temp = dht.readTemperature();
nel posto sbagliato. Messo li è fuori da qualsiasi funzione, quindi è globale e le globali vengono inizializzate come prima cosa, quindi ancora prima del codice della setup() perciò dht.begin() non è ancora avvenuto.
my name is IGOR, not AIGOR

SukkoPera

Confermo, devi farlo come prima cosa in evaluate_temp().
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Cosmo99

Quindi, scusate, di preciso dove dovrei metterlo?

SukkoPera

Non saprei essere più chiaro di quel che ho appena detto...
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Cosmo99

Non saprei essere più chiaro di quel che ho appena detto...
Ho provato a fare come hai detto, ma non funziona.
Potresti mettermi la parte del codice, giusto per capire se sbaglio io oppure non va. Grazie

SukkoPera

#277
Mar 28, 2018, 07:45 pm Last Edit: Mar 28, 2018, 07:46 pm by SukkoPera
Se è questa è evaluate_temp():
Code: [Select]
static PString& evaluate_temp (void *data) {
 subBuffer.print (temp);
 return subBuffer;
}


Farlo come prima cosa vuol dire:
Code: [Select]
static PString& evaluate_temp (void *data) {
 float temp = dht.readTemperature();
 subBuffer.print (temp);
 return subBuffer;
}


Nota anche che quello static è superfluo, puoi toglierlo.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Cosmo99

Se è questa è evaluate_temp():
Code: [Select]
static PString& evaluate_temp (void *data) {
 subBuffer.print (temp);
 return subBuffer;
}


Farlo come prima cosa vuol dire:
Code: [Select]
static PString& evaluate_temp (void *data) {
 float temp = dht.readTemperature();
 subBuffer.print (temp);
 return subBuffer;
}


Nota anche che quello static è superfluo, puoi toglierlo.
Avevo già provato così, ci riprovato anche di nuovo ora ma non funziona

SukkoPera

Ma nella pagina HTML hai messo %TEMP% da qualche parte?
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Cosmo99

#280
Mar 28, 2018, 10:58 pm Last Edit: Mar 28, 2018, 11:18 pm by Cosmo99
Ma nella pagina HTML hai messo %TEMP% da qualche parte?
Sì, nella pagina c'è il tag #TEMP#, ma se metto la variabile temp in evaluate_temp() non funziona più neanche il server. All'inizio mi da caratteri strani sulla pagina web e poi va subito offline.
Infatti se sostituisco a temp=DHT.readTemperature()
un numero qualsiasi e quindi, per esempio, int temp = 5; il tag viene sostituito correttamente

SukkoPera

#281
Mar 28, 2018, 11:25 pm Last Edit: Mar 28, 2018, 11:26 pm by SukkoPera
Boh, a parte che tutto questo è inutile:
Code: [Select]
float temp = dht.readTemperature();

static const char subDatoStr[] PROGMEM = "TEMP";
static const ReplacementTag subTempVarSub PROGMEM = {subDatoStr, evaluate_temp, NULL};

static const ReplacementTag * const substitutions[] PROGMEM = {
 &subTempVarSub
};
#define REP_BUFFER_LEN 32
//static char replaceBuffer[REP_BUFFER_LEN];
//PString subBuffer (replaceBuffer, REP_BUFFER_LEN);


Così su due piedi non vedo motivi per cui non dovrebbe funzionare.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Cosmo99

#282
Mar 28, 2018, 11:31 pm Last Edit: Mar 28, 2018, 11:35 pm by Cosmo99
Boh, a parte che tutto questo è inutile:
Code: [Select]
float temp = dht.readTemperature();

static const char subDatoStr[] PROGMEM = "TEMP";
static const ReplacementTag subTempVarSub PROGMEM = {subDatoStr, evaluate_temp, NULL};

static const ReplacementTag * const substitutions[] PROGMEM = {
 &subTempVarSub
};
#define REP_BUFFER_LEN 32
//static char replaceBuffer[REP_BUFFER_LEN];
//PString subBuffer (replaceBuffer, REP_BUFFER_LEN);


Così su due piedi non vedo motivi per cui non dovrebbe funzionare.
Sì, mi sono accorto che era inutile, infatti l'avevo già tolto ahah.
Però non riesco a capire perché non funziona.
La temperatura, con lo sketch di test del sensore riesco a leggerla e anche l'esempio WebServer della Shield Ethernet con il sensore funziona...

Cosmo99

#283
Mar 31, 2018, 09:44 pm Last Edit: Apr 01, 2018, 03:03 pm by Cosmo99
Ho risolto usando questa libreria:
https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib
e con questo codice:
Code: [Select]

#include <dht.h>

dht DHT;
void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
}

void loop() {
DHT.read11(A0);
float a = DHT.temperature;
Serial.println(a);
}



Ora funziona tutto per bene anche sulla pagina Web

Ho solo una domanda, come faccio a rendere la pagina dinamica e leggere il valore in tempo reale anche se cambia senza dover ricaricare la pagina?

SukkoPera

Metti nella sezione head qualcosa tipo:

Code: [Select]
<meta http-equiv="refresh" content="5" >
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up