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,
Tags:
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:
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:
if( load > 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:
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?
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:
e ali na outra condicional de fechamento da borboleta (isto é, do botão 2), vc faz algo como:
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:
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:
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();
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por