arduino ajax web server ds1307 rtc

Buona sera a tutti è molto che non scrivo sul forum ;D ;D ;D ;D , comunque sia, ho un piccolo problema con il mio progetto, in poche parole arduino+ethernet shield mi fa da web server dove mi connetto alla pagina situata sulla scheda sd e controllo i valori di vari sensori di corrente tramite chiamate httprequest asincrone ed in oltre posso accendere e spegnere un motore elettrico con un bottone, fin qui tutto ok, qualche giorno fa ho comprato un ds1307 trc, per creare un temporizzatore per il motore, mi spiego meglio:
tramite delle text box e un pulsante vorrei impostare l’accensione e lo spegnimento del motore quindi per esempio dalle ore 12:00 alle ore 18:00 il motore deve essere acceso.

rieco ad inviare l’ora al sito, ho inserito text box e relativo bottone ma non riesco a capire come far leggere quei valori delle text box al codice principale delle richieste.

ds1307 rtc:

pagina web, questo è quello che sono riuscito a fare:

<html>
    <head>
        <title>CONTROLLO REMOTO</title>
		<meta name="viewport" content="whidth=device-width, initial-scale=1"/>
        <script>
		strLED3 = "";
		var LED3_state = 0;
		function GetArduinoIO()
		{
			nocache = "&nocache=" + Math.random() * 1000000;
			var request = new XMLHttpRequest();
			request.onreadystatechange = function()
			{
				if (this.readyState == 4) 
					{
						if (this.status == 200)
							{
								if (this.responseXML != null)
									{
										this.responseXML.getElementsByTagName('a1')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("a1")[0].innerHTML =this.responseXML.getElementsByTagName('a1')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("ore")[0].innerHTML =this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("min")[0].innerHTML =this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('sec')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("sec")[0].innerHTML =this.responseXML.getElementsByTagName('sec')[0].childNodes[0].nodeValue;
										
										/*this.responseXML.getElementsByTagName('pr')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("pr")[0].innerHTML =this.responseXML.getElementsByTagName('pr')[0].childNodes[0].nodeValue;
										this.responseXML.getElementsByTagName('a2')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("a2")[0].innerHTML =this.responseXML.getElementsByTagName('a2')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('a3')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("a3")[0].innerHTML =this.responseXML.getElementsByTagName('a3')[0].childNodes[0].nodeValue;*/
										
										if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "on") 
											{
												document.getElementById("LED3").innerHTML = "ON";
												LED3_state = 1;
												document.getElementById("LED3").style.backgroundColor="red";
											}
										else 
											{
												document.getElementById("LED3").innerHTML === "OFF"
												LED3_state = 0;
												document.getElementById("LED3").style.backgroundColor="green";
											}
										if(	this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue===HA && 
											this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue===MA )
												{
													LED3_state = 1;
													strLED3 = "&LED3=1";
												}
										else
										if(this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue===HS && 
											this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue===MA)	
												{
													LED3_state = 0;
													strLED3 = "&LED3=0";
												}
										
									}
							}
					}
			}
		
			request.open("GET", "ajax_inputs" + strLED3 + nocache, true);
			request.send(null);
			setTimeout('GetArduinoIO()', 1000);
			strLED3 = "";
		}

		function GetButton1()
			{
				if (LED3_state === 1) 
					{
						LED3_state = 0;
						strLED3 = "&LED3=0";
					}
				else 
					{
						LED3_state = 1;
						strLED3 = "&LED3=1";
					}
			}
			
		function myfunction()
			{ 
				var HA =document.getElementById("textbox1").value;
				var MA =document.getElementById("textbox2").value; 
				var HS =document.getElementById("textbox3").value;
				var MS =document.getElementById("textbox4").value; 
				
				/*var ora="ORA ACCENSIONE: "+HA+":"+MA+"\n\n"+"ORA SPEGNIMENTO: "+HS+":"+MS;
				window.alert(ora);*/
			} 
	
	</script>
			<style>
				.IO_box {
				
					border: 1.5px solid lightgray;
					width: 15%;
					border-radius: 30px;
					 background-color: rgba(555,500,500,0.3);
				}
				h1 {
					font-size: 120%;
					color: blue;
					margin: 0 0 10px 0;
				}
				h2 {
					font-size: 100%;
					color: blue;
				}
				button {
					font-size: 80%;
					color: #252525;
					border-radius: 5px;
					width:150px;
					height: 65px;
				}
				
				.amp
				{
					margin-left: -95px;
				}
				
				.press
				{
					margin-left: -55px;
				}
				body
				{
				background: -moz-linear-gradient(0deg,rgba(246,230,180,1) 0%, rgba(237,144,23,1) 100%);
				}
			</style>
    </head>
    <body onload="GetArduinoIO()">
	<center>
		<h1>Controllo remoto</h1>	
		<div class="IO_box">
		<form>
			<h2>ACCENDI/SPEGNI</h2>
			

			<button type="button" id="LED3" onclick="GetButton1()"> OFF </button>


			<h2>Assorbimento motore</h2>
			<p><b>L1(Ampere): <span class="a1">...</span></p>
			   <p>Ora: <span class="ore"></span>:<span class="min"></span>:<span class="sec"></span></b></p>
			

			<h2>Imposta ora accensione</h2>
			H:<input type="text" name="textbox1" id="textbox1" />
			


			M:<input type="text" name="textbox2" id="textbox2" /> 
			

			<h2>Imposta ora spegnimento</h2>
			H:<input type="text" name="textbox3" id="textbox3" />
			


			M:<input type="text" name="textbox4" id="textbox4" /> 
			


			<button type="button" name="button" id="button1" onclick="myfunction()" value="invia">IMPOSTA</button>
		</form>
		</div>
	</center>
    </body>
</html>

quando premi il pulsante IMPOSTA ... onclick="myfunction() va alla funzione

function myfunction(){ 
 var HA =document.getElementById("textbox1").value;
 var MA =document.getElementById("textbox2").value; 
 var HS =document.getElementById("textbox3").value;
 var MS =document.getElementById("textbox4").value; 
}

se le variabili le dichiari li dentro quando devi spedirle saranno sempre Undefined

sicuro di questo If? if (LED3_state === 1)

di mi stai dicendo che le variabili a cui associo i valori delle tex box le devo dichiarare all'interno di GetArduinoIO()? o mi sbaglio? il problema che la funzione GetArduinoIO() viene richiamata ogni secondo, ed è proprio quello il mio timore cioè che poi andra a prendere i valori dalle tex box ogni secondo.

grazie della risposta pablos :) :)

Ho provato a fare come mi hai consigliato, e naturalmente funziona, :smiley: :smiley: , solo che avrei prefereito usare il bottone per impostare gli orati, se avete qualche idea di come si possa fare sono ben accette, io ho già provato in tutti i modi che conoscevo. Questo è quello che sono riuscito a fare:

<html>
    <head>
        <title>CONTROLLO REMOTO</title>
		<meta name="viewport" content="whidth=device-width, initial-scale=1"/>
        <script>
		strLED3 = "";
		var LED3_state = 0;
		function GetArduinoIO()
		{
			nocache = "&nocache=" + Math.random() * 1000000;
			var request = new XMLHttpRequest();
			request.onreadystatechange = function()
			{
				if (this.readyState == 4) 
					{
						if (this.status == 200)
							{
								if (this.responseXML != null)
									{
										this.responseXML.getElementsByTagName('a1')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("a1")[0].innerHTML =this.responseXML.getElementsByTagName('a1')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("ore")[0].innerHTML =this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("min")[0].innerHTML =this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('sec')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("sec")[0].innerHTML =this.responseXML.getElementsByTagName('sec')[0].childNodes[0].nodeValue;
										
										/*this.responseXML.getElementsByTagName('pr')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("pr")[0].innerHTML =this.responseXML.getElementsByTagName('pr')[0].childNodes[0].nodeValue;
										this.responseXML.getElementsByTagName('a2')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("a2")[0].innerHTML =this.responseXML.getElementsByTagName('a2')[0].childNodes[0].nodeValue;
										
										this.responseXML.getElementsByTagName('a3')[0].childNodes[0].nodeValue;
										document.getElementsByClassName("a3")[0].innerHTML =this.responseXML.getElementsByTagName('a3')[0].childNodes[0].nodeValue;*/
										
										
										
										if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "on") 
											{
												document.getElementById("LED3").innerHTML === "ON";
												LED3_state = 1;
												document.getElementById("LED3").style.backgroundColor="red";
											}
										else 
											{
												document.getElementById("LED3").innerHTML === "OFF"
												LED3_state = 0;
												document.getElementById("LED3").style.backgroundColor="green";
											}
											
											var HA =document.getElementById("textbox1").value;
											var MA =document.getElementById("textbox2").value; 
											var HS =document.getElementById("textbox3").value;
											var MS =document.getElementById("textbox4").value; 
										
										if(	this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue===HA && 
											this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue===MA )
												{
													document.getElementById("LED3").innerHTML = "ON";
													LED3_state = 1;
													strLED3 = "&LED3=1";
													document.getElementById("LED3").style.backgroundColor="red";
												}
										else
										if(this.responseXML.getElementsByTagName('ore')[0].childNodes[0].nodeValue===HS && 
											this.responseXML.getElementsByTagName('min')[0].childNodes[0].nodeValue===MS)	
												{
													document.getElementById("LED3").innerHTML ="OFF"
													LED3_state = 0;
													strLED3 = "&LED3=0";
													document.getElementById("LED3").style.backgroundColor="green";
												}
										
									}
							}
					}
			}
		
			request.open("GET", "ajax_inputs" + strLED3 + nocache, true);
			request.send(null);
			setTimeout('GetArduinoIO()', 1000);
			strLED3 = "";
		}

		function GetButton1()
			{
				if (LED3_state === 1) 
					{
						LED3_state = 0;
						strLED3 = "&LED3=0";
					}
				else 
					{
						LED3_state = 1;
						strLED3 = "&LED3=1";
					}
			}
			
	/*	function myfunction()
			{ 
				var HA =document.getElementById("textbox1").value;
				var MA =document.getElementById("textbox2").value; 
				var HS =document.getElementById("textbox3").value;
				var MS =document.getElementById("textbox4").value; 
				
				var ora="ORA ACCENSIONE: "+HA+":"+MA+"\n\n"+"ORA SPEGNIMENTO: "+HS+":"+MS;
				window.alert(ora);
			} */
	
	</script>
			<style>
				.IO_box {
				
					border: 1.5px solid lightgray;
					width: 15%;
					border-radius: 30px;
					 background-color: rgba(555,500,500,0.3);
				}
				h1 {
					font-size: 120%;
					color: blue;
					margin: 0 0 10px 0;
				}
				h2 {
					font-size: 100%;
					color: blue;
				}
				button {
					font-size: 80%;
					color: #252525;
					border-radius: 5px;
					width:150px;
					height: 65px;
				}
				
				.amp
				{
					margin-left: -95px;
				}
				
				.press
				{
					margin-left: -55px;
				}
				body
				{
				background: -moz-linear-gradient(0deg,rgba(246,230,180,1) 0%, rgba(237,144,23,1) 100%);
				}
			</style>
    </head>
    <body onload="GetArduinoIO()">
	<center>
		<h1>Controllo remoto</h1>	
		<div class="IO_box">
		<form>
			<h2>ACCENDI/SPEGNI</h2>
			

			<button type="button" id="LED3" onclick="GetButton1()"> OFF </button>


			<h2>Assorbimento motore</h2>
			<p><b>L1(Ampere): <span class="a1">...</span></p>
			   <p>Ora: <span class="ore"></span>:<span class="min"></span>:<span class="sec"></span></b></p>
			

			<h2>Imposta ora accensione</h2>
			H:<input type="text" name="textbox1" id="textbox1" />
			


			M:<input type="text" name="textbox2" id="textbox2" /> 
			

			<h2>Imposta ora spegnimento</h2>
			H:<input type="text" name="textbox3" id="textbox3" />
			


			M:<input type="text" name="textbox4" id="textbox4" /> 
			


			<button type="button" name="button" id="button1" onclick="myfunction()" value="invia">IMPOSTA</button>
		</form>
		</div>
	</center>
    </body>
</html>

Ho capito cosa dici, puoi creare 2 funzioni ajax distinte, una che viene richiamata ogni secondo e una che viene richiamata solo quando pigi il button per spedire l'orario.

Cosa usi lato sketch arduino? "ajax_inputs" per riconoscere la chiamata?

si esatto:

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include "EmonLib.h" 
#include <Wire.h>
#include <RTClib.h>

#define REQ_BUF_SZ   60
RTC_DS1307 RTC;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 20);
EthernetServer server(80);
File webFile; 
char HTTP_req[REQ_BUF_SZ] = {0};
char req_index = 0;
boolean LED_state[1] = {0};
float Irms1=0,Irms2=0,Irms3=0;//,bar=0;
//int sensore=5;
EnergyMonitor emon1,emon2,emon3;

void setup()
{
   pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    if (!SD.begin(4)) 
    {
        return;
    }
    if (!SD.exists("index.htm"))
    {
        return;
    } 
    pinMode(8, OUTPUT);
    emon1.current(2, 95.23);
    emon2.current(3, 95.23);
    //emon3.current(4, 95.23);
    Ethernet.begin(mac, ip);  
    server.begin(); 
        Wire.begin();
    RTC.begin();
   // RTC.adjust(DateTime(__DATE__, __TIME__));
    
}

void loop()
{
    EthernetClient client = server.available(); 

    if (client)
    { 
        boolean currentLineIsBlank = true;
        while (client.connected())
        {
            if (client.available()) 
            {   
                char c = client.read(); 
                if (req_index < (REQ_BUF_SZ - 1)) 
                {
                    HTTP_req[req_index] = c;        
                    req_index++;
                }
              
                if (c == '\n' && currentLineIsBlank) 
                {
                    client.println("HTTP/1.1 200 OK");
                    if (StrContains(HTTP_req, "ajax_inputs"))
                    {
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        SetLEDs();
                      
                        XML_response(client);
                    }
                    else
                    { 
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
    
                        webFile = SD.open("index.htm");      
                        if (webFile)
                        {
                            while(webFile.available())
                            {
                                client.write(webFile.read());
                            }
                            webFile.close();
                        }
                    }
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
    
                if (c == '\n') 
                {
                    currentLineIsBlank = true;
                } 
                else if (c != '\r')
                {
                    currentLineIsBlank = false;
                }
            }
        }
        client.stop();
    }
}


void SetLEDs(void)
{
     Irms1 = (emon1.calcIrms(1480)-0.060);
     Irms2 = emon2.calcIrms(1480);
   /* Irms3 = emon3.calcIrms(1480);
    bar=(analogRead(sensore)-205)*0.019559;*/
    
    if (StrContains(HTTP_req, "LED3=1"))
    {
        LED_state[0] = 1;
        digitalWrite(8, HIGH);
    }
    else if (StrContains(HTTP_req, "LED3=0") /*|| Irms1<1.0 || Irms1>5.0*/)
    {
        LED_state[0] = 0;
        digitalWrite(8, LOW);
    }
 
}
    
void XML_response(EthernetClient cl)
{ 
   
     DateTime now = RTC.now();
  cl.print(F("<?xml version = \"1.0\" ?>"));
    cl.print(F("<in>"));
    
        cl.print(F("<a1>"));
        cl.print(Irms1);
        cl.println(F("</a1>"));
        
        
        cl.print(F("<ore>"));
        cl.print(now.hour(), DEC);
        cl.println(F("</ore>"));
        
        cl.print(F("<min>"));
        cl.print(now.minute(), DEC);
        cl.println(F("</min>"));
        
        cl.print(F("<sec>"));
        cl.print(now.second(), DEC);
        cl.println(F("</sec>"));
        
        cl.print(F("<LED>"));
     
         if (LED_state[0]) 
          {
            cl.print(F("on"));
          }
          else
          {
            cl.print(F("off"));
          }
        
        cl.println(F("</LED>"));
    cl.print(F("</in>"));
}

void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) 
    {
        str[i] = 0;
    }
}

char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) 
    {
        return 0;
    }
    while (index < len)
    {
        if (str[index] == sfind[found])
        {
            found++;
            if (strlen(sfind) == found)
            {
                return 1;
            }
        }
        else 
        {
            found = 0;
        }
        index++;
    }

    return 0;
}