URGENTE Servidor Web como permitir usuário alterar uma variável do sistema

Boa noite à todos.

Sou bastante leigo e preciso de uma ajuda urgente.

Criei um projeto, o qual tem variáveis. Tenho um servidor web rodando e consigo acessar a página, lá estarei criando um botão ou um campo para permitir o usuário digitar um valor e gostaria que esse valor seja atribuído a uma variável do sistema (que já tem um outro valor estipulado). Resumindo: o usuário está no celular ou notebook acessando a página e quero que ele digite um valor e esse valor seja atribuído a uma variável específica.

Existe como fazer isso de forma fácil e prática? Preciso muito da ajuda o mais breve possível.

O código do webservice é o padrão do IDE do arduino com alguns comandos HTML. Se precisar outras informações por favor me solicitem.

O servidor é esse… bem simples:

Preciso que, ao clicar naquele botão, de alguma forma solicite para o usuário digitar um valor. E esse valor eu gostaria de armazenar em uma variável global do sistema. É possível?

Agradeço desde já.

naldo

serv.jpg

Em HTML normalmente se usam forms (que contém campos editáveis e botões) para que o usuário digite e envie informações para o servidor.

Para obter ajuda com o código, nos mostre o código completo, para que possamos saber o que exatamente está usando e indicaremos uma solução adequada.

PS: Não esqueça de de colocar seu código dentro de tags [ code] e [/ code], para fazê-lo aparecer assim:

Código

Obrigado pela resposta giova014!

Então… o código é basicamente o que já vem com o IDE do arduíno para Webservice… Vou postar aqui abaixo então:

void apresentaDadosWEB() 

{
  // Aguardando novo cliente
  EthernetClient cliente = servidor.available();
  if (cliente) {
    // Uma requisição HTTP finaliza com uma linha em branco
    boolean linhaAtualEmBranco = true;
    while (cliente.connected()) {
      if (cliente.available()) {
        char c = cliente.read();
        if (c == '\n' && linhaAtualEmBranco) {
          // Envia um cabeçalho de resposta HTTP padrão
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          // A conexão será fechada após a resposta se completar
          cliente.println("Connection: close");  
          // Atualiza a página automaticamente a cada "x" segundos
          cliente.println("Refresh: 1.0");  
          cliente.println();
          cliente.println("<!DOCTYPE HTML>");
          cliente.println("<html><head><title>Servidor IrrigaWeb</title></head><body>");

	//AQUI TEM O CÓDIGO QUE APRESENTA TODAS AQUELAS INFORMAÇÕES DA IMAGEM POSTADA MAIS ACIMA, SENSORES, UMIDADE, ETC..

	// E ENTÃO CHEGA NO BOTÃO CONFORME IMAGEM TAMBÉM

	cliente.println("<button>Configurar % de umidade</button> <-- Configure o percentual limite inferior de umidade dos sensores

 * Valores estimados

 ** Desde quando o sistema foi iniciado
");
          cliente.println(limiteUmidadeInferior); //SÓ COLOQUEI PARA SABER O VALOR DA VARIÁVEL QUE PRECISO ALTERAR

	cliente.println("</body></html>");
          break;
        }
        if (c == '\n') {
          // Está iniciando uma nova linha
          linhaAtualEmBranco = true;
        } 
        else if (c != '\r') {
          // Obteve um caractere na linha
          linhaAtualEmBranco = false;
        }
      }
    }
    // Dar tempo para o navegador receber os dados
    delay(150);
    // Fecha a conexão
    cliente.stop();
  }

Tem alguns detalhes, a página fica atualizando de 1 em 1 segundo… eu precisaria alterar a variável global “limiteUmidadeInferior”. Digamos que ela tem o valor 15 hoje e eu queira aumentar digitando um valor, ou ainda pode ser que ao clicar no botão ele aumente de 5 em 5 a cada ação realizada… enfim… a maneira que vai modificar o valor não precisa ser necessariamente digitado o valor ou clicando em um botão… apenas gostaria que fosse modificado o valor.

Postar o código completo é bem extenso… mas no loop() é chamado essa função até que outra condição seja atingida e vá para outro setor de código. Mas nesse ponto eu precisaria conseguir que o usuário que está acessando o webservice no navegador consiga, de alguma maneira, modificar o valor da variável.

Se precisar mais informações só me avisar. Fiquei até tarde ontem e não obtive êxito :confused:

No código que postou, não há o tratamento das requisições de clientes, você apenas envia o ""HTTP/1.1 200 OK" + Conteúdo não importando o que o cliente envia.

Dê uma olhada neste link como fazer um form em html:

Sugiro que leia outros sites e aprenda como funciona.

Após entender o que é um form e como usá-lo, ao clicar em no botão "submit", seu servidor irá receber os dados do form com cabeçalho HTTP, diferente do cabeçalho GET que solicita a página inicial, dai a importância de tratar as requisições.

Neste tratamento: Você precisa diferenciar o método e caminho das requisições HTTP, para poder então ler os dados da form e salvar em uma variável global.
Somente em HTML, você TEM que clicar no botão para enviar a form. Caso queira que seja enviado em qualquer momento que altere o valor no HTML, deverá usar JavaScript.

Pesquise cabeçalhos HTTP Request e Response para ver como tratar os textos do cabeçalho.

Entendendo, faça um código no Arduino que processe corretamente, por exemplo (com código "bloqueador"):

  EthernetClient cliente = servidor.available();
  if (cliente) {
    if (cliente.connected()) {
      if (cliente.available()) {
		
		char metodo[16];
		memset(metodo,0,sizeof(metodo));
		
		char caminho[32];
		memset(caminho,0,sizeof(caminho));
		
		char versao[16];
		memset(versao,0,sizeof(versao));
		
		cliente.readBytesUntil(metodo,sizeof(metodo)-1,' ');
		cliente.readBytesUntil(caminho,sizeof(caminho)-1,' ');
		cliente.readBytesUntil(versao,sizeof(versao)-1,'\r');
		
		... Processa outros cabeçalhos se necessário
		
		cliente.find("\r\n\r\n"); //Procura o fim do cabeçalho
		
		if(strcmp_P(caminho,PSTR("/")) == 0){  //Caminho do index
			if(strcmp_P(metodo,PSTR("GET")) == 0){ //GET index
				
				... Envia a pagina inicial
			} 
			else {
				... Envia metodo invalido
			}
		} 
		else if(strcmp_P(caminho,PSTR("/salva")) == 0) { //Caminho para salvar
			if(strcmp_P(metodo,PSTR("POST")) == 0){ //POST salvar
			
				... Processa as variaveis no conteudo
				
				... Redireciona para a pagina inicial
			
			}
			else {
				... Envia metodo invalido
			}
		}
		else {
			... Envia caminho invalido
		}
	  }
	  
	  cliente.stop(); // Já tratou, pode fechar
	}
  }

Como observação, o delay(150) não é necessário, além de ser muito prejudicial

// Dar tempo para o navegador receber os dados
    delay(150);

Tente desenvolver e nos traga sua dúvidas.

Usa uma variável na sua url, por exemplo quando ele clicar no botão ele pega o valor que o usuário colocou no input e passa este valor através da url, algo com se ele indicar 30%, a url fica 192.168.0.198?valor1=30 e no código manda ele pesquisar se esta variável está citada e faz um tratamento com essa informação, cortando a string etc.
Tenta usar algo assim:

...
String url;
... 

while (client.connected()) {
      if (client.available()) {
        char cliente = client.read(); //lê as informações da requisição do cliente e associa a variável cliente
        url = url.concat(c);// transforma a informação contida em cliente em uma String chamada url 
        if (url.indexOf("valor1=")){//verifica se o valor1 foi passado no endereço da url pelo cliente
         /*Aqui você pega a posição do valor passado e cria uma variável com esse valor e 
         passa ao sistema*/
        }
      }
}


...

Qualquer dúvida estamos aqui!

Dá uma olhada nesse link aqui e vê se te esclarece:
link