Boa Tarde,

Estou crianado um projeto em que utilizo um rele para abrir um sensor.. A abertura deste sensor é feito quando clico em botões em uma pagina php. São 2 botões, quando no primeiro botão o sensor abre, e ele deve ser fechado quando a balança chegar a 250g. E quando clico no segundo botão o sensor abre e deve ser fechado quando a balança chegar a 500g. Juntei codigos que encontrei na net.. mas esta acontecendo o seguinte problema, quando em qualquer um dos dois botões, o sensor se fecha quando a balança fecha em 250g.

Será que conseguem me ajudar com essa programação? 

Segue em anexo,

  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3.  
  4. //Configurações do Ethernet Shield
  5. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  6. byte ip[] = { 192,168,1, 90 }; // ip que o arduino assumirá
  7. byte gateway[] = { 192,168,1, 1 };  // ip do roteador
  8. byte subnet[] = { 255, 255, 0, 0 };
  9.  
  10. // String que representa o estado dos dispositivos
  11. char Luz[7] = "0000L#";
  12.  
  13. EthernetServer server(80); // Cria o servidor na porta 8081
  14.  
  15. // String onde é guardada as msgs recebidas
  16. char msg[7] = "0000L#";
  17.  
  18. float loadA = 0.173; //kg
  19. int analogvalA = 159; // Leitura analógico tomado com uma carga sobre a célula de carga
  20.  
  21. float loadB = 1.035; // kg
  22. int analogvalB = 834; // Leitura analógico tomado com uma carga sobre a célula de carga
  23.  
  24.  
  25. // Carregar o esboço de novo, e confirmar , que a partir da saída serial lendo agora quilos está correta , usando suas cargas conhecidos
  26.  
  27. float analogValueAverage = A3;
  28.  
  29. // Quantas vezes fazemos leituras ?
  30. long time = 0; //
  31. int timeBetweenReadings = 200; // Nós queremos uma leitura a cada 200 ms;
  32.  
  33.  
  34.  
  35.  
  36. float load;
  37.  
  38.  
  39. float analogToLoad(float analogval){
  40.  
  41.   // Usando um mapa - função personalizada, porque a função arduino mapa padrão utiliza apenas int
  42.  
  43.   float load = mapfloat(analogval, analogvalA, analogvalB, loadA, loadB);
  44.   return load;
  45. }
  46.  
  47. float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
  48. {
  49.   return (- in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  50. }
  51.  
  52.  
  53.  
  54.  
  55.  
  56. void setup() {
  57.   Ethernet.begin(mac, ip, gateway, subnet);
  58.   server.begin();
  59.  
  60.   pinMode(A4,OUTPUT);
  61.  
  62. }
  63.  
  64.  
  65. void loop() {
  66.  
  67.  
  68.  
  69.  
  70. botao1();  
  71. botao2();
  72.  
  73. }
  74.  
  75.  
  76. void botao1(){
  77.  
  78.  
  79.   EthernetClient client = server.available();
  80.  
  81.    
  82. int analogValue = analogRead(A3);
  83.  
  84.  
  85.   // Executando média - Nós suavizamos as leituras um pouco
  86.  
  87.  
  88.   analogValueAverage = 0.99*analogValueAverage + 0.01*analogValue;
  89.    
  90.  
  91.     load = analogToLoad(analogValueAverage);
  92.  
  93.  
  94.  
  95.  
  96.   // SE receber um caracter...
  97.   if (client) {
  98.     // guarda o caracter na string 'msg'
  99.     msg[1]=msg[2];
  100.     msg[2]=msg[3];
  101.     msg[3]=msg[4];
  102.     msg[4]=msg[5];
  103.     msg[5]=msg[6];
  104.     msg[6] = client.read();
  105.    
  106.     if (msg[6]=='#') {
  107.       switch(msg[5]) {
  108.         case 'R':
  109.          
  110.           // Se receber o comando 'R#' envia de volta o status dos
  111.           //   dispositivos. (Que é a string 'Luz')
  112.           client.write(Luz);
  113.         break;
  114.          
  115.  
  116.  
  117.  case 'P':
  118.  
  119.  
  120.       digitalWrite(A4, HIGH);
  121.    
  122.  
  123. break;
  124.       }
  125.  
  126.  
  127.      
  128.       }
  129.     }
  130.  
  131.  
  132.     if(load > 0.250 && load /span>0.500)
  133.     {
  134.          digitalWrite(A4, LOW);
  135.     }
  136.  
  137. }
  138.  
  139.  
  140.  
  141. void botao2(){
  142.  
  143.  
  144.   EthernetClient client = server.available();
  145.  
  146.    
  147. int analogValue = analogRead(A3);
  148.  
  149.  
  150.   // Executando média - Nós suavizamos as leituras um pouco
  151.  
  152.  
  153.   analogValueAverage = 0.99*analogValueAverage + 0.01*analogValue;
  154.    
  155.  
  156.     load = analogToLoad(analogValueAverage);
  157.  
  158.  
  159.  
  160.  
  161.   // SE receber um caracter...
  162.   if (client) {
  163.     // guarda o caracter na string 'msg'
  164.     msg[1]=msg[2];
  165.     msg[2]=msg[3];
  166.     msg[3]=msg[4];
  167.     msg[4]=msg[5];
  168.     msg[5]=msg[6];
  169.     msg[6] = client.read();
  170.    
  171.     if (msg[6]=='#') {
  172.       switch(msg[5]) {
  173.         case 'R':
  174.          
  175.           // Se receber o comando 'R#' envia de volta o status dos
  176.           //   dispositivos. (Que é a string 'Luz')
  177.           client.write(Luz);
  178.         break;
  179.          
  180.  
  181.  
  182.  case 'G':
  183.  
  184.  
  185.       digitalWrite(A4, HIGH);
  186.    
  187.  
  188. break;
  189.       }
  190.      
  191.  
  192.  
  193.      
  194.       }
  195.     }
  196.  
  197. if(load > 0.500)
  198.     {
  199.          digitalWrite(A4, LOW);
  200.     }
  201.  
  202. }

Exibições: 653

Anexos

Responder esta

Respostas a este tópico

fiquei confuso com sua explicação:

* o que vc quer dizer com "abertura de sensor"?

* explique melhor isso: "Juntei codigos que encontrei na net.. mas esta acontecendo o seguinte problema, quando em qualquer um dos dois botões, o sensor se fecha quando a balança fecha em 250g."

"Abertura de sensor" - Tenho um Corpo de Borboleta que abre com 5V, quando envio o "digitalWrite(A4, HIGH), o Corpo de Borboleta Abre.

Tenho 2 botões, o primeiro "Liberar 250g de Ração", quando clico nele envia a informação a cima para abrir o Corpo de Borboleta, e preciso que feche quando a balança (o "Load" do código) atingir 250g.

 o segundo "Liberar 500g de Ração", quando clico nele envia a informação a cima para abrir o Corpo de Borboleta, e preciso que feche quando a balança (o "Load" do código) atingir 500g.

A parte do botão eu consegui fazer, mas acontece que ele quando clico no botão 2, o corpo de borboleta fecha segundo o peso (Load) do primeiro botão (250g).

No Void Loop coloquei os "voids" botao1() e botao2(), me parece que ele só fecha o Corpo de borboleta com o peso do botao1(), pois quando retiro esse botao1() do Void Loop, ele segue o peso do botao2() (que é 500g).

Não sei se consegui explicar de forma clara desta vez.

sobre a abertura do teu sensor, ok... só acho esquisito chamar a borboleta de sensor. 

veja a linha 132 do seu código, ali onde está

&& load /span>0.500

pra que vc inseriu isso? onde vc definiu span? esse código está compilando?

descarte este span, no código original não existe ele

seria:

  1. if(load > 0.250 && load>0.500)
  2.     {
  3.          digitalWrite(A4, LOW);
  4.     }

O código compila perfeitamente.

ok entendido sobre o span....

agora vamos tentar entender essa sua condição:

"se load é maior que .25 E load é maior que .5, então coloque A4 em low"

perceba que não faz sentido essa sua condição pro botão1.

É redundante checar se o load é maior que .25 e .5 ao mesmo tempo. Ora, se load é maior que .5 com certeza ele será maior que .25 , então vc está inserindo código à toa, e na realidade o arduino entenderá apenas isso:

ifload 0.500 )

mas suponho que essa não era sua intenção, suponho que vc não está querendo detectar load acima de .5 pro botão 1, correto? Porque se essa era sua intenção, essa condição está errada pro botão 1, pois a borboleta não vai fechar em 250g, mas sim somente acima de 500g

Creio que vc esteja querendo detectar load acima de .25 e ao mesmo tempo abaixo de .5, isto é, entre .25 e .5, correto?

Se essa for sua intenção, deveria ter escrito o código assim:

 

  1. if load > 0.250 && load span class="sy0">0.500 )
  2.     {
  3.          digitalWrite(A4, LOW);
  4.     }

Correto, no botao1 ficaria exatamente desse jeito aí, load > .250 && load < .500.

Já no botao2, seria load>.500.

Porém, mesmo fazendo isso.. Quando vou testar e clico no botao2, ele continua fechando com o peso do botao1 (load> .250 && load< .500).

preciso ter acesso ao seu script PHP pra saber o que está ocorrendo.

Vc está passando os parâmetros corretos pro arduino?

Tipo desse jeito aí que vc programou o sketch, vc deverá passar R# pra acender a luz, P# pra acionar borboleta 1 e G# pra acionar borboleta 2. Vc checou se o seu script PHP está realmente programado pra fazer isso?

Vou lhe enviar jaja, mas acredito que está parte do php esteja tudo hoje, pois as funcionalidades de abrir borboleta (que é o que utilizo na página) está OK.

Não entendo muito bem, não sei se talvez o Arduíno leia sempre o primeiro valor (no caso botao1) e tenha que botar alguma condição ali dentro do void loop pra caso o seja clicado no botao2 ele "anule" o botao1?

se for pensar melhor, é por aí mesmo... seu raciocínio faz sentido.

o que vc teria que fazer é o seguinte: quando a borboleta for acionada por causa do pressionamento do botão 1, vc deverá guardar numa variável  booleana essa informação, para que a condicional da qual conversamos só feche a borboleta no peso apropriado conforme o botão pressionado.

exemplo:

  1. if load > 0.250 && load span class="sy0">0.500 && PrimeiroBotao == true )
  2.     {
  3.          digitalWrite(A4, LOW);
  4.          PrimeiroBotao == false;
  5.     }
  6.  

e ali na outra condicional de fechamento da borboleta (isto é, do botão 2), vc faz algo como:

  1. ifload > 0.500 && SegundoBotao == true )
  2.     {
  3.          digitalWrite(A4, LOW);
  4.          SegundoBotao == false;
  5.     }

Só que antes, vc precisa definir no início do seu sketch essas duas variáveis (PrimeiroBotao e SegundoBotao como sendo do tipo booleana )

Não se esqueça também que terás que marcar como true tais variáveis assim que for detectada a ordem de abertura da borboleta:

  1. case 'P': 
  2.       {
  3.       digitalWrite(A4, HIGH);
  4.       PrimeiroBotao = true;
  5.       break;
  6.       }

  1. case 'G':
  2.       { 
  3.       digitalWrite(A4, HIGH);
  4.       SegundoBotao = true; 
  5.       break;
  6.       }

Perceba que estou dando somente as idéias para vc mesmo fazer. Eu não tenho como testar, então talvez seja necessário alguns ajustes, mas a  idéia é essa

Fiz isto, fazendo as modificações continuou abrindo somente o menor valor.. Mas acho que este é o caminho!

Será que não tem como colocar condições tipo essas nesta parte do codigo:

  1. void loop() {
  2.   
  3. botao1();  
  4. botao2();
  5.  
  6. }

não dá pra colocar no void loop, desse jeito aí que vc está querendo, pois a caractere de acionamento da borboleta só será detectado após, isto é, só quando houver conexão do php

Gostaria que vc colasse aqui o sketch novo, já contendo as modificações que eu sugeri. Talvez vc tenha esquecido de colocar algo, então vamos tentar procurar o erro

#include <SPI.h>
#include <Ethernet.h>

//Configurações do Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 90 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,1, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 0, 0 };

// String que representa o estado dos dispositivos
char Luz[7] = "0000L#";

EthernetServer server(80); // Cria o servidor na porta 8081
EthernetServer server2(80);

// String onde é guardada as msgs recebidas
char msg[7] = "0000L#";

float loadA = 0.173; //kg
int analogvalA = 159; // Leitura analógico tomado com uma carga sobre a célula de carga

float loadB = 1.035; // kg
int analogvalB = 834; // Leitura analógico tomado com uma carga sobre a célula de carga


// Carregar o esboço de novo, e confirmar , que a partir da saída serial lendo agora quilos está correta , usando suas cargas conhecidos

float analogValueAverage = A3;
float analogValueAverage2 = A3;


// Quantas vezes fazemos leituras ?
long time = 0; //
int timeBetweenReadings = 200; // Nós queremos uma leitura a cada 200 ms;

float load;

float analogToLoad(float analogval){

// Usando um mapa - função personalizada, porque a função arduino mapa padrão utiliza apenas int

float load = mapfloat(analogval, analogvalA, analogvalB, loadA, loadB);
return load;
}

float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

const int bot1 = A4;
const int bot2 = A4;

boolean PrimeiroBotao;
boolean SegundoBotao;

void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

pinMode(bot1,OUTPUT);
pinMode(bot2,OUTPUT);
}

void botao1(){

EthernetClient client = server.available();

int analogValue = analogRead(A3);


// Executando média - Nós suavizamos as leituras um pouco


analogValueAverage = 0.99*analogValueAverage + 0.01*analogValue;

load = analogToLoad(analogValueAverage);


// SE receber um caracter...
if (client) {
// guarda o caracter na string 'msg'
msg[1]=msg[2];
msg[2]=msg[3];
msg[3]=msg[4];
msg[4]=msg[5];
msg[5]=msg[6];
msg[6] = client.read();

if (msg[6]=='#') {
switch(msg[5]) {
case 'R':

// Se receber o comando 'R#' envia de volta o status dos
// dispositivos. (Que é a string 'Luz')
client.write(Luz);
break;

case 'A':


digitalWrite(bot1, HIGH);
PrimeiroBotao = true;


break;
}



}
}


if ( load > 0.250 && load < 0.500 && PrimeiroBotao == true )
{
digitalWrite(bot1, LOW);
PrimeiroBotao == false;
}


}

void botao2(){

EthernetClient client = server.available();

int analogValue = analogRead(A3);


// Executando média - Nós suavizamos as leituras um pouco


analogValueAverage = 0.99*analogValueAverage + 0.01*analogValue;

load = analogToLoad(analogValueAverage2);

// SE receber um caracter...
if (client) {
// guarda o caracter na string 'msg'
msg[1]=msg[2];
msg[2]=msg[3];
msg[3]=msg[4];
msg[4]=msg[5];
msg[5]=msg[6];
msg[6] = client.read();

if (msg[6]=='#') {
switch(msg[5]) {
case 'R':

// Se receber o comando 'R#' envia de volta o status dos
// dispositivos. (Que é a string 'Luz')
client.write(Luz);
break;

case 'B':

digitalWrite(bot2, HIGH);

SegundoBotao = true;
break;
}



}
}


if( load > 0.500 && SegundoBotao == true )
{
digitalWrite(bot2, LOW);
SegundoBotao == false;
}

}


void loop() {

botao1();

botao2();
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço