Resultados da busca - %E3%80%90%E2%94%83%E6%80%BB%E4%BB%A32%E2%92%8F7%E2%92%8F01705%5B%EF%BC%B1%5D%E3%80%91%E3%80%91%E6%81%92%E8%BE%BE%E5%A8%B1%E4%B9%902%E6%8F%90%E7%8E%B0%E5%A5%BD%E4%B9%85%E5%88%B0
a no caso de a temperatura passar de um limite dito no código para o Arduíno. A comunicação da temperatura é feita usando um ethernet shield em uma rede local.
A ligação do motor do cooler é feito usando esquema a baixo. O transistor que estou usando é um TIP120 (neste caso acredito que não é necessária a utilização do diodo, mas em todo caso mantive por preciosismo).
O LM35 esta ligado em uma das portas analógicas.
O sistema todo vai pro espaço quando coloco o Shield e subo o código p/ o Arduíno. Quando o LM35 é ligado na porta A0 a resposta vai p/ 400, 500 C.Na porta A2 ele funciona normal, mas a leitura fica em torno de 30 - 33 C durante quatro ou cinco leituras e ai passa para valores muito mais altos(40 - 50 C) e a temperatura não sobe nem desce com fatores que deveriam muda-la (ferro de solda próximo ou algo que diminuía a temperatura).
Já tentei usar vários códigos e todos tem o mesmo comportamento, no momento estou tentando algo bem simples ainda sem o uso dos códigos para o Ethenet (mas ainda mantenho ele conectado, pois até sem ele o comportamento é o mesmo).
const int LM35 = A5; // Pino Analogico onde vai ser ligado ao pino 2 do LM35const int REFRESH_RATE = 2000; //Tempo de atualização entre as leituras em msconst float CELSIUS_BASE = 0.4887585532746823069403714565; //Base de conversão para Graus Celsius ((5/1023) * 100)const int LED_Controle = 8;float Controle;
#include <LiquidCrystal.h> //Inclui a biblioteca do LCDLiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Configura os pinos do Arduino para se comunicar com o LCD
int temp; //Inicia uma variável inteira(temp), para escrever no LCD a contagem do tempo
void setup() { Serial.begin(9600); pinMode(LED_Controle, OUTPUT); lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas)lcd.setCursor(0, 0); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCDlcd.setCursor(0, 1); //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD}
void loop() { Serial.print("Temperatura: "); Serial.println(readTemperature()); delay(REFRESH_RATE); Controle = readTemperature(); lcd.print(Controle); //Escreve no LCD "Olá Garagista!"
if(Controle > 33.00){digitalWrite(LED_Controle, HIGH);}else{digitalWrite(LED_Controle, LOW);}
lcd.setCursor(13, 1); //Posiciona o cursor na décima quarta coluna(13) e na segunda linha(1) do LCDlcd.print(temp); //Escreve o valor atual da variável de contagem no LCDdelay(1000); //Aguarda 1 segundotemp++; //Incrementa variável de contagem if(temp == 600) //Se a variável temp chegar em 600(10 Minutos),... { temp = 0; //...zera a variável de contagem }}
float readTemperature(){ return (analogRead(LM35) * CELSIUS_BASE); }
OBS: Como vou usar um display para informar offline, já coloquei isso no código.
Alguém já passou por algo assim? …
tive uma aula com o Elcids Chagas (usuário muito bom, era - pois está sumido já tem tempo - conhecido por responder com textos enormes e com uma quantidade igualmente enorme de conhecimento, as vezes mais conhecimento do que era necessário, mas aprendi que conhecimento nunca é demais) onde ele tratou desse assunto. Sei os motivos, mas não tenho capacidade de transmitir, NEM DE LONGE, com a precisão e didática que ele tem. Então serei simplista ok?)
Nos pinos analógicos do arduino, caso seja definido como entrada, você tem a opção de realizar uma leitura digital ou analógica.
A leitura digital (digitalRead()), retornará SEMPRE o valor 0 (0v) ou 1 (5v). É elementar, não precisa de mais explicações (acho que 3V, ainda retorna como HIGH/1/alto)
A leitura analógica (analogRead()) retornará um valor DE 0 (0v) ATÉ 1023 (5v).
O "arduino" possui apenas 1 entrada analógica real, entretanto ela é multiplexada (A0~A5), e fica num "loop" para trazer a informação ao usuário.
A vantagem, é que o usuário utiliza "6 entradas analógicas", e não apenas 1. E isso AMPLIA MUITO as possibilidades do produto (muito mesmo).
A desvantagem, de modo resumido, é que a mudança do canal do multiplexador gera uma capacitância parasita, com localização em uns 2 ou 3 subníveis do circuito. E esse é o motivo do ruído/variação.
Isso é um problema do "arduino"? não, é uma característica.
Isso é um problema para seu projeto? Depende do quão estável o sinal precisa ser para você.
Caso você precise de mais estabilidade do que ele fornece, então você irá precisar TRATAR o sinal para se adequar as suas necessidades. Para isso, existem 2 métodos: software e hardware (pode usar os 2 ao mesmo tempo também).
Por software
você poderá fazer uma média dos valores dentro de um determinado tempo. Ou seja, soma o valores "N" vezes, e depois divide por "N".
obs- Recomendo utilizar a lógica com millis(). Caso não saiba usar a função, veja este link: https://labdegaragem.com/forum/topics/aula-fun-o-millis
obs2- também pode usar uma soma direta, o resultado será parecido ex:
int var;
int count;
count = count + 1;
var = var + analogRead(pino);
if (count == 50){
var = var/50;
count = 0;
}
onde "var" será a referência do sinal do seu potenciometro.
Por hardware
você precisará fazer um filtro RC. Ele irá reduzir a capacitância parasita.
Sugestões para você assistir
- https://www.youtube.com/watch?v=pk1oV7GHaTI
- https://www.youtube.com/watch?v=zKMYsPMKYfQ
Após tratar este sinal, agora teremos um sinal mais estável. O que resta agora é LOGICA DE PROGRAMAÇÃO.
obs- caso eu tenha errado em algo, peço aos colegas que me corrijam. …
Adicionado por tiago merces ao 23:31 em 27 outubro 2022
mplos. Se vc não fizer isso, será uma empreitada difícil e ainda poderá não ter bons resultados. Então dedique-se e observe as coisas com a devida atenção.
Vamos então falar dos pontos enumerados que postei e vc respondeu. Então, seguindo a mesma enumeração:
1) ok, acho que ficou claro como os 3 LEDs (verde, vermelho, e amarelo) devem se comportar.
Mas conferindo se realmente entendi: o "verde" indica que o Sistema está funcionando e fica piscando indicando isso, mas pára de piscar quando algum problema é detectado (e claro, volta automaticamente a piscar quando o problema deixa de existir).
O "vermelho" pisca enquanto os Sensores de Pressão indicarem problema.
E o "amarelo" pisca enquanto o Sensor de Umidade indicar problema.
Mas ainda tenho uma questão sobre os níveis de Umidade, porém irei falar sobre isso mais à frente.
Sobre o envio de SMS, no seu código original este envio é feito apenas para problemas nos níveis de Pressão. Mas no post anterior, vc disse que deveria também ser enviado SMS para problemas de Umidade. Então pergunto: afinal, em que situações um SMS deve ser enviado?
2) ok, pelo código já tinha visto que era um Sensor de Pressão com saída analógica (eu só não sabia se era um único Sensor com dois sinais ou se eram dois Sensores independentes cada um com seu sinal). Sobre a parte da aferição, tenho um comentário a fazer, porém só o farei depois que publicar o código (mas não se preocupe porque é tranquilo, e se eu me esquecer disso, por favor me lembre).
Mas há uma consideração sobre a conexão dos Sensores de Pressão, que tem implicação no código. Vou esclarecer parcialmente (posteriormente darei mais detalhes). Veja este trecho do seu código original, onde vc faz as conversões AD para obter os níveis de pressão indicados pelos sensores, conforme mostro na figura a seguir salientado em amarelo:
(clique na figura para "zoom")
Observe que existe um "delay" de 80 mili-segundos entre a conversão AD (função "analogRead") do primeiro Sensor e a conversão do segundo Sensor de Pressão. A pergunta é: porque vc inseriu este "delay"? sem ele vc estava obtendo valores incorretos? Vou explicar porque estou perguntando sobre isso:
Ocorre que se vc não fizer a conexão adequada de um sinal analógico ao Arduino, poderão ocorrer erros nos valores convertidos, especialmente se existir no Sistema mais de um Canal Analógico sendo utilizado (que é o seu caso, pois além dos dois sensores de pressão vc tem também o sensor de Umidade).
Este problema ocorre porque a "impedância AC" do sinal analógico não é baixa o suficiente para permitir que o Conversor AD faça um sample adequado (o problema pode ocorrer mesmo quando a "impedância DC" é baixa, embora neste caso seja mesmo perceptível). Como consequência aparece um erro no valor convertido, quando se troca de um canal para outro (e também ocorre um problema chamado "Injeção de Carga", que os Fabricantes de Chips não gostam de falar porque nem sempre é fácil eliminar e eles não querem admitir ou evidenciar o problema).
Existem essencialmente duas técnicas para se eliminar esses erros (ou reduzi-los de forma que não sejam perceptíveis), e uma delas é fazer algo parecido com o que vc fez, acrescentando algo semelhante ao "delay". A outra forma é conectando adequadamente o sinal analógico, e esta é a forma preferível. Eventualmente inclusive, se utiliza as duas técnicas, se a coisa for muito "braba" (ou por precaução, como sempre faço).
Assim eu te aconselharia a usar a técnica de conectar de forma adequada o sinal dos seus Sensores ao Arduino. No entanto isso exige que vc acrescente um Resistor e um Capacitor em cada sinal. Mas isso fica a seu critério, e eu não posso determinar isso. Caso vc decida usar essa técnica, eu calcularei os Resistores e os Capacitores mais adequados, e mostrarei como vc deve fazer as conexões (é bem simples).
Então pense sobre isso. Mas se vc quiser usar apenas a técnica no código, tranquilo, farei isso mas sem usar o "delay" pois não é com ele que se implementa isso. Aproveito para dizer, que por regra geral, não se deve usar o "delay" fora da função "setup" do Arduino, e posteriormente explicarei porque.
Ainda sobre a Pressão, por favor veja a figura a seguir:
(clique na figura para "zoom")
Na parte marcada em "rosa", ficou claro que a Pressão é calculada em unidades de "bar", sendo esta a unidade que vc exibe no Display LCD. E portanto também fica claro que é esta unidade de pressão que seu Sistema realmente irá trabalhar depois de obter o valor do Sinal dos Sensores de Pressão.
Mas na parte em "verde" na figura, vc faz a conversão para uma outra unidade intermediária, antes de finalmente converter para "bar". Então pergunto: que unidade intermediária é esta? Vc faz isso pra facilitar seu sistema de calibração para cada um dos Sensores? (eu tenho quase certeza que seja isso, mas é melhor perguntar). Pergunto também, porque como eu disse antes, eu irei posteriormente fazer algumas considerações sobre a calibração, e que pode vir a te ajudar nesse processo.
Sobre o Sensor de Umidade, há uma sugestão que eu gostaria de te fazer. Vc não acha que seria mais adequado ter o valor da Umidade sendo diretamente proporcional à Umidade real? Veja: atualmente no seu Sistema, este valor é inversamente proporcional à Umidade real, ou seja, o máximo valor (no caso "1023") se refere à mínima Umidade, enquanto que o mínimo valor que é "0" (zero) se refere à máxima Umidade. Se fosse diretamente proporcional, este valor resultante poderia ser chamado de "Índice de Umidade", e quando seu valor for "0" indicará também a mínima Umidade. Esta forma me parece ter mais sentido. O que vc acha?
Sei que no código vc está usando a forma inversamente proporcional porque é assim que o pessoal usa por aí em blogs e sites na Internet. Eles simplesmente fazem a conversão AD no Arduino sem mais nenhum tratamento e que resulta nesse comportamento. Como vc disse que obteve pedaços de código aqui e ali na Internet, por tabela acabou seguindo esta regra "invertida". Mas pense sobre a sugestão que fiz.
3) sobre o Buzzer, está bem claro como deverá funcionar. Mas tenho uma questão sobre o Buzzer em si. Me parece que vc está usando um "Buzzer passivo", que é aquele que só emite som quando vc gera o sinal de som no Arduino (e seu código faz isso através da função "tone"). Para melhor entender veja a figura a seguir:
(clique na figura para "zoom")
Observe que marquei em "verde", uma informação na plaquinha do Buzzer que diz qual é o nível lógico que "aciona" o Buzzer. Este da figura é o mais comum, e vc pode ver que está marcado na placa que ele é acionado por nível lógico "LOW". É importante saber qual é este nível para o "Buzzer passivo", pois isto permite que efetivamente não seja aplicada tensão sobre o "Buzzer" quando este não está emitindo som. Veja: quando termina a ação da função "tone" (ou quando se usa a função "noTone"), o nível lógico que fica na saída do Arduino é justamente o nível "LOW", e no caso da plaquinha da figura estaríamos aplicando tensão ao Buzzer, embora este não emita som (pois o sinal aplicado é agora estático). Isto força o "piezzo" do Buzzer, e a médio ou longo prazo poderá danificá-lo. Então é melhor evitar isso. Para tal, basta aplicar-se o nível lógico adequado ao Buzzer logo após parar o sinal do som. Já fiz isso no código, porém não sei qual é o nível lógico que liga seu Buzzer. Então por favor, verifique qual é, e se possível coloque aqui uma foto da sua plaquinha Buzzer, para deixarmos claro.
4) sobre as mensagens de SMS, tranquilo, eu imaginava que vc iria ainda ajustar isso adequadamente. Mas lembre-se que o bom-senso nos diz: não deixe para depois o que se pode facilmente fazer agora.
No código irei colocar mensagens que estejam relacionadas a cada alerta, e depois vc altera isso da forma que vc achar mais adequado. O mesmo se aplica para as mensagens exibidas no Display LCD para as Pressões medidas.
Sobre a questão do "auto-teste" tanto para os LEDs quanto para os demais elementos (Buzzer, SMS, etc), é tranquilo de implementar. Mas irei fazer isso somente depois que vc disser que todo o restante está funcionando da forma correta, ok?
Eu ainda tenho uma dúvida sobre as faixas de Umidade que vc usa para sinalizar os alertas (se vc olhar com cuidado seu código original, talvez vc já descubra que dúvida é esta). Mas irei perguntar depois, já que isto praticamente não tem impacto no código.
O código está 99% pronto. Falta apenas esclarecer os pontos aqui mencionados.
Fico no aguardo de um retorno seu sobre estes pontos.
Ah Cabana, por favor, mude o título deste tópico para um que tenha realmente sentido sobre o que vc está implementando, porque este nome que vc colocou, pelo amor de Deus. E ainda é o mesmo nome do seu tópico anterior. Jesus.
Abrçs,
Elcids…
Adicionado por Elcids Chagas ao 19:55 em 29 fevereiro 2020
s
Preciso de um código para 4 acionamento, pois tenho um Módulo com 4 Reles de 5 volts
Testei o seu, Sketch que mandou, mas ela pisca as duas lampada simultaneas e apagas as duas ( não firma );
Esse SKETCH AQUI ABAIXO, FUNCIONA, MAIS É SÓ PRA UM ACIONAMENTO.
Portanto, acho que o código que me mandou, tem algum bug.
Da pra conferir pra mim e se puder acrescentar mais 2 acionamentos.Valeu
Obs. Se quiser mando a foto de como esta meu ARDUINO com conecxoes.
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; //physical mac address
byte ip[] = { 192, 168, 0, 105 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(85); //server port
String readString;
int pin = 9;
boolean ligado = true;
//////////////////////
void setup(){
pinMode(pin, OUTPUT); //pin selected to control
//start Ethernet
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
//the pin for the servo co
//enable serial data print
Serial.begin(9600);
Serial.println("RoboCore Remote Automation V1.1"); // so I can keep track of what is loaded
}
void loop(){
// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}
//if HTTP request has ended
if (c == '\n') {
///////////////////// control arduino pin
Serial.println(readString); //print to serial monitor for debuging
if(readString.indexOf("?ligar") >0)//checks for on
{
digitalWrite(pin, HIGH); // set pin 4 high
Serial.println("On");
ligado = false;
}
else{
if(readString.indexOf("?desligar") >0)//checks for off
{
digitalWrite(pin, LOW); // set pin 9 low
Serial.println("Off");
ligado = true;
}
}
//clearing string for next read
readString="";
///////////////
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>RoboCore - Remote Automation</title>");
client.println("<meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'>");
client.println("<link rel='stylesheet' type='text/css' href='http://www.robocore.net/upload/projetos/RemoteAutomationV1.0.css' />");
client.println("<script type='text/javascript' src='http://www.robocore.net/upload/projetos/RemoteAutomationV1.0.js'></script>");
client.println("</head>");
client.println("<body>");
client.println("<div id='wrapper'>RoboCore Remote Automation V1.1");
client.print("<div id='rele'></div><div id='estado' style='visibility: hidden;'>");
client.print(ligado);
client.println("</div>");
client.println("<div id='botao'></div>");
client.println("</div>");
client.println("<script>AlteraEstadoRele()</script>");
client.println("</body>");
client.println("</head>");
delay(1);
//stopping client
client.stop();
}
}
}
}
}
…
a gravação no Pic18F452, via ZIF, como aprendizado valeu a pena, financeiramente não, o tempo que gastei montando o mesmo, e os componentes, poderia ter comprado um gravador USB Clone no mercado livre.
Sugiro você comprar um gravador ao invés de montar um, caso você esteja com pressa, ou queira evitar dor de cabeça. Se você tive tempo e dinheiro, além de gostar de desafios, monte um gravador USB ICD2 Clone, por exemplo o ICD2 Potyo REV. 2, tem vários fórums que dão dica de como montar um. Veja alguns fórums abaixo:
Caso queira comprar gravadores prontos de empresas, segue abaixo algumas que conheço :
Empresa Maisco Engenharia
Gravador ICD2BR c/ ZIF (Valor:R$ 423,90)
Vantagem: A garantia deles é excelente, qualquer problema com ele a garantia cobre, o suporte é excelente.
Desvantagem: O preço é o mais caro do mercado
Link -> http://www.mosaico.com.br/?canal=5&pg=showProduto&path=produtos&id=94
Empresa Microgenios
Gravador MicroICD ZIF - Gravador e Debugador de PIC e dsPIC via USB 2.0 (Valor:R$ 220,00)
Vantagem: Preço bom, incluso Zif na placa de gravação
Desvantagem: Gravador baseado no PIKIT2, para quem prefere o ICD2, não serve, e também não é compatível com Windows 2000.
Link -> http://www.microgenios.com/?1.32.0.0,353,gravador-microicd-zif-gravador-e-debugador-de-pic-e-dspic-via-usb-2.0.html
Empresa Cerne Tec
Gravador e Debugador Cerne USB ( Valor:R$ 199,90 )
* Com o conector ZIF o gravador fica em R$ 239,90
Vantagem: Preço bom, possibilidade com conector ZIF.
Desvantagem: Gravador baseado no ICD2, para quem prefere o PICKIT 2 não serve, e também caso você não opte pelo conector ZIF, pode ter certeza que terá problemas com os soquetes laminados, já tive problemas com soquete laminado, é uma droga, sempre prefira soquete torneado para CIs.
Link -> http://www.cerne-tec.com.br/detalhescerneusb.htm
Empresa Ace Pic
Gravador e Depurador ACE USB c/ soquete ZIF (Valor: R$ 155,00) Gravador e Depurador para microcontroladores PIC via USB baseado no PicKit2
Vantagem: Preço excelente.
Desvantagem: Gravador baseado no ICD2, para quem prefere o PICKIT 2 não serve.
Link -> http://www.acepiccamp.com.br/produto-17-gravador_e_depurador_para_microcontroladores_pic_ace_usb_com_conector_zif
Gravador e Depurador para microcontroladores PIC ACE ICD (Valor: R$ 260,00)
Vantagem/Desvantagem: Gravador baseado no ICD2, para quem prefere o PICKIT 2 não serve.
Link -> http://www.acepiccamp.com.br/produto-57-gravador_e_depurador_para_microcontroladores_pic_ace_icd
Empresa: Autonomo roMEro Eletrônica - fone (11) 2959-5583
Gravadores Clones Profissionais de ICD2 + PICKit2 - Combo PICKit2 + ICD2-LT + PIC-Zad Completo
Você compra os 2 tipos de gravadores PICKIT2 E ICD2 Juntos (Valor: R$ 315)
Vantagem: Excelente preço pois você os 2 tipos de gravadores (ICD2 e PICKIT2) juntos, excelente referências do vendedor, tenho colegas que compraram com ele, e só fizeram elogios, o cara é sério, pode confiar. Inclusive ele está em vários fóurms dando dicas e explicações sobre gravadores de Pic (o cara é Gente Boa).
Desvantagem: Nenhuma
Minha Opinião: Só não comprei com ele ainda, porque já tinha montado o gravador Easyprog serial (http://www.embedinc.com/easyprog/), mas caso precise de um gravador de PIC USB, com certeza vou compra com o roMEro Eletrônica.
Link com Dados para contato -> http://www.embarcados.com.br/Compra-e-venda/Message-416.html
Link com aúnico do roMEro Eletrônica no mercado livre: -> http://produto.mercadolivre.com.br/MLB-172791720-gravador-programador-pic-combo-pickit2icd2-ltsoquete-zif-_JM
EXPLICAÇÃO SOBRE GRAVADOR ICD2 e PIKIT2 (informações fornecidas pelo roMEro Eletrônica em seu aúnico no mercado livre)
Nota aos Compradores:A Microchip tem duas famílias de ferramentas de desenvolvimento para atender necessidades de seus usuário para as quais projetei clones de baixo custo, alta qualidade e excelente desempenho:PICKit - São programadores de dispositivos. O PICKit2 é um programador com facilidade de programação remota e software aplicativo especial para programação de dispositivos chamado PICKit2 Programmer. Funciona também integrado ao MPLAB e executa depuração de programas com limitação na interface USB de tecnologia HID (mais fácil de instalar e mais lenta) e pelo próprio hardware onde é aplicado apenas um microcontrolador para comunicação USB e interface de hardware com o microcontrolador alvo (Target). O PICKit3 deveria ser a evolução do PICKit2, mas perdeu o programa dedicado a programação de dispositivos e teve também algumas restrições e algumas melhorias no hardware. Não cheguei a testar o PICKit3, mas tenho observado comentários sobre o produto na Internet.ICD - É um In Circuit Debugger dai vem as letras do nome da ferramenta ICD - Quer dizer, foi concebido para ser um depurador de programas de baixo custo nato (Debugger). Para depurar programas usa uma interface USB mais rápida com drivers de software USB desenvolvidos pela própria Microchip com ênfase em velocidade. No hardware se aplicam dois microcontroladores e os firmwares são atualizados automaticamente para cada microcontrolador aplicado em desenvolvimento de programa - tudo para garantir o melhor desempenho. Esse clone é reconhecido no MPLAB como ICD2 e opera diretamente e com o mesmo desempenho do original, pois aplica os mesmos microcontroladores usados nas últimas versões lançadas pela Microchip e os mesmos drivers de software para controle, ou seja, usa o PIC16F877A para interface com o microcontrolador em desenvolvimento (Target) e PIC18F4550 para interface USB. A evolução dele é o ICD3, que tenho em meu laboratório e aparece nas fotos, o impeditivo dele é seu custo na casa dos R$1000,00 e a aplicação de componentes avançados o que inviabiliza o lançamento de clones de baixo custo.O ICD2 já um clone avançado e difícil de produzir com boa qualidade e funcionalidade, esse fato pode ser comprovado pela baixa oferta desse clone.Esse clone é totalmente compativel com todos os componentes apontados para ele pelo MPLAB e opera sem restrição de sistemas operacionais desde que seja intslados corretamente os drivers USB que são dedicados para ele.O MPLAB é o aplicativo de software que controla essas duas ferramentas através do computador. Esse programa informa, na opção de seleção de dispositivos, quais as ferramentas e necessidades especiais existem para as operações de programação e depuração de cada microcontrolador. Alguns componentes não são depurados diretamente pelas ferramentas havendo necessidade de compra de acessórios especiais para a operação de depuração. Exemplo, PIC com baixo número de pinos precisam de Headers para a depuração - veja o microcontrolador PIC16F648A que pede um header de mais pinos que deve ser colocado na posição do PIC16F648A para a atividade de depuração dos programas.Por isso recomendo que todos os interessados baixem o MPLAB gratuitamente do site da Microchip e verifiquem quais as necessidades para os microcontroladores nos quais possuem interesse. Também é muito importante estudar os Datasheets desse microcontroladores. São atitudes muito simples que facilitam muito a vida de quem trabalha com isso.Alguns pontos interessante para ilustrar. O PIC16F84 que possui muitos exemplos de aplicações na internet é tratado apenas no ICD2. Meu clone de PICKit2 permite programação direta de microcontroladores que trabalham com VDD de 3,3V, por isso a placa soquete ZIF não é fornecida totalmente populada.Espero ter ajudado os futuros compradores na sua decisão e alerto também para o fato de que são ferramentas de engenharia e sujeitos a especificações onde se justifica a relação entre custo beneficio de cada produto. Muito ObrigadoEquipe roMEro Eletrônica
rona123 Fone (11) 2959-5583
//=======================================================================================
Espero ter ajuado
Abraços
Alexandre Augusto
…
eralmente em paredes, etc. Preciso incluir uma rotina para ler 2 sensores-chaves (micro-swiches) tipo bigode-de-gato, para que o robô saia desse "encosto". Produzí e tentei várias rotinas (uma já veio com o kit do robô, mas usando apenas uma chave), sem sucesso: Ou funcionam os motores+ultrassom, ou as chaves. Testei colocar a minha rotina em vários pontos do sketch. Atualmente dividi essa rotina para ver se funcionavam os dois sensores (2 chaves e o ultrassom). Não deu certo.
Abaixo cópia do sketch mais atual. Este tem 4 páginas em A4, sem espaços entre linhas. Vou copiar aqui é o sketch mesmo, tirado da IDE, ok?
//--------------- Programa JABUTINO sketch 20140510 ----------- #include
#include
//Instancia o objeto referente aos motores DC AF_DCMotor motorEsquerdo(1); //Motor esquerdo na conexão "M1"
AF_DCMotor motorDireito(2); //Motor direito na conexão "M2"
//Definições de velocidade em PWM de 0 a 255 const char VEL_MAX = 255;
const char VEL_MIN = 0;
const char VEL_MED = 200;
//Pinos para controle do Ultrassom HC-SR04 //usar as portas analógicas A0 e A1 como digitais
const int pinoTrigger = 14; // A0 = 14
const int pinoEcho = 15; // A1 = 15
//Servo Motor Servo meuServo;
const int pinoServo = 10; //o pino 10 é o pino de sinal da conexão "SERVO_2"
//Define as posições de calibragem do servo //Valores para conseguir um melhor alinhamento do servo, cada motor responde de forma diferente.
//Os valores devem variar de 0 a 180 graus, ajuste de acordo com seu motor na tentativa e erro.
const int OLHA_ESQ = 180; const int OLHA_DIR = 0;
const int OLHA_FRT = 90;
// Pino em que o BUZZER está conectado: const int pinoBuzzer = 9;
// PINOS que vão conectar as 2 CHAVES (sensores de colisão): const int ChaveE = 18;
const int ChaveD = 19;
//Método obrigatório //Realiza as definições dos pinos e faz a inicialização da biblioteca de servo.
void setup(void) {
// Inicializa os motores com velocidade máxima
motorEsquerdo.setSpeed(VEL_MAX);
motorDireito.setSpeed(VEL_MAX);
//atribui os pinos do ultrassom pinMode(pinoTrigger, OUTPUT);
pinMode(pinoEcho, INPUT);
Serial.begin(9600); /* função provisória, para controle da rotina das chaves.*/ /* define os pinos como entrada ligando um resistor pullup a eles */
pinMode(ChaveE, INPUT_PULLUP); // MUITO IMPORTANTE
pinMode(ChaveD, INPUT_PULLUP);
//inicia o Servo meuServo.attach(pinoServo);
//Coloca o servo virado para posicao frontal
meuServo.write(OLHA_FRT);
} // fim do setup //================================================
//Corpo principal do programa, repete infinitamente
void loop()
{
// Inicia andando para frente
andarpFrente(VEL_MAX);
// Faz a leitura dos sensores de CHAVES = colisão: int lerChaveE = digitalRead(ChaveE);
int lerChaveD = digitalRead(ChaveD);
//Enquanto não encontrar um obstáculo a menos de 10cm while(medeDistancia() > 10)
{
delay(100); //Faz uma leitura da distancia a cada 0,1 segundo
}
{ //imprime o valor chave Esq: if (lerChaveE == HIGH)
{ Serial.println("Esquerda");
tone(pinoBuzzer, 840); //envia um sinal de 740Hz para o pino 9 delay(100); //aguarda 0,1 segundo
noTone(pinoBuzzer); //interrompe o som no pino 9
girarpDireita(VEL_MED);
delay(500); //aguarda 1 segundo
}
else
// if (lerChaveD != lidoAntD)
{ // imprime o valor da chave Direita:
if (lerChaveD == HIGH)
{ Serial.println("Direita");
tone(pinoBuzzer, 840); //envia um sinal de 840Hz para o pino 9 delay(100); //aguarda 0,1 segundo
noTone(pinoBuzzer); //interrompe o som no pino 9
girarpEsquerda(VEL_MED);
delay(500); //aguarda 0,5 segundo
}
}
//Se encontrou um obstáculo recua por 1 segundo e pára
andarpTras(VEL_MED);
delay(1000);
pararMotores();
//Verifica qual lado tem maior distância até um obstáculo int esquerda = 0, direita = 0;
meuServo.write(OLHA_ESQ); //vira o servo para a esquerda delay(500); //aguarda o servo completar o movimento
esquerda = medeDistancia(); //mede a distância na esquerda
meuServo.write(OLHA_DIR); //vira o servo para a direita
delay(500); //aguarda o servo completar o movimento
direita = medeDistancia(); //mede a distância na direita meuServo.write(OLHA_FRT); //olha pra frente novamente
delay(500); //aguarda o servo completar o movimento
if(esquerda > direita) /*se a distancia do obstáculo na esquerda for maior que na direita vira para esquerda */
{
girarpEsquerda(VEL_MAX);
}
else /* se a distância do obstáculo na direita for maior ou igual que na esquerda
vira para a direita */
{
girarpDireita(VEL_MAX);
}
//Aguarda alguns instantes para o robô virar
delay(500); //<< modifique esse tempo se desejar que ele vire por mais ou menos tempo // Fim da rotina de obstáculos // Inicio da rotina das CHAVES / colisão: // ==> tirado daqui e dividido, para tentar o funcionamento.
// armazena o valor lido para monitorar as próximas mudanças: // lidoAntE = lerChaveE;
// lidoAntD = lerChaveD;
// aguarda minimamente para eliminar ruidos: delay(5);
int lerChaveE = LOW; // Garante que a chave Esq estará em LOW.
int lerChaveD = LOW; // Garante que a chave Dir estará em LOW.
}
// final da rotina das CHAVES
} // Fim do LOOP
//Utiliza o sensor de Ultrassom HC-SR04 para medir a distância em centímetros int medeDistancia()
{
//Garante que o pino de Trigger está LOW
digitalWrite(pinoTrigger, LOW);
delayMicroseconds(2);
//cria um pulso de 5 microssegundos no Trigger
digitalWrite(pinoTrigger, HIGH);
delayMicroseconds(5);
digitalWrite(pinoTrigger, LOW);
//aguarda o echo long microssegundos = pulseIn(pinoEcho, HIGH);
// A velocidade do som é 340 m/s ou aproximadamente 29 microssegundos por centimetro.
// O pulso faz uma viagem de ida e volta do sensor até o obstáculo
// assim, para calcular a distancia temos que dividir esse tempo pela metade
// desta forma...
return int(microssegundos / 29 / 2);
} // Fim do CalcularDistancia
// ======== void's dos motores: =============
//Gira as duas rodas para frente //Como os motores estão virados para lados opostos eles devem
//girar em sentidos opostos para que as rodas girem na mesma direção
void andarpFrente(char velocidade) {
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(FORWARD);
motorDireito.run(BACKWARD);
}
//Gira as duas rodas para trás //Como os motores estão virados para lados opostos eles devem
//girar em sentidos opostos para que as rodas girem na mesma direção
void andarpTras(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(BACKWARD);
motorDireito.run(FORWARD);
}
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpEsquerda (char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(BACKWARD);
motorDireito.run(BACKWARD);
}
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpDireita(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(FORWARD);
motorDireito.run(FORWARD);
}
//Pára os motores definindo os dois pinos Enable em estado Low void pararMotores()
{
motorEsquerdo.run(RELEASE);
motorDireito.run(RELEASE);
}…
eralmente em paredes, etc. Preciso incluir uma rotina para ler 2 sensores-chaves (micro-swiches) tipo bigode-de-gato, para que o robô saia desse "encosto". Produzí e tentei várias rotinas (uma já veio com o kit do robô, mas usando apenas uma chave), sem sucesso: Ou funcionam os motores+ultrassom, ou as chaves. Testei colocar a minha rotina em vários pontos do sketch. Atualmente dividi essa rotina para ver se funcionavam os dois sensores (2 chaves e o ultrassom). Não deu certo. Abaixo cópia do sketch mais atual. Este tem 4 páginas em A4, sem espaços entre linhas. Vou copiar aqui é o sketch mesmo, tirado da IDE, ok?
//--------------- Programa JABUTINO sketch 20140510 ----------- #include #include
//Instancia o objeto referente aos motores DC AF_DCMotor motorEsquerdo(1); //Motor esquerdo na conexão "M1" AF_DCMotor motorDireito(2); //Motor direito na conexão "M2"
//Definições de velocidade em PWM de 0 a 255 const char VEL_MAX = 255; const char VEL_MIN = 0; const char VEL_MED = 200;
//Pinos para controle do Ultrassom HC-SR04 //usar as portas analógicas A0 e A1 como digitais const int pinoTrigger = 14; // A0 = 14 const int pinoEcho = 15; // A1 = 15
//Servo Motor Servo meuServo; const int pinoServo = 10; //o pino 10 é o pino de sinal da conexão "SERVO_2"
//Define as posições de calibragem do servo //Valores para conseguir um melhor alinhamento do servo, cada motor responde de forma diferente. //Os valores devem variar de 0 a 180 graus, ajuste de acordo com seu motor na tentativa e erro.
const int OLHA_ESQ = 180; const int OLHA_DIR = 0; const int OLHA_FRT = 90;
// Pino em que o BUZZER está conectado: const int pinoBuzzer = 9;
// PINOS que vão conectar as 2 CHAVES (sensores de colisão): const int ChaveE = 18; const int ChaveD = 19;
//Método obrigatório //Realiza as definições dos pinos e faz a inicialização da biblioteca de servo.
void setup(void) { // Inicializa os motores com velocidade máxima motorEsquerdo.setSpeed(VEL_MAX); motorDireito.setSpeed(VEL_MAX);
//atribui os pinos do ultrassom pinMode(pinoTrigger, OUTPUT); pinMode(pinoEcho, INPUT);
Serial.begin(9600); /* função provisória, para controle da rotina das chaves.*/ /* define os pinos como entrada ligando um resistor pullup a eles */ pinMode(ChaveE, INPUT_PULLUP); // MUITO IMPORTANTE pinMode(ChaveD, INPUT_PULLUP);
//inicia o Servo meuServo.attach(pinoServo); //Coloca o servo virado para posicao frontal meuServo.write(OLHA_FRT);
} // fim do setup //================================================ //Corpo principal do programa, repete infinitamente void loop() { // Inicia andando para frente andarpFrente(VEL_MAX);
// Faz a leitura dos sensores de CHAVES = colisão: int lerChaveE = digitalRead(ChaveE); int lerChaveD = digitalRead(ChaveD);
//Enquanto não encontrar um obstáculo a menos de 10cm while(medeDistancia() > 10) { delay(100); //Faz uma leitura da distancia a cada 0,1 segundo }
{ // chave Esq: if (lerChaveE == HIGH) { Serial.println("Esquerda");
tone(pinoBuzzer, 840); //envia um sinal de 740Hz para o pino 9 delay(100); //aguarda 0,1 segundo noTone(pinoBuzzer); //interrompe o som no pino 9 girarpDireita(VEL_MED); delay(500); //aguarda 1 segundo } else { // chave Direita: if (lerChaveD == HIGH) { Serial.println("Direita");
tone(pinoBuzzer, 840); //envia um sinal de 840Hz para o pino 9 delay(100); //aguarda 0,1 segundo noTone(pinoBuzzer); //interrompe o som no pino 9 girarpEsquerda(VEL_MED); delay(500); //aguarda 0,5 segundo } } //Se encontrou um obstáculo recua por 1 segundo e pára andarpTras(VEL_MED); delay(1000); pararMotores();
//Verifica qual lado tem maior distância até um obstáculo int esquerda = 0, direita = 0;
meuServo.write(OLHA_ESQ); //vira o servo para a esquerda delay(500); //aguarda o servo completar o movimento esquerda = medeDistancia(); //mede a distância na esquerda meuServo.write(OLHA_DIR); //vira o servo para a direita delay(500); //aguarda o servo completar o movimento
direita = medeDistancia(); //mede a distância na direita meuServo.write(OLHA_FRT); //olha pra frente novamente delay(500); //aguarda o servo completar o movimento
if(esquerda > direita) /*se a distancia do obstáculo na esquerda for maior que na direita vira para esquerda */ { girarpEsquerda(VEL_MAX); } else /* se a distância do obstáculo na direita for maior ou igual que na esquerda vira para a direita */ { girarpDireita(VEL_MAX); } //Aguarda alguns instantes para o robô virar delay(500); // modifique esse tempo se desejar que ele vire por mais ou menos tempo // Fim da rotina de obstáculos
// Inicio da rotina das CHAVES / colisão: // ==> tirado daqui e dividido, para tentar o funcionamento.
// aguarda minimamente para eliminar ruidos:
delay(5); int lerChaveE = LOW; // Garante que a chave Esq estará em LOW. int lerChaveD = LOW; // Garante que a chave Dir estará em LOW. } // final da rotina das CHAVES
} // Fim do LOOP
//Utiliza o sensor de Ultrassom HC-SR04 para medir a distância em centímetros int medeDistancia() { //Garante que o pino de Trigger está LOW digitalWrite(pinoTrigger, LOW); delayMicroseconds(2); //cria um pulso de 5 microssegundos no Trigger digitalWrite(pinoTrigger, HIGH); delayMicroseconds(5); digitalWrite(pinoTrigger, LOW);
//aguarda o echo long microssegundos = pulseIn(pinoEcho, HIGH); // A velocidade do som é 340 m/s ou aproximadamente 29 microssegundos por centimetro. // O pulso faz uma viagem de ida e volta do sensor até o obstáculo // assim, para calcular a distancia temos que dividir esse tempo pela metade // desta forma... return int(microssegundos / 29 / 2); } // Fim do CalcularDistancia
// ======== void's dos motores: =============
//Gira as duas rodas para frente //Como os motores estão virados para lados opostos eles devem //girar em sentidos opostos para que as rodas girem na mesma direção
void andarpFrente(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(FORWARD); motorDireito.run(BACKWARD); }
//Gira as duas rodas para trás //Como os motores estão virados para lados opostos eles devem //girar em sentidos opostos para que as rodas girem na mesma direção void andarpTras(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(BACKWARD); motorDireito.run(FORWARD); }
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpEsquerda (char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(BACKWARD); motorDireito.run(BACKWARD); }
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpDireita(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(FORWARD); motorDireito.run(FORWARD); }
//Pára os motores definindo os dois pinos Enable em estado Low void pararMotores() { motorEsquerdo.run(RELEASE); motorDireito.run(RELEASE); }…
so, eu sei como colocar um botao no site, so nao sei como definir para ele ligar uma porta digital
estou usando o codigo do php
<html>
<head></head>
<body>
<?php
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Se conecta ao IP e Porta:
socket_connect($sock,"187.15.6.131", 8081);
// Executa a ação correspondente ao botão apertado.
if(isset($_POST['bits'])) {
$msg = $_POST['bits'];
if(isset($_POST['Fora' ])){ if($msg[0]=='1') { $msg[0]='0'; } else {$msg[0]='1'; }}
if(isset($_POST['Quarto1'])){ if($msg[1]=='1') { $msg[1]='0'; } else {$msg[1]='1'; }}
if(isset($_POST['Quarto2'])){ if($msg[2]=='1') { $msg[2]='0'; } else {$msg[2]='1'; }}
if(isset($_POST['Sala' ])){ if($msg[3]=='1') { $msg[3]='0'; } else {$msg[3]='1'; }}
if(isset($_POST['Pequeno'])){ $msg = 'P#'; }
if(isset($_POST['Grande' ])){ $msg = 'G#'; }
socket_write($sock,$msg,strlen($msg));
}
socket_write($sock,'R#',2); //Requisita o status do sistema.
// Espera e lê o status e define a cor dos botões de acordo.
$status = socket_read($sock,6);
if (($status[4]=='L')&&($status[5]=='#')) {
if ($status[0]=='0') $cor1 = lightcoral;
else $cor1 = lightgreen;
if ($status[1]=='0') $cor2 = lightcoral;
else $cor2 = lightgreen;
if ($status[2]=='0') $cor3 = lightcoral;
else $cor3 = lightgreen;
if ($status[3]=='0') $cor4 = lightcoral;
else $cor4 = lightgreen;
echo "<form method =\"post\" action=\"teste.php\">";
echo "<input type=\"hidden\" name=\"bits\" value=\"$status\">";
echo "<button style=\"width:70; background-color: $cor1 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Fora\">Fora</button></br></br>";
echo "<button style=\"width:70; background-color: $cor2 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto1\">Quarto1</button></br></br>";
echo "<button style=\"width:70; background-color: $cor3 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto2\">Quarto2</button></br></br>";
echo "<button style=\"width:70; background-color: $cor4 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Sala\">Sala</button></br></br></br>";
echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\"Name = \"Pequeno\">Portao Pequeno</button></br></br>";
echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\"Name = \"Grande\">Portao Grande</button></br></br>";
echo "</form>";
}
// Caso ele não receba o status corretamente, avisa erro.
else { echo "Falha ao receber status da casa."; }
socket_close($sock);
?>
</body>
</html>
e no arduino
#include <SPI.h>
#include <Ethernet.h>
//Configurações do Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2, 22 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,2, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 0, 0 };
// String que representa o estado dos dispositivos
char Luz[7] = "0000L#";
Server server(8081); // Cria o servidor na porta 8081
// String onde é guardada as msgs recebidas
char msg[7] = "0000L#";
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
}
void loop() {
Client client = server.available();
// 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 'P':
// Caso P#, aciona o pino do portão pequeno por 1s.
digitalWrite(A4,HIGH);
delay(1000);
digitalWrite(A4,LOW);
break;
case 'G':
// Caso G#, aciona o pino do portão pequeno por 1s.
digitalWrite(A5,HIGH);
delay(1000);
digitalWrite(A5,LOW);
break;
case 'L':
// Caso L#, ele copia os 4 bytes anteriores p/ a
// string 'Luz' e cada byte representa um
// dispositivo, onde '1'=ON e '0'=OFF
Luz[0]=msg[1];
Luz[1]=msg[2];
Luz[2]=msg[3];
Luz[3]=msg[4];
if (Luz[0]=='1') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW);
if (Luz[1]=='1') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW);
if (Luz[2]=='1') digitalWrite(A2,HIGH); else digitalWrite(A2,LOW);
if (Luz[3]=='1') digitalWrite(A3,HIGH); else digitalWrite(A3,LOW);
break;
}
}
}
}
…
mação que efetua os cálculos com tags já reconhecidas.
1) Cálculo das compras
#include <SPI.h>//biblioteca do sensor rfid#include <MFRC522.h>//biblioteca do sensor rfid#include <LiquidCrystal.h>//biblioteca do lcd #define SS_PIN 10#define RST_PIN 9
float refrigerante = 10.0;float salgadinho = 4.50;float papel_higienico = 32.50;float total = 0.0;
char sub = 0;
MFRC522 mfrc522(SS_PIN, RST_PIN); //cria o instante MDRC522. LiquidCrystal lcd(6, 7, 5, 4, 3, 2);//define os pinos do lcd char st[20];
void setup() { Serial.begin(9600); // Inicia a serial SPI.begin(); // Inicia SPI bus mfrc522.PCD_Init(); // Inicia MFRC522 Serial.println("Aproxime o seu cartao do leitor..."); Serial.println("Valor Total a Pagar: "); Serial.print(total); Serial.println(); //Define o número de colunas e linhas do LCD: lcd.begin(16, 2); } void loop() { char dado;//cria a variavel para a retirada de valores da compra if(Serial.available() > 0) { dado = Serial.read(); switch(dado) { case 'r' : sub = true; break; } } // reconhece uma nova tag if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Seleciona uma tag if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Mostra o numero da tag para ser utilizada nas proximas linhas Serial.print("UID da tag :"); String conteudo= ""; byte letra; for (byte i = 0; i < mfrc522.uid.size; i++) //apresenta a quantidade de numeros a ser apresentado { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Mensagem : "); conteudo.toUpperCase(); if (conteudo.substring(1) == "45 B8 A8 75") //faz a leitura da tag 45 B8 A8 75 para apresentar as mensagens a seguir { Serial.println("Tag Pedro"); Serial.println(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Desodorante "); lcd.setCursor(0,1); lcd.println("R$ 10"); if(sub)//soma ou retira o valor da tag lida do preço total da compra { total = total - refrigerante; sub = 0; }else{ total = total + refrigerante; } delay(2000); } if (conteudo.substring(1) == "A6 4B 1D 7E") //faz a leitura da tag C6 54 23 7E para apresentar as mensagens a seguir { Serial.println("Tag Milena "); Serial.println(); lcd.clear(); lcd.setCursor(0,0); lcd.print("cha"); lcd.setCursor(0,1); lcd.println("R$ 4,50"); if(sub)//soma ou retira o valor da tag lida do preço total da compra { total = total - salgadinho; sub = 0; }else{ total = total + salgadinho; } delay(2000); } if (conteudo.substring(1) == "86 61 21 7E") //faz a leitura da tag 86 61 21 7E para apresentar as mensagens a seguir { Serial.println("Tag Fernanda "); Serial.println(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Maria Mole"); lcd.setCursor(0,1); lcd.println("R$ 5,00"); if(sub)//soma ou retira o valor da tag lida do preço total da compra { total = total - papel_higienico; sub = 0; }else{ total = total + papel_higienico; } delay(2000); } void mensageminicial();//mostra o preço total da compra, reaparecendo para o comprador passar a tag no sensor.
lcd.clear(); lcd.setCursor(0,0); lcd.println(" Preco Total"); lcd.setCursor(0,1); lcd.print(total); }
2) Reconhecer novas tags e inseri-las ao sistema anterior
#include <SPI.h>#include <MFRC522.h>#include <LiquidCrystal.h> //Pinos Reset e SS módulo MFRC522#define SS_PIN 10#define RST_PIN 9MFRC522 mfrc522(SS_PIN, RST_PIN); LiquidCrystal lcd(6, 7, 5, 4, 3, 2); #define pino_botao_le A2#define pino_botao_gr A3
char ler;char grav;
MFRC522::MIFARE_Key key; void setup(){ pinMode(pino_botao_le, INPUT); pinMode(pino_botao_gr, INPUT); Serial.begin(9600); //Inicia a serial SPI.begin(); //Inicia SPI bus mfrc522.PCD_Init(); //Inicia MFRC522 //Inicializa o LCD 16x2 lcd.begin(16, 2); mensageminicial(); //Prepara chave - padrao de fabrica = FFFFFFFFFFFFh for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;} void loop(){
char ler;//cria a variavel para a retirada de valores da compra if(Serial.available() > 0) { ler = Serial.read(); switch(ler) { case 'l' : ler = true; break; } } //Verifica se o botao modo leitura foi pressionado int modo_le = digitalRead(ler); if (modo_le != 0) { lcd.clear(); Serial.println("Modo leitura selecionado"); lcd.setCursor(2, 0); lcd.print("Modo leitura"); lcd.setCursor(3, 1); lcd.print("selecionado"); while (digitalRead(ler) == 1) {} delay(3000); modo_leitura();
char grav;//cria a variavel para a retirada de valores da compra if(Serial.available() > 0) { grav = Serial.read(); switch(grav) { case 'g' : grav = true; break; } } } //Verifica se o botao modo gravacao foi pressionado int modo_gr = digitalRead(grav); if (modo_gr != 0) { lcd.clear(); Serial.println("Modo gravacao selecionado"); lcd.setCursor(2, 0); lcd.print("Modo gravacao"); lcd.setCursor(3, 1); lcd.print("selecionado"); while (digitalRead(grav) == 1) {} delay(3000); modo_gravacao(); }}void mensageminicial(){ Serial.println("nSelecione o modo leitura ou gravacao..."); Serial.println(); lcd.clear(); lcd.print("Selecione o modo"); lcd.setCursor(0, 1); lcd.print("leitura/gravacao");} void mensagem_inicial_cartao(){ Serial.println("Aproxime o seu cartao do leitor..."); lcd.clear(); lcd.print(" Aproxime o seu"); lcd.setCursor(0, 1); lcd.print("cartao do leitor");} void modo_leitura(){ mensagem_inicial_cartao(); //Aguarda cartao while ( ! mfrc522.PICC_IsNewCardPresent()) { delay(100); } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Mostra UID na serial Serial.print("UID da tag : "); String conteudo = ""; byte letra; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i]<0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); //Obtem os dados do setor 1, bloco 4 = Nome byte sector = 1; byte blockAddr = 4; byte trailerBlock = 7; byte status; byte buffer[18]; byte size = sizeof(buffer); //Autenticacao usando chave A status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } //Mostra os dados do nome no Serial Monitor e LCD lcd.clear(); lcd.setCursor(0, 0); for (byte i = 1; i < 16; i++) { Serial.print(char(buffer[i])); lcd.write(char(buffer[i])); } Serial.println(); //Obtem os dados do setor 0, bloco 1 = Sobrenome sector = 0; blockAddr = 1; trailerBlock = 3; //Autenticacao usando chave A status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } //Mostra os dados do sobrenome no Serial Monitor e LCD lcd.setCursor(0, 1); for (byte i = 0; i < 16; i++) { Serial.print(char(buffer[i])); lcd.write(char(buffer[i])); } Serial.println(); // Halt PICC mfrc522.PICC_HaltA(); // Stop encryption on PCD mfrc522.PCD_StopCrypto1(); delay(3000); mensageminicial();} void modo_gravacao(){ mensagem_inicial_cartao(); //Aguarda cartao while ( ! mfrc522.PICC_IsNewCardPresent()) { delay(100); } if ( ! mfrc522.PICC_ReadCardSerial()) return; //Mostra UID na serial Serial.print(F("UID do Cartao: ")); //Dump UID for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } //Mostra o tipo do cartao Serial.print(F("nTipo do PICC: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); byte buffer[34]; byte block; byte status, len; Serial.setTimeout(20000L) ; Serial.println(F("Digite o sobrenome,em seguida o caractere #")); lcd.clear(); lcd.print("Digite o sobreno"); lcd.setCursor(0, 1); lcd.print("me + #"); len = Serial.readBytesUntil('#', (char *) buffer, 30) ; for (byte i = len; i < 30; i++) buffer[i] = ' '; block = 1; //Serial.println(F("Autenticacao usando chave A...")); status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } //Grava no bloco 1 status = mfrc522.MIFARE_Write(block, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } block = 2; //Serial.println(F("Autenticacao usando chave A...")); status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } //Grava no bloco 2 status = mfrc522.MIFARE_Write(block, &buffer[16], 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } Serial.println(F("Digite o nome, em seguida o caractere #")); lcd.clear(); lcd.print("Digite o nome e"); lcd.setCursor(0, 1); lcd.print("em seguida #"); len = Serial.readBytesUntil('#', (char *) buffer, 20) ; for (byte i = len; i < 20; i++) buffer[i] = ' '; block = 4; //Serial.println(F("Autenticacao usando chave A...")); status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } //Grava no bloco 4 status = mfrc522.MIFARE_Write(block, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } block = 5; //Serial.println(F("Authenticating using key A...")); status=mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } //Grava no bloco 5 status = mfrc522.MIFARE_Write(block, &buffer[16], 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); //return; } else { Serial.println(F("Dados gravados com sucesso!")); lcd.clear(); lcd.print("Gravacao OK!"); } mfrc522.PICC_HaltA(); // Halt PICC mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD delay(5000); mensageminicial();}…