Go Down

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

SukkoPera

"Code is read much more often than it is written, so plan accordingly. Design for readability."

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().
"Code is read much more often than it is written, so plan accordingly. Design for readability."

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...
"Code is read much more often than it is written, so plan accordingly. Design for readability."

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.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

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?
"Code is read much more often than it is written, so plan accordingly. Design for readability."

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.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

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" >
"Code is read much more often than it is written, so plan accordingly. Design for readability."

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

Go Up