LusoRobótica - Robótica em Português
Electrónica => Electrónica Geral => Tópico iniciado por: r16 em 21 de Agosto de 2012, 22:38
-
Olá pessoal.
Hoje tive mais uma ideia luminosa, que se trata de passar a temperatura que esta no meu quarto e no quarto da minha filha, para o meu arduino da sala que por sua vez ligado a este tem um lCD a mostrar a temperatura.
Pois bem, eu há poucos dias conclui um projecto em que usando um encode e decoder e um emissor e receptor rf:
https://sites.google.com/site/kitoeag/radio-controle (https://sites.google.com/site/kitoeag/radio-controle)
consegui atraves do arduino ligar luz da minha varanda, que se encontra a 10metros do arduino, isto sem fios.
optei por esta solucao por ser BASTANTE economica face aos xbees e afins.
Mas como isto nao tem bidireccionalidade, gostaria de saber
se com dois arduinos..
1 arduino no quarto com sensor de temperatura.
com um emissor rf 315mhz e encoder.
e
1 arduino na sala com um receptor rf 315mhz e um decoder.
consigo com estes componentes receber via rf a temperatura do quarto para a sala?
-
Se já tens os módulos experimenta, mas com obstruções duvido que dê, mas experimenta.
-
Encontrei aqui um site onde de facto nao preciso do encode e decoder para nada.
so preciso do rf emissor e receptor.
http://labdegaragem.com/profiles/blogs/tutorial-transmissor-e-receptor-rf-link-com-arduino
(http://labdegaragem.com/profiles/blogs/tutorial-transmissor-e-receptor-rf-link-com-arduino)
ou seja neste caso o arduino emissor esta a enviar a mensagem hello que e recebida pelo arduino receptor...
agora a ideia seria..que o arduino emissor... enviasse a temperatura para o arduino receptor..
parece me possivel nao?
tenho tudo menos dois arduinos , ou melhor tenho dois mas um ta em servico na terra.
-
Se conseguires enviar "Hello" então também consegues enviar a temperatura.
-
Se conseguires enviar "Hello" então também consegues enviar a temperatura.
boa.
Mas aqui neste caso autor do post diz assim:
"Este exemplo mostra o receiver recebendo a informação do emissor, que nesse caso é o "hello". Ao abrir o Serial monitor do Arduino-1.0, você verá que os dados que chegam são números, estes números são números da tabela ASCII. Você pode ver que o número hexadecimal "68" equivale a letra "h"."
tabela ASCII: http://www.labdegaragem.com.br/wiki/index.php?title=Tabela_ASCII (http://www.labdegaragem.com.br/wiki/index.php?title=Tabela_ASCII)
achas que no codigo dava para por tipo um conversor para o arduino receptor.. lesse bem a temperatura inves de usar esses numeros hexadecimais?
vou ver se compro outro arduino para fazer o teste.
-
Sim, não há problema.
-
Escrevi isto há uns tempos:
http://lusorobotica.com/index.php?topic=5125.0 (http://lusorobotica.com/index.php?topic=5125.0)
Lê, experimenta o código com os 2 arduinos e vê se a essa distância consegues receber alguma coisa. Eu não usei encoders nem decoders e no código já tem um conversor de bytes para texto.
Cumprimentos.
-
porque n envias a leitura da tempª pela rede electrica? 8)
http://www.redcircuits.com/Page11.htm (http://www.redcircuits.com/Page11.htm)
Desafio: meteres mais sensores a enviarem leituras e receberes por exemplo num lcd a varias leituras... 8)
-
Pessoal desculpem ainda nao ter dado nenhum feedback, mas so para a semana me chega o material para testar.
obrigado.
ps: hugo é fixe isso, mas para já não necessito de tanto ;)
-
Podes sempre usar os nRF24L da Nordic, compras deles no eBay por 3€, mais barato que esses módulos RF, mas muito melhores, com mais alcance e tratam de grande parte do trabalho.
-
Fiz algo parecido há mais de um ano, e neste momento estou a tentar melhorar.
Pode ver aqui:
http://lusorobotica.com/index.php?topic=3080.0 (http://lusorobotica.com/index.php?topic=3080.0)
Utilizei modulos RFM12B
-
Boas r16
Eu e o maurosmartins andamos a trabalhar num projecto que é o RFduino, que acabou por falta de tempo dos dois, mas basicamente consistia num PCB com um ATMEL com o bootloader arduino, com socket para pilhas e com um transceiver RF da nordic, um dos exemplos testados era precisamente isso que querias fazer. Um sensor envia temperatura e outro envia por serie para o PC, o objectivo era criar mais nós mas como exemplo apenas testamos um, podes dar uma vista de olhos em http://rfduino.wordpress.com/ (http://rfduino.wordpress.com/) podes encontrar la alguma coisa que te dê jeito. Tem la exemplos de codigo, esquemáticos, etc.
Cumprimentos
-
Podes sempre usar os nRF24L da Nordic, compras deles no eBay por 3€, mais barato que esses módulos RF, mas muito melhores, com mais alcance e tratam de grande parte do trabalho.
Efectivamente isto parece ser muito porreiro , isto faz de emissor e receptor certo? ou seja tem bidirecionalidade como aqui ja foi dito?
tinha já agora uma questao...se eu usar um componente poderei a ele tambem ligar um encoder e um decoder ht12e ht12d correcto?
eu tenho um emissor e receptor de 315mhz ambos tem la mencionado a saida OUT que vai ligar ao encoder e decoder.. mas este componente da nordic pelo que vi nao tem a saida OUT qual e a saida que faz o mesmo trabalho? qual o pin?
-
O nRF fala por SPI e envia e recebe dados, não precisa de nada de encoders e decoders, e tens bibliotecas para arduino para ele.
-
O nRF fala por SPI e envia e recebe dados, não precisa de nada de encoders e decoders, e tens bibliotecas para arduino para ele.
entao queres me dizer que:
eu com um arduino master e um NRF master.
poderei ligar um rele no quarto tendo la um nrf slave.
e poderei ligar outro rede noutro quarto tendo tambem la um nrf slave.
sem necessidade de ter arduino nos slaves nrf ?ou tenho que tambem neles ter um arduino interligado a eles?
-
Cada nRF precisa de ter um micro-controlador, um arduino é muito overkill um simples attiny2313 chega perfeitamente para implementar um nó/slave.
-
Atenção à frequência do nRF, eu utilizei o RFM12 por causa da rede wireless cá de casa ...
-
Podes mudar os canais, mete o wireless em no canal 0 e o nRf no canal máximo e ficas com umas centenas de Mhz a separar os dois.
-
Ok entendi.
So mais duas questoes:
Entao eu no arduino master/nrf master consigo enviar informacao para o nrf do quarto 1 ligar... sem que o nrf do quarto2 se ligue e vice versa??
Foi por causa disto que no outro projecto implementei os encoders e decoders...pois conseguia ter dezenas de decoders sem eles interferirem uns com os outros.
2º pergunta: em um nrf slave consigo comandar quantos reles? apenas um ou mais que um?
-
Basta arranjares forma de identificar o receptor. Podes enviar um nr que identifique o receptor antes de enviares a mensagem e depois envias a mensagem.
Depois programas o arduino ou o microcontrolador que usares para interpretar o comando apenas se a primeira mensagem que ele receber for igual ao nr que o identifica, caso contrário ignora a mensagem que vem a seguir e volta a esperar por uma mensagem nova.
Edit: Depende das saidas que o teu microcontrolador tiver, mas se quiseres controlar bastantes há soluções como shift registers (?).
-
Creio que cada nrf precisa de ter um id para trabalhar ....
A mesma coisa acontece com os RFM12.
Se bem me lembro creio que podes ter 125 canais, isto com o nRF
-
Basta arranjares forma de identificar o receptor. Podes enviar um nr que identifique o receptor antes de enviares a mensagem e depois envias a mensagem.
Depois programas o arduino ou o microcontrolador que usares para interpretar o comando apenas se a primeira mensagem que ele receber for igual ao nr que o identifica, caso contrário ignora a mensagem que vem a seguir e volta a esperar por uma mensagem nova.
Edit: Depende das saidas que o teu microcontrolador tiver, mas se quiseres controlar bastantes há soluções como shift registers (?).
Neste caso seria o controlador seria mesmo o arduino...
rglove achas que é tarefa facil entao fazer isso? por o arduinomaster /nrf a comunicar com varios slaves sem que eles interfiram uns com os outros?
Relativamente as saidas... o arduino tem varias falemos vá de 4...
de que forma é que o arduino master /nrf diz ao arduino slave/nrf olha ligame ai o rele 1, agora liga me o rele 2 , agora liga-me o 3 e já agora liga me o rele 4 tambem.
-
É tal e qual um Serial.print, só que em vez de serial é o nome que deres ao nRF, podes ter milhares de nRF's, dá uma olhada aqui:
http://jeelabs.org/ (http://jeelabs.org/)
http://jeelabs.com/products/jeenode (http://jeelabs.com/products/jeenode)
São módulos RFM12 com um atmega, programavel com o IDE do Arduino, e tem toda a componente de comunicação tratada
-
epá ... há bibliotecas para usar isso ...
Deve ser mais fácil se começares por ler a info que vem com as bibliotecas.
Estou a fazer algo parecido ... e digo-te que é bem simples, neste momento estou a tentar usar o nRF também porque é bem mais barato que o RFM12.
Quanto a não se baralharem podes fazer muita coisa por software.
-
Ora viva pessoal, enquanto não tenho os NRF, já reuni algum material
tenho um emissor rf315 e um receptor..
consegui COMUNICAR entre eles com este codigo do rglove:
emissor:
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
char info[30];
int index = 0;
char inChar;
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6); // Esta função diz que o pino responsável por transferir a informação é o 6
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
vw_setup(2000); // função responsável por declarar a velocidade de transmissão (neste caso 2000bps)
}
void loop()
{
if (Serial.available() > 0) { // Se houver informação à espera para ser lida começa o loop abaixo
while (1) {
inChar = Serial.read(); // Guarda temporariamente o primeiro caracter/byte
info[index] = inChar; // Coloca o caracter numa array de caracteres
index++; // acrescenta 1 valor a index, de forma a que quando se repetirem as operações de cima o byte não seja escrito no mesmo sítio
delay(2); // Este pequeno delay é necessário para que chegue o próximo byte, caso este delay não cá esteja o arduino vai terminar o loop
if (Serial.available() <= 0) { // Esta condição é necessária para verificar se existe mais informação para ser lida
index = 0; // Como não existe mais informação para ler a variável index volta a 0
const char *msg = info;
vw_send((uint8_t *)msg, strlen(msg)); // envia a informação recebida pela porta Serial para o receptor RF
vw_wait_tx(); // espera que a informação seja transferida
memset( &info, 0, sizeof(info) ); // faz reset à array de caracteres, de forma a ficar limpa para ser escrita novamente
break; // por fim termina o loop e dá continuidade ao código (neste caso não há mais código, mas poderia haver)
}
}
}
}
receptor:
#include <VirtualWire.h>
char info[30];
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
info[i]=buf[i];
}
Serial.println(String(info)); // Enviamos pela porta Serial a informação recebida
memset( &info, 0, sizeof(info) ); // Fazemos reset à variável info para utilizar uma outra vez
digitalWrite(13, false);
}
}
tenho tambem um LCD 16x2 que tambem ja conseguir fazer com que funcionasse com o example HELLO WORLD.
codigo:
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}
e tenho um sensor de temperatura humidade que funciona com este codigo:
#define dht11_pin 53 //Analog port 0 on Arduino Uno
//#define dht11_pin 54 //Analog port 0 on Arduino Mega2560
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
void setup()
{
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
Serial.begin(9600);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;// start condition
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 2 not met"); //wair for second response signal:HIGH
return;
}
delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();} //recieved 40 bits data. Details are described in datasheet
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
Serial.print("Current humdity = ");
Serial.print(dht11_dat[0], DEC);
Serial.print("% ");
Serial.print("temperature = ");
Serial.print(dht11_dat[2], DEC);
Serial.println("C ");
delay(2000); //fresh time
}
A ideia agora seria colocar junto do arduino standalone o sensor de temp humidade, e o emissor RF.
Depois no meu arduino mega, junto com o lcd, e receptor rf..
Ler na PRIMEIRA linha a temperatura
e na SEGUNDA linha a humidade.
Alguem tem ideia como se juntam esses 3 codigos?
Obrigado
-
Este código deve servir para emissor:
// EMISSOR
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno //#define dht11_pin 54 //Analog port 0 on Arduino Mega2560
char info[30];
int index = 0;
char inChar;
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6); // Esta função diz que o pino responsável por transferir a informação é o 6
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
vw_setup(2000); // função responsável por declarar a velocidade de transmissão (neste caso 2000bps)
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;// start condition
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 2 not met"); //wair for second response signal:HIGH
return;
}
delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();} //recieved 40 bits data. Details are described in datasheet
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
// Serial.print("Current humdity = ");
// Serial.print(dht11_dat[0], DEC);
// Serial.print("% ");
// Serial.print("temperature = ");
// Serial.print(dht11_dat[2], DEC);
// Serial.println("C ");
// if (Serial.available() > 0) { // Se houver informação à espera para ser lida começa o loop abaixo
// while (1) {
// inChar = Serial.read(); // Guarda temporariamente o primeiro caracter/byte
// info[index] = inChar; // Coloca o caracter numa array de caracteres
// index++; // acrescenta 1 valor a index, de forma a que quando se repetirem as operações de cima o byte não seja escrito no mesmo sítio
// delay(2); // Este pequeno delay é necessário para que chegue o próximo byte, caso este delay não cá esteja o arduino vai terminar o loop
// if (Serial.available() <= 0) { // Esta condição é necessária para verificar se existe mais informação para ser lida
// index = 0; // Como não existe mais informação para ler a variável index volta a 0
const char *msg = dht11_dat;
vw_send((uint8_t *)msg, strlen(msg)); // envia a informação recebida pela porta Serial para o receptor RF
vw_wait_tx(); // espera que a informação seja transferida
memset( &info, 0, sizeof(info) ); // faz reset à array de caracteres, de forma a ficar limpa para ser escrita novamente
// break; // por fim termina o loop e dá continuidade ao código (neste caso não há mais código, mas poderia haver)
delay(2000); //fresh time
}
}
}
}
-
Este código deve servir para receptor (há algumas coisas que não sei se vão funcionar bem):
//RECEPTOR
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char info[30];
void setup()
{
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
info[i]=buf[i];
if (i=0){
lcd.setcursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i=2){
lcd.setcursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
Serial.println(String(info)); // Enviamos pela porta Serial a informação recebida
memset( &info, 0, sizeof(info) ); // Fazemos reset à variável info para utilizar uma outra vez
digitalWrite(13, false);
}
}
-
Este código deve servir para emissor:
// EMISSOR
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno //#define dht11_pin 54 //Analog port 0 on Arduino Mega2560
char info[30];
int index = 0;
char inChar;
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6); // Esta função diz que o pino responsável por transferir a informação é o 6
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
vw_setup(2000); // função responsável por declarar a velocidade de transmissão (neste caso 2000bps)
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;// start condition
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 2 not met"); //wair for second response signal:HIGH
return;
}
delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();} //recieved 40 bits data. Details are described in datasheet
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
// Serial.print("Current humdity = ");
// Serial.print(dht11_dat[0], DEC);
// Serial.print("% ");
// Serial.print("temperature = ");
// Serial.print(dht11_dat[2], DEC);
// Serial.println("C ");
// if (Serial.available() > 0) { // Se houver informação à espera para ser lida começa o loop abaixo
// while (1) {
// inChar = Serial.read(); // Guarda temporariamente o primeiro caracter/byte
// info[index] = inChar; // Coloca o caracter numa array de caracteres
// index++; // acrescenta 1 valor a index, de forma a que quando se repetirem as operações de cima o byte não seja escrito no mesmo sítio
// delay(2); // Este pequeno delay é necessário para que chegue o próximo byte, caso este delay não cá esteja o arduino vai terminar o loop
// if (Serial.available() <= 0) { // Esta condição é necessária para verificar se existe mais informação para ser lida
// index = 0; // Como não existe mais informação para ler a variável index volta a 0
const char *msg = dht11_dat;
vw_send((uint8_t *)msg, strlen(msg)); // envia a informação recebida pela porta Serial para o receptor RF
vw_wait_tx(); // espera que a informação seja transferida
memset( &info, 0, sizeof(info) ); // faz reset à array de caracteres, de forma a ficar limpa para ser escrita novamente
// break; // por fim termina o loop e dá continuidade ao código (neste caso não há mais código, mas poderia haver)
delay(2000); //fresh time
}
}
}
}
quando tento compilar esta me a dar este erro:
sketch_sep02a.cpp: In function 'void loop()':
sketch_sep02a:72: error: invalid conversion from 'byte*' to 'const char*'
sketch_sep02a.cpp: At global scope:
sketch_sep02a:78: error: expected declaration before '}' token
-
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno //#define dht11_pin 54 //Analog port 0 on Arduino Mega2560
char info[30];
int index = 0;
char inChar;
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6); // Esta função diz que o pino responsável por transferir a informação é o 6
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
vw_setup(2000); // função responsável por declarar a velocidade de transmissão (neste caso 2000bps)
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
Serial.println("Ready");
}
void loop()
{
char dht11_dat[5];
byte dht11_in;
byte i;// start condition
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 2 not met"); //wair for second response signal:HIGH
return;
}
delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();} //recieved 40 bits data. Details are described in datasheet
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
const char *msg = dht11_dat;
vw_send((uint8_t *)msg, strlen(msg)); // envia a informação recebida pela porta Serial para o receptor RF
vw_wait_tx(); // espera que a informação seja transferida
memset( &info, 0, sizeof(info) ); // faz reset à array de caracteres, de forma a ficar limpa para ser escrita novamente
delay(2000); //fresh time
}
Não me deu erros a compilar. Experimenta.
-
Alterei umas coisas para o receptor, experimenta o código do Kast, se não der experimenta o que eu modifiquei:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0){
lcd.setcursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==2){
lcd.setcursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[0],DEC) + "%; Temperatura: " + String(buf[2],DEC) + "ºC"));
digitalWrite(13, false);
}
}
-
rglove o codigo que me enviaste modificado para o emissor ja compila bem.
mas o codigo do receptor tanto do kast como do teu...
nao aparece nem a temp nem a humidade no lcd
-
Mas recebes a temperatura e a humidade pelo serial monitor? Não encontro nenhum erro no código, se receberes alguma coisa no serial monitor é porque ligaste mal o lcd e se não recebes nada no serial monitor é porque ligaste mal o receptor/transmissor.
-
tenho tudo bem ligado...
por exemplo com o teu codigo do teu antigo projecto RF.
funciona bem, o que escrevo no serial monitor do emissor
aparece no serial monitor do rf receptor.
em relacao ao lcd testei o exemplo do hello world da biblioteca do lcd e tambem me aparece hello world logo ta bem ligado..
tive o cuidado de verificar todos os pinos..na configuracao e ta tudo ok.
de notar que: eu nao tenho potenciometro para regular o contraste tive que optar por usar um pin PWR, mas se me esta a funcionar no example
tambem teria que estar a funcionar aqui
-
Mas recebes alguma coisa no serial monitor? Algum texto?
-
com o novo codigo nao....
so com o teu codigo do teu projecto é que recebo quando escrevo no serial monitor do emissor.
-
Eu agora não estou em casa, quando chegar dou uma vista de olhos nos códigos.
-
Eu agora não estou em casa, quando chegar dou uma vista de olhos nos códigos.
ok amigo
-
Já agora, faz isto:
Mete o código que funciona do receptor (do tutorial) no arduino que está ligado ao receptor e vê se recebes alguma coisa no serial monitor com o arduino que tem o sensor e o transmissor a funcionar com o código que postei aqui.
Se não receberes nada no arduino que tem o receptor é porque o problema está no arduino que tem o transmissor.
Se receberes não te assustes pq vais receber caracteres estranhos.
-
Já agora, faz isto:
Mete o código que funciona do receptor (do tutorial) no arduino que está ligado ao receptor e vê se recebes alguma coisa no serial monitor com o arduino que tem o sensor e o transmissor a funcionar com o código que postei aqui.
Se não receberes nada no arduino que tem o receptor é porque o problema está no arduino que tem o transmissor.
Se receberes não te assustes pq vais receber caracteres estranhos.
fiz o que me disseste nao recebi nada...
isto e mesmo estranho porque se eu puser o codigo emissor e o codigo receptor do teu tutorial recebo o que escrevo..
e ja testei o example do sensor e tambem me aparece no serial monitor a temp e hum
-
bom ... agora é preciso fazer o debug ... mas cheira-me que é um problema com o tipo de variáveis utilizado ....
-
bom ... agora é preciso fazer o debug ... mas cheira-me que é um problema com o tipo de variáveis utilizado ....
pois,alguma coisa é :-\ agora o que ...
-
coloca este codigo no emissor e verifica se aparece a humidade e a temperatura no serial.
[code// EMISSOR
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 7 //Analog port 0 on Arduino Uno //#define dht11_pin 54 //Analog port 0 on Arduino Mega2560
char info[30];
int index = 0;
char inChar;
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6); // Esta função diz que o pino responsável por transferir a informação é o 6
vw_set_ptt_inverted(true); // Sei que esta função tem de ser usada, mas não sei o que significa, se alguém souber e quiser acrescentar
vw_setup(2000); // função responsável por declarar a velocidade de transmissão (neste caso 2000bps)
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;// start condition
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
Serial.println("dht11 start condition 2 not met"); //wair for second response signal:HIGH
return;
}
delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();} //recieved 40 bits data. Details are described in datasheet
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}
Serial.print("Current humdity = ");
Serial.print(dht11_dat[0], DEC);
Serial.print("% ");
Serial.print("temperature = ");
Serial.print(dht11_dat[2], DEC);
Serial.println("C ");
// if (Serial.available() > 0) { // Se houver informação à espera para ser lida começa o loop abaixo
// while (1) {
// inChar = Serial.read(); // Guarda temporariamente o primeiro caracter/byte
// info[index] = inChar; // Coloca o caracter numa array de caracteres
// index++; // acrescenta 1 valor a index, de forma a que quando se repetirem as operações de cima o byte não seja escrito no mesmo sítio
// delay(2); // Este pequeno delay é necessário para que chegue o próximo byte, caso este delay não cá esteja o arduino vai terminar o loop
// if (Serial.available() <= 0) { // Esta condição é necessária para verificar se existe mais informação para ser lida
// index = 0; // Como não existe mais informação para ler a variável index volta a 0
// const char *msg = dht11_dat;
// vw_send((uint8_t *)msg, strlen(msg)); // envia a informação recebida pela porta Serial para o receptor RF
// vw_wait_tx(); // espera que a informação seja transferida
// memset( &info, 0, sizeof(info) ); // faz reset à array de caracteres, de forma a ficar limpa para ser escrita novamente
// break; // por fim termina o loop e dá continuidade ao código (neste caso não há mais código, mas poderia haver)
delay(2000); //fresh time
// }
}
}
}
-
Já agora experimenta também este código para o emissor. Abre o serial monitor e vê se recebes alguma coisa. Posta aqui tudo o que receberes.
Mete o código no receptor também para ver se recebes alguma coisa (mete primeiro o do tutorial para ver se recebes).
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
Serial.println("Pronto");
if (digitalRead(dht11_pin))
{
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
return;
}
delayMicroseconds(80);
Serial.println("A receber info");
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
-
Já agora experimenta também este código para o emissor. Abre o serial monitor e vê se recebes alguma coisa. Posta aqui tudo o que receberes.
Mete o código no receptor também para ver se recebes alguma coisa (mete primeiro o do tutorial para ver se recebes).
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
Serial.println("Pronto");
if (digitalRead(dht11_pin))
{
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
return;
}
delayMicroseconds(80);
Serial.println("A receber info");
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
com este codigo no serial monitor do emissor recebo
INICIO
PRONTO
INICIO
PRONTO
INICIO
PRONTO
No receptor com o codigo do tutorial nao aparece nada
volto a frizar que com o codigo example que colei na pagina 2 do sensor de temperatura, aparece no serial a temp e a humidade.. logo fica descartada a hipotese de ser pinos mal ligados
-
Experimenta agora.
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
[/quote]
-
Experimenta agora.
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
if (digitalRead(dht11_pin))
{
delay(1000);
return;
}
delayMicroseconds(80);
if (!digitalRead(dht11_pin))
{
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
[/quote]
neste so aparece INICIO
-
Acho que o problema está nesses ifs, estão a ser verificados e o return faz com que o loop comece de início.
Experimenta sem os ifs:
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
delayMicroseconds(80);
delayMicroseconds(80);
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
-
Acho que o problema está nesses ifs, estão a ser verificados e o return faz com que o loop comece de início.
Experimenta sem os ifs:
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
delayMicroseconds(80);
delayMicroseconds(80);
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
AGORA no LCD na primeira linha com o teu codigo de tutorial receptor
aparece na primeira linha humi 30%
-
E o que é que aparece na temperatura?
Experimenta então este para o transmissor e abre o serial monitor do mesmo para ver se recebes a temperatura e a humidade:
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
delayMicroseconds(80);
delayMicroseconds(80);
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
Serial.println("Temp: " + String(dht11_dat[0]) + "; Hum: " + String(dht11_dat[2]));
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
-
E o que é que aparece na temperatura?
Experimenta então este para o transmissor e abre o serial monitor do mesmo para ver se recebes a temperatura e a humidade:
#include <VirtualWire.h> // É necessário utilizar esta biblioteca para transmitir a informação
#define dht11_pin 53 //Analog port 0 on Arduino Uno
void setup() {
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
pinMode(6,OUTPUT);
Serial.begin(9600);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("Inicio");
byte dht11_dat[5];
byte dht11_in;
byte i;
digitalWrite(dht11_pin, LOW);
delay(18);
digitalWrite(dht11_pin, HIGH);
delayMicroseconds(1);
pinMode(dht11_pin, INPUT);
delayMicroseconds(40);
delayMicroseconds(80);
delayMicroseconds(80);
for (i=0; i<5; i++)
{ dht11_dat[i] = read_dht11_dat();}
Serial.println("info recebida");
pinMode(dht11_pin, OUTPUT);
digitalWrite(dht11_pin, HIGH);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];
if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("Erro");
}
char dados[5];
for (int b=0;b<5;b++) {
dados[b] = dht11_dat[b];
}
vw_send((uint8_t *)dados, strlen(dados));
vw_wait_tx();
Serial.println("Informacao transmitida");
Serial.println("Temp: " + String(dht11_dat[0]) + "; Hum: " + String(dht11_dat[2]));
delay(2000);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while (!digitalRead(dht11_pin));
delayMicroseconds(30);
if (digitalRead(dht11_pin) != 0 )
bitSet(result, 7-i);
while (digitalRead(dht11_pin));
}
return result;
}
ora bem no codigo emissor nesse aparece isto no serial:
Inicio
info recebida
Informacao transmitida
Temp: ; Hum:
Inicio
info recebida
Informacao transmitida
Temp: ; Hum:
Inicio
no codigo receptor, abocado enganei me nao tinha o teu a correr tinha ESTE e tenho este de momento
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==2){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[0],DEC) + "%; Temperatura: " + String(buf[2],DEC) + "ºC"));
digitalWrite(13, false);
}
}
aparece isto no serial monitor receptor:
Humidade: 29%; Temperatura: 0ºC
Humidade: 28%; Temperatura: 0ºC
Humidade: 27%; Temperatura: 0ºC
Humidade: 27%; Temperatura: 0ºC
e caracteres malucos no lcd e depois desaparecem
-
Experimenta este código. Utiliza uma biblioteca que anexei. Faz o download e mete na pasta das bibliotecas.
Abre dps o serial monitor e diz o que recebes. Usa o código no arduino que tem o sensor.
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 2);
delay(2000);
}
-
Experimenta este código. Utiliza uma biblioteca que anexei. Faz o download e mete na pasta das bibliotecas.
Abre dps o serial monitor e diz o que recebes. Usa o código no arduino que tem o sensor.
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 2);
delay(2000);
}
Read sensor: OK
Humidity (%): 30.00
Temperature (oC): 30.00
Read sensor: OK
Humidity (%): 30.00
Temperature (oC): 30.00
Read sensor: OK
Humidity (%): 30.00
Temperature (oC): 30.00
Read sensor: OK
Humidity (%): 30.00
Temperature (oC): 30.00
Read sensor: OK
Humidity (%): 30.00
Temperature (oC): 30.00
-
Ligaste em que pino a saida do sensor? Tens de ligar ao pino 2, ou então muda o pino no código para o pino que quiseres.
-
foi o que fiz mudei para o pin que tenho o DATA do dht11 ao arduino.
ta a ler bem
-
Experimenta variar a temperatura, ou a humidade, só para ter a certeza que não há nenhum erro e os valores que está a mostrar são os reais.
Se estiver tudo ok já te envio outro código.
-
Experimenta variar a temperatura, ou a humidade, só para ter a certeza que não há nenhum erro e os valores que está a mostrar são os reais.
Se estiver tudo ok já te envio outro código.
sim coloquei a mao em cima apertei o sensor aumentou os valores
-
Ok, então experimenta este código:
#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.print("Humidity (%): ");
Serial.println(DHT11.humidity);
Serial.print("Temperature (oC): ");
Serial.println(DHT11.temperature);
char data[1];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
vw_send((uint8_t *)data, strlen(data));
vw_wait_tx();
delay(2000);
}
Vou escrever o código para o receptor, mas entretanto podes experimentar com o do tutorial. O do lcd não vai funcionar ainda, não vale a pena tentares com esse. Tenta com o do tutorial, mas vais receber caracteres estranhos. Se receberes é bom sinal.
-
Ok, então experimenta este código:
#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.print("Humidity (%): ");
Serial.println(DHT11.humidity);
Serial.print("Temperature (oC): ");
Serial.println(DHT11.temperature);
char data[1];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
vw_send((uint8_t *)data, strlen(data));
vw_wait_tx();
delay(2000);
}
Vou escrever o código para o receptor, mas entretanto podes experimentar com o do tutorial. O do lcd não vai funcionar ainda, não vale a pena tentares com esse. Tenta com o do tutorial, mas vais receber caracteres estranhos. Se receberes é bom sinal.
bom com este codigo de emissor recebo:
Read sensor: OK
Humidity (%): 28
Temperature (oC): 28
Read sensor: OK
Humidity (%): 27
Temperature (oC): 29
Read sensor: OK
Humidity (%): 27
Temperature (oC): 29
Read sensor: OK
Humidity (%): 27
Temperature (oC): 29
mas com o teu codigo de receptor:
int ledPin = 10; // pino a substituir o potenciometro para contraste
#include <VirtualWire.h>
char info[30];
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
info[i]=buf[i];
}
Serial.println(String(info)); // Enviamos pela porta Serial a informação recebida
memset( &info, 0, sizeof(info) ); // Fazemos reset à variável info para utilizar uma outra vez
digitalWrite(13, false);
}
}
nao recebo nada no serial monitor..
atencao que o bitrate do emissor ta muito alto nao sei se é mesmo assim se nao
-
Alto? O bitrate está a 2000, esses módulos chegam aos 4800bps, não está alto. Tem de estar igual no receptor e no transmissor.
Provavelmente estás a receber, mas caracteres em branco.
Experimenta este código no receptor. Depois abre o serial monitor e posta o que recebeste.
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Serial.print("Temperatura: ");
Serial.print(buf[0]);
Serial.print("; Humidade: ");
Serial.println(buf[1]);
}
}
-
Alto? O bitrate está a 2000, esses módulos chegam aos 4800bps, não está alto. Tem de estar igual no receptor e no transmissor.
Provavelmente estás a receber, mas caracteres em branco.
Experimenta este código no receptor. Depois abre o serial monitor e posta o que recebeste.
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Serial.print("Temperatura: ");
Serial.print(buf[0]);
Serial.print("; Humidade: ");
Serial.println(buf[1]);
}
}
ok alterei ai nesse codigo o bitrate para ficar igual ao do emissor
e aparece isto no serial:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
ou seja a tem e hum aparecem em branco
esta a:
Serial.begin(115200 no emissor
e a Serial.begin(115200
no receptor
-
Ah, estavas a falar do bitrate da ligação Serial. Podes diminuir se quiseres, não tem de estar igual. Pensei que estavas a falar do bitrate dos módulos rf. Com que intervalo de tempo é que recebes isso no receptor? Tens o receptor ligado ao pino 7 como está definido no código? Experimenta assim, mas acho que não vai mudar nada:
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
byte info[1];
for (int i=0; i<=1;i++) {
info[i] = buf[i];
}
Serial.print("Temperatura: ");
Serial.print(info[0]);
Serial.print("; Humidade: ");
Serial.println(info[1]);
}
}
-
Ah, estavas a falar do bitrate da ligação Serial. Podes diminuir se quiseres, não tem de estar igual. Pensei que estavas a falar do bitrate dos módulos rf. Com que intervalo de tempo é que recebes isso no receptor? Tens o receptor ligado ao pino 7 como está definido no código? Experimenta assim, mas acho que não vai mudar nada:
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
byte info[1];
for (int i=0; i<=1;i++) {
info[i] = buf[i];
}
Serial.print("Temperatura: ");
Serial.print(info[0]);
Serial.print("; Humidade: ");
Serial.println(info[1]);
}
}
recebo no serial monitor do receptor de dois em dois segundos..
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
em relacao ao pino nao tenho no 7 tenho no 9 mas eu alterei no codigo
-
Sendo assim o problema não está no receptor, está na conversão de int para char...
Experimenta este código no transmissor e diz o que recebes no serial monitor#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
char data[2];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
Serial.print("Humidity (%): ");
Serial.println(data[1]+80);
Serial.print("Temperature (oC): ");
Serial.println(data[0]+80);
vw_send((uint8_t *)data, strlen(data));
vw_wait_tx();
delay(2000);
}
-
Sendo assim o problema não está no receptor, está na conversão de int para char...
Experimenta este código no transmissor e diz o que recebes no serial monitor#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
char data[2];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
Serial.print("Humidity (%): ");
Serial.println(data[1]+80);
Serial.print("Temperature (oC): ");
Serial.println(data[0]+80);
vw_send((uint8_t *)data, strlen(data));
vw_wait_tx();
delay(2000);
}
assim da valores errados no emissor:
Read sensor: OK
Humidity (%): 101
Temperature (oC): 107
Read sensor: OK
Humidity (%): 101
Temperature (oC): 107
Read sensor: OK
Humidity (%): 101
Temperature (oC): 107
e no receptor aparece a mesma:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
:(
vou me deitar que amanha tenho que acordar cedo no entanto o que postares aqui depois testo.
um abraço ate amanha
-
Pois, era isso que queria ver... O erro não está ai, o erro está noutro lado... Vamos lá ver se é desta... Para o receptor experimenta o primeiro código que postei que no serial monitor aparecia a temperatura e a humidade em branco. Experimenta este código para o transmissor:
#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
pinMode(6,OUTPUT);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
char data[2];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
Serial.print("Humidity (%): ");
Serial.println(data[1]+0);
Serial.print("Temperature (oC): ");
Serial.println(data[0]+0);
const char *msg = data;
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
delay(2000);
}
Até amanhã então, abraço.
-
Pois, era isso que queria ver... O erro não está ai, o erro está noutro lado... Vamos lá ver se é desta... Para o receptor experimenta o primeiro código que postei que no serial monitor aparecia a temperatura e a humidade em branco. Experimenta este código para o transmissor:
#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 2
void setup()
{
Serial.begin(115200);
pinMode(6,OUTPUT);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
char data[2];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
Serial.print("Humidity (%): ");
Serial.println(data[1]+0);
Serial.print("Temperature (oC): ");
Serial.println(data[0]+0);
const char *msg = data;
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
delay(2000);
}
Até amanhã então, abraço.
bom com esse codigo parece que ja estamos mais perto ;)
ora aparece isto no serial monitor do emissor:
Read sensor: OK
Humidity (%): 24
Temperature (oC): 29
Read sensor: OK
Humidity (%): 24
Temperature (oC): 29
Read sensor: OK
Humidity (%): 24
Temperature (oC): 29
Read sensor: OK
Humidity (%): 24
Temperature (oC): 29
Read sensor: OK
Humidity (%): 23
Temperature (oC): 29
mas os valores sao errados
agora com este codigo no receptor :
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==2){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[0],DEC) + "%; Temperatura: " + String(buf[2],DEC) + "ºC"));
digitalWrite(13, false);
}
}
aparece isto no serial monitor:
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 93%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 27%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
Humidade: 29%; Temperatura: 194ºC
e no lcd
aparece na primeira linha:
humi 27%
temp 194 C
mas passado uns segundos o lcd começa a aparecer caracteres malucos
-
Boas, desculpa só responder a esta hora, mas tive uns problemas hoje e só agora é que cheguei a casa. Antes de mais, porque é que os valores estão incorretos?
O código está a funcionar, mas não era esse o código que queria que experimentasses para o receptor, era outro. Já posto.
É só acrescentar a esse código do receptor o código para escrever os valores no lcd.
-
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Serial.print("Temperatura: ");
Serial.print(buf[0]);
Serial.print("; Humidade: ");
Serial.println(buf[1]);
}
}
Usa este para o receptor. Os valores que te apareciam de humidade no outro eram de temperatura, daí teres dito que não eram iguais. Este é o código correcto. Experimenta. Amanhã adiciono o que falta no código do receptor, hoje não posso, estou bastante cansado.
-
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
pinMode(7,INPUT);
vw_set_rx_pin(7);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Serial.print("Temperatura: ");
Serial.print(buf[0]);
Serial.print("; Humidade: ");
Serial.println(buf[1]);
}
}
Usa este para o receptor. Os valores que te apareciam de humidade no outro eram de temperatura, daí teres dito que não eram iguais. Este é o código correcto. Experimenta. Amanhã adiciono o que falta no código do receptor, hoje não posso, estou bastante cansado.
com esse codigo aparece me assim no serial monitor do receptor:
Temperatura: ; Humidade:
Temperatura: ; Humidade:
-
Não percebo porque é que não está a dar, devia funcionar. Sendo assim experimenta este:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
-
Não percebo porque é que não está a dar, devia funcionar. Sendo assim experimenta este:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
neste caso aparece assim no serial
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
Humidade: 32%; Temperatura: 30ºC
no lcd aparece
humi 32%
temp 30 c
mas passado uns segundos comecam a aparecer caracteres malucos no lcd e fica branco depois aparece novamente caracteres malucos..
nao sei se sera do sinal % e graus
de qualquer das formas, amanha a gente ve isso com mais calma , pois agora tambem me vou deitar, e tu tambem que tas cansado.
mas estamos perto.. acho
-
Se puderes depois posta um vídeo ou uma foto do lcd quando mostra os caracteres estranhos.
Até amanhã.
-
Não sei se será disto, mas tem uma coisa mal:
analogWrite(ledPin, 600);
Apaga-se esta linha.
E podes tentar também substituir:
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
Por:
Serial.println(String("Humidade: " + String(buf[1],DEC) + "; Temperatura: " + String(buf[0],DEC) + "C"));
-
Não sei se será disto, mas tem uma coisa mal:
analogWrite(ledPin, 600);
Apaga-se esta linha.
E podes tentar também substituir:
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
Por:
Serial.println(String("Humidade: " + String(buf[1],DEC) + "; Temperatura: " + String(buf[0],DEC) + "C"));
Pedro essa 1linha que comentaste referesse a que eu nao tenho potenciometro para regular o contraste do lcd entao a alternativa e usar um pin pwr. Por isso essa linha ta ai. Logo testo o que disseste em segundo lugar.
Obrigado
-
Se puderes depois posta um vídeo ou uma foto do lcd quando mostra os caracteres estranhos.
Até amanhã.
Ok logo meto um video
-
Pedro essa 1linha que comentaste referesse a que eu nao tenho potenciometro para regular o contraste do lcd entao a alternativa e usar um pin pwr. Por isso essa linha ta ai. Logo testo o que disseste em segundo lugar.
Obrigado
O valor tem que ser entre 0 e 255 e é melhor mudares o nome para contraste porque LedPin causa confusão. :P
-
quanto ao serial monitor do receptor da isto:
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
Humidade: 28%; Temperatura: 29ºC
mais uns momentos e ja vos partilho o video dos caracteres esquesitos do lcd
-
O serial do receptor continua a receber bem quando o LCD está "maluco"?
-
O serial do receptor continua a receber bem quando o LCD está "maluco"?
sim continua a receber tal e qual o que postei acima
aqui esta o video:
http://youtu.be/_ka1lbbKM_k (http://youtu.be/_ka1lbbKM_k)
como podem ver.. aparece caracteres malucos e depois desaparece tudo do lcd durante mt tempo depois volta a aparecer..etc e os caracteres depois tanto aparecem na primeira linha do lcd como na segunda linha e sempre diferentes.
-
Já substituíste o analogWrite(ledPin, 600); por um valor entre 0 e 255?
Pode não ser disto, mas o melhor é corrigir.
-
Já substituíste o analogWrite(ledPin, 600); por um valor entre 0 e 255?
Pode não ser disto, mas o melhor é corrigir.
ja pedro,..so de salientar que com o code example do lcd..que esta no ide do arduino eu tinha 600 e aparecia o hello world, sem aparecer caracteres esquesitos.
-
Provavelmente não vai alterar nada, mas experimenta na mesma:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
byte temp = 0;
byte humi = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
humi = buf[1];
}
if (i==0){
temp = buf[0];
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "; Temperatura: " + String(buf[0],DEC)));
digitalWrite(13, false);
}
delay(10);
actualizarlcd();
}
void actualizarlcd() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(humi, DEC);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(temp, DEC);
lcd.print(" C");
}
-
Provavelmente não vai alterar nada, mas experimenta na mesma:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
byte temp = 0;
byte humi = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
humi = buf[1];
}
if (i==0){
temp = buf[0];
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "; Temperatura: " + String(buf[0],DEC)));
digitalWrite(13, false);
}
delay(10);
actualizarlcd();
}
void actualizarlcd() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(humi, DEC);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(temp, DEC);
lcd.print(" C");
}
rglove o que se passa neste codigo e que no lcd passa caracteres tao depressa tipo em loop infinito que nao da para ler sequer.
-
Pois, não sabia se ia funcionar. Soldaste bem os cabos ao lcd? Altera o delay no final do loop, mete um valor maior e experimenta.
-
olha nao sei se isto te vai ajudar a encontrar uma solucao mas eu adicionei neste codigo um delay e aparece a humidade bem...durante 10segundos sem aparecer caracteres malucos... mas passado esses 10 segundos comeca a aparecer caracteres.
ps ta bem soldado lol.
mas ve la se isso te ajuda a encontrar o erro:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
delay(10000);
//}
//if (i==2){
// lcd.setCursor(0,1);
// lcd.print("Temp ");
// lcd.print(buf[i], DEC);
//lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[0],DEC) + "%; Temperatura: " + String(buf[2],DEC) + "ºC"));
digitalWrite(13, false);
}
}
-
Experimenta assim:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 255);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
lcd.clear();
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
-
Experimenta assim:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 255);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
lcd.clear();
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
desculpa a demora a responder..
com esse codigo o lcd aparece todo em branco...
no entanto com este codigo:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
delay(10);
}
if (i==1){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
delay(10);
}
}
Serial.println(String("Humidade: " + String(buf[0],DEC) + "%; Temperatura: " + String(buf[2],DEC) + "ºC"));
digitalWrite(13, false);
delay(60000);
}
}
acrexentei uns delays e so quando o codigo passa do ultimo delay de 60000 é que começa a aparecer caracteres malucos.
tamos a chegar la....mas nao sei se isto tem logica.. que achas?
-
Mete um lcd.clear no inicio do loop.
-
Mete um lcd.clear no inicio do loop.
em qual codigo?
-
No que estiveres a usar, tanta mudança e ainda não alteraram nada a não ser meter delays, portanto mete num qualquer.
-
No que estiveres a usar, tanta mudança e ainda não alteraram nada a não ser meter delays, portanto mete num qualquer.
no ultimo codigo que postei em citação ao rglove coloquei o lcd.clear no começo do loop e aparece caracteres malucos... sem lcd.clear nao aparece.. so aparece quando passa o ultimo delay de 60000
-
Eu tinha posto no código um lcd.clear() quando o receiver recebe alguma coisa, mesmo antes de escrever no lcd. Acho estranho o lcd ter ficado todo branco... Não será que tem a ver com a tensão que meteste no pino do contraste? Tenta ajustar isso.
-
Eu tinha posto no código um lcd.clear() quando o receiver recebe alguma coisa, mesmo antes de escrever no lcd. Acho estranho o lcd ter ficado todo branco... Não será que tem a ver com a tensão que meteste no pino do contraste? Tenta ajustar isso.
tinhas razao no codigo tinhas posto o pin a 255 coloquei a 60 ja apareceu mas apareceu os caracteres malucos..
como te disse o unico codigo que nao aparece os caracteres malucos é este,mas quando chega ao delay do final ou seja os 60000 começa a aparvalhar,,,, agora se é do pin pwr nao sei.. mas este codigo funciona bem...
ps: so nao aparece nada no serial monitor estara alguma coisa em falta?
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 600);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
delay(10);
}
if (i==1){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
delay(10);
}
}
Serial.println(String("Humidade: " + String(buf[0],DEC) + "%; Temperatura: " + String(buf[2],DEC) + "ºC"));
digitalWrite(13, false);
delay(60000);
}
}
-
Tenta assim:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 60);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int temperatura = 0;
int humidade = 0;
digitalWrite(13, HIGH); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (int i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0) temperatura = (buf[0], DEC);
else if (i==1) humidade = (buf[1],DEC);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(String(humidade));
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(String(temperatura));
lcd.print(" C");
Serial.println(String("Humidade: " + String(humidade) + "%; Temperatura: " + String(temperatura) + "ºC"));
digitalWrite(13, LOW); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
}
}
EDIT: E em vez do pino PWM liga aos 5V através de uma resistência. Tenta várias até ficar bem.
-
Tenta assim:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 60);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int temperatura = 0;
int humidade = 0;
digitalWrite(13, HIGH); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (int i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0) temperatura = (buf[0], DEC);
else if (i==1) humidade = (buf[1],DEC);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(String(humidade));
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(String(temperatura));
lcd.print(" C");
Serial.println(String("Humidade: " + String(humidade) + "%; Temperatura: " + String(temperatura) + "ºC"));
digitalWrite(13, LOW); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
}
}
pedro tambem nao da... aparece os tais caracteres...
acho que tem haver alguma coisa com os delays...pois aquele codigo que postei funciona com os delays...no entanto a temperatura do receptor nao é igual a do emissor porque causa dos delays que inseri...
ou seja da ideia que o emissor ta a mandar dados de 1 em 1 segundo..e que o receptor.. quando vai ler..se captar um intervalo sem dados atrofia..
isso sou eu a supor ...nao sei se é se nao.. mas o que e certo é que com delays os caracteres nao aparecem. so aparecem no ultimo delay que vai reinciar o loop
-
Tens a certeza que não se lia nada naquele código que postei na pagina anterior ou ha 2 páginas atras?
Tinha postado um código que fazia um refresh do lcd de 10 em 10 ms. Tinhas dito que o lcd ficava sempre branco. Será que também não tinhas um valor mal no analogWrite? Mete 60 como tinhas posto nesse código ai e experimenta.
O lcd não fica todo branco por estar sempre a fazer refresh... Experimenta outra vez, pode ser que resolva.
-
Mostra lá uma foto da montagem disso, e pormenor das soldas no lcd..
-
Tens a certeza que não se lia nada naquele código que postei na pagina anterior ou ha 2 páginas atras?
Tinha postado um código que fazia um refresh do lcd de 10 em 10 ms. Tinhas dito que o lcd ficava sempre branco. Será que também não tinhas um valor mal no analogWrite? Mete 60 como tinhas posto nesse código ai e experimenta.
O lcd não fica todo branco por estar sempre a fazer refresh... Experimenta outra vez, pode ser que resolva.
rglove o codigo que exprimentei teu:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 60);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
lcd.clear();
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
foi esse.. no lcd nao aparece letra nenhuma...no serial monitor aparece.pelo menos com este codigo nada aparece...
-
Tens a certeza que não se lia nada naquele código que postei na pagina anterior ou ha 2 páginas atras?
Tinha postado um código que fazia um refresh do lcd de 10 em 10 ms. Tinhas dito que o lcd ficava sempre branco. Será que também não tinhas um valor mal no analogWrite? Mete 60 como tinhas posto nesse código ai e experimenta.
O lcd não fica todo branco por estar sempre a fazer refresh... Experimenta outra vez, pode ser que resolva.
rglove o codigo que exprimentei teu:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 60);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
lcd.clear();
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
foi esse.. no lcd nao aparece letra nenhuma...no serial monitor aparece.pelo menos com este codigo nada aparece...
senso tenho o telemovel a carregar, mas assim que tiver carga, posso ate fazer um video para te mostrar..
alias.. nao sei se te vou dizer alguma barbaridade corrige me se tiver enganado..
mas se fosse más ligacoes do lcd... o example hello world nao aparecia certo?
mas eu vou na mesma fazer um video e mostrar sem problema algum.
-
rglove e senso estou a carregar um video no youtube para vos mostrar o lcd em funcionamento com ambos os codigos.. e tambem as ligacoes ao lcd.
vai demorar um bocadinho
-
Acho que o problema está quando se escreve no LCD a segunda vez.
Tenta o exemplo Serial to LCD (ou qualquer coisa assim) e envia texto para o arduino por serial.
-
Acho que o problema está quando se escreve no LCD a segunda vez.
Tenta o exemplo Serial to LCD (ou qualquer coisa assim) e envia texto para o arduino por serial.
testei e escreveu bem a primeira vez , e a segunda vez.. a terceira ja apareceu no lcd caracteres malucos..
sera que isto tem alguma coisa a ver??
-
Acho que o problema está quando se escreve no LCD a segunda vez.
Tenta o exemplo Serial to LCD (ou qualquer coisa assim) e envia texto para o arduino por serial.
testei e escreveu bem a primeira vez , e a segunda vez.. a terceira ja apareceu no lcd caracteres malucos..
sera que isto tem alguma coisa a ver??
O problema não está na transmição de dados sem fios, mas sim no LCD ou nas ligações.
-
Acho que o problema está quando se escreve no LCD a segunda vez.
Tenta o exemplo Serial to LCD (ou qualquer coisa assim) e envia texto para o arduino por serial.
amanha vou rever isto tudo,,, mas e mesmo muito estranho aparecer as palavras neste caso uma e duas vezes e as vezes aparecer coisas diferentes do que escrevemos.
nao é?? eu tava convencido que se fosse mas ligacoes nao aparecia nada sequer
testei e escreveu bem a primeira vez , e a segunda vez.. a terceira ja apareceu no lcd caracteres malucos..
sera que isto tem alguma coisa a ver??
O problema não está na transmição de dados sem fios, mas sim no LCD ou nas ligações.
-
Era muito mais facil meia duzia de fotos.
-
Era muito mais facil meia duzia de fotos.
está aqui o video,,, espero esclarecer alguma coisa com isto,,,para verem o que esta errado
Teste2 (http://www.youtube.com/watch?v=yQykjd5MmZQ#ws)
-
uma pergunta rápida ::
está a acontecer protocolo de correcção de erros, antes e depois de enviar por rádio ?
-
Acho que não, a menos que os encoders o façam ....
-
uma pergunta rápida ::
está a acontecer protocolo de correcção de erros, antes e depois de enviar por rádio ?
O problema não está aí, porque quando ele usou o exemplo Serial para LCD, houve o mesmo problema.
-
Talvez.
Nunca nos vários anos a usar radiotransmissão, eu pude usar ligações simples.
Para conseguir comunicações error-free e robustas, tenho sempre que implementar Modems em ambos os lados.
-
Entao qual é a solucao para isto?
-
há bibliotecas para o rfm12 com controlo de erros
-
há bibliotecas para o rfm12 com controlo de erros
o facto de se usar um RFM12 ou um nRF24L01, é o bastante para garantir muito bons resultados.
estes módulos de rádio já incorporam modems, por isso fica tudo mais facil.
-
Chegaste a colocar a resistência de 5k entre o pino 1 e 2 do DHT11 ????
-
Chegaste a colocar a resistência de 5k entre o pino 1 e 2 do DHT11 ????
Nao. Se bem me lembro acho que me disseste que isso seria para corrigir uma melhor precisao da temperatura.
Bom mas eu quero aqui referir alguns pontos que gostaria de discutir convosco, pois ainda me esta a fazer uma certa confusao.
1. Caso houvesse problema de comunicao entre o emissor e receptor , nao chegaria a mesma informacao do emissor ao receptor certo? Coisa que nao acontece, usando o serial monitor do receptor a informacao e recebida perfeitamente.
2. Caso o lcd tivesse mal conectado eu nao conseguia com que ele lesse hello world do example que esta no ide.certo? Coisa que consigo e estavel sem caracteres malucos.
3. Dito isto e agradecendo a ajuda que ja foi aqui dada. Gostaria que alguem me desse uma explicacao do que esta errado. Se nao houver explicacao comprarei entao os NRF.
-
Não dizes que o exemplo SerialDisplay não funciona bem?
Isto não envolve RF nem sensores de temperatura.
Logo, tens aí o teu problema. Está no LCD ou nas ligações.
Além disso, no Serial aparece tudo bem, o problema está mesmo no LCD.
No Hello World, aparece-te o tempo em baixo?
-
Não dizes que o exemplo SerialDisplay não funciona bem?
Isto não envolve RF nem sensores de temperatura.
Logo, tens aí o teu problema. Está no LCD ou nas ligações.
Além disso, no Serial aparece tudo bem, o problema está mesmo no LCD.
No Hello World, aparece-te o tempo em baixo?
Pedro...
no codigo hello world este:
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11 // liguei ao 10
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground // liguei a 11
* 10K resistor: (nao sei)
* ends to +5V and ground (nao sei)
* wiper to LCD VO pin (pin 3) // liguei ao 8 que que utilizei como pin
pwr para o contraste.
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
int ledPin = 8;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
void setup() {
pinMode(ledPin, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
analogWrite(ledPin, 60);
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
// lcd.print(millis()/1000);
}
se eu tiver comentada a linha // lcd.print(millis()/1000); nao aparece o tempo e aparece o HELLO WORLD
e se eu tiver descomentada aparece os caracteres malucos...
mas nao sei se estou a proceder correctamente aqui numa coisa neste codigo...e talvez seja isso que tambem falte no outro..
repara nas ligacoes que o codigo tem:
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11 // liguei ao 10
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground // liguei a 11
* 10K resistor: (nao sei)
* ends to +5V and ground (nao sei)
* wiper to LCD VO pin (pin 3) // liguei ao 8 que que utilizei como pin
pwr para o contraste.
ou seja o que ves a vermelho são as alteracoes que fiz na ligacao ao arduino..
o que tenho a verde nao sei como ligar..
eu nao sei se é esse o problema..
mas eu fiz as ligacoes conforme esta aqui no site:
http://lusorobotica.com/index.php?topic=919.30 (http://lusorobotica.com/index.php?topic=919.30)
será que esta informacao vos ajuda a analisar melhor onde esta efectivamente o problema?
http://youtu.be/h6bkm6B8FcA (http://youtu.be/h6bkm6B8FcA)
-
No reference do arduino sobre a função millis() diz o seguinte:
Tip:
Note that the parameter for millis is an unsigned long, errors may be generated if a programmer tries to do math with other datatypes such as ints.
Será disto ?
-
Este
* LCD R/W pin to ground // liguei a 11
está nitidamente mal, tens de ligar ao gnd ...
-
Este * LCD R/W pin to ground // liguei a 11
está nitidamente mal, tens de ligar ao gnd ...
voltei a ligar conforme disseste ... continua com caracteres marados
-
Mudaste no código os pinos que trocaste?
-
Mudaste no código os pinos que trocaste?
sim , de momento tenho
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11 // liguei ao 10
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground // liguei a 11
* 10K resistor: (nao sei)
* ends to +5V and ground (nao sei)
* wiper to LCD VO pin (pin 3) // liguei ao 8 que que utilizei como pin
pwr para o contraste.
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
int ledPin = 8;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
void setup() {
pinMode(ledPin, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
analogWrite(ledPin, 60);
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}
a unica palavra de jeito que se le é world!
de resto e so numeros e cardinais..
se esconder o
lcd.print(millis()/1000);
ja aparece hello world como deve ser
-
Ligaste o R/W ao ground?
Esses caracteres só aparecem a partir da segunda vez que escreves no lcd, portanto esse "hello world" sem o millis() funciona porque o "hello world" só é escrito uma vez no lcd...
-
Ligaste o R/W ao ground?
Esses caracteres só aparecem a partir da segunda vez que escreves no lcd, portanto esse "hello world" sem o millis() funciona porque o "hello world" só é escrito uma vez no lcd...
sim liguei, sera o lcd que nao ta em condicoes??
-
Desliga tudo o arduino e faz isto:
http://arduino.cc/en/Tutorial/LiquidCrystal (http://arduino.cc/en/Tutorial/LiquidCrystal)
Usa os pinos que eles usam e como não tens um potenciómetro, usa resistências.
-
Desliga tudo o arduino e faz isto:
http://arduino.cc/en/Tutorial/LiquidCrystal (http://arduino.cc/en/Tutorial/LiquidCrystal)
Usa os pinos que eles usam e como não tens um potenciómetro, usa resistências.
se tiver que usar so uma resistencia qual e o valor dela? ligo de onde a onde?
se for duas qual o valor de cada?
-
Desliga tudo o arduino e faz isto:
http://arduino.cc/en/Tutorial/LiquidCrystal (http://arduino.cc/en/Tutorial/LiquidCrystal)
Usa os pinos que eles usam e como não tens um potenciómetro, usa resistências.
se tiver que usar so uma resistencia qual e o valor dela? ligo de onde a onde?
se for duas qual o valor de cada?
Liga uma resistência entre Vcc e Vc com um valor entre 0 e 10k, tens que ver o que te dá um bom contraste.
-
Desliga tudo o arduino e faz isto:
http://arduino.cc/en/Tutorial/LiquidCrystal (http://arduino.cc/en/Tutorial/LiquidCrystal)
Usa os pinos que eles usam e como não tens um potenciómetro, usa resistências.
se tiver que usar so uma resistencia qual e o valor dela? ligo de onde a onde?
se for duas qual o valor de cada?
Liga uma resistência entre Vcc e Vc com um valor entre 0 e 10k, tens que ver o que te dá um bom contraste.
sim mas depois o pino VO vai ligar a onde, se tivesse um potenciometro ligava na perna do meio... mas assim liga onde?
-
Ligas uma pata da resistência aos 5v e a outra ao VO, e depois ligas a pata de outra resistencia tambem ao VO e a segunda pata á massa, para fazer um dividor de tensão resistivo que é o que o potênciometro faz, usa um par de resistencias de 3 ou 4k.
-
Ligas uma pata da resistência aos 5v e a outra ao VO, e depois ligas a pata de outra resistencia tambem ao VO e a segunda pata á massa, para fazer um dividor de tensão resistivo que é o que o potênciometro faz, usa um par de resistencias de 3 ou 4k.
nao tenho esses valores de resistencia aqui, mas amanha vou comprar um potenciometro de 10k para tirar as teimas..
mas eu duvido que seja isso que me esta a fazer mostrar os caracteres malucos,. nao sei ate que ponto o contraste tem a ver com isto, visto que o resto das letras aparecem bem.
-
Se tiveres de 1k, por exemplo, podes juntar várias em série.
-
Se tiveres de 1k, por exemplo, podes juntar várias em série.
so tenho aqui de valores altos... eu amanha vou comprar a porcaria do potenciometro para tirar as teimas..
eu nao entendo nada disto, mas tame a fazer especie..como é que um pino pwr não consegue fazer o mesmo trabalho que o potenciometro,,,e como é que o pino pwr é o causador dos caracteres estranhos.
Mas deixem tar que amanha, as duvidas sao tiradas.
Se alguem tiver ai um lcd que consiga testar era trabalho poupado.
-
Se tiveres de 1k, por exemplo, podes juntar várias em série.
so tenho aqui de valores altos... eu amanha vou comprar a porcaria do potenciometro para tirar as teimas..
eu nao entendo nada disto, mas tame a fazer especie..como é que um pino pwr não consegue fazer o mesmo trabalho que o potenciometro,,,e como é que o pino pwr é o causador dos caracteres estranhos.
Mas deixem tar que amanha, as duvidas sao tiradas.
Se alguem tiver ai um lcd que consiga testar era trabalho poupado.
Eu também não acho que seja disso. Mas o PWM não é a mesma coisa que usar o potenciómetro.
O problema não está no código, tem que estar no LCD, no Arduino ou nas ligações.
-
Se tiveres de 1k, por exemplo, podes juntar várias em série.
so tenho aqui de valores altos... eu amanha vou comprar a porcaria do potenciometro para tirar as teimas..
eu nao entendo nada disto, mas tame a fazer especie..como é que um pino pwr não consegue fazer o mesmo trabalho que o potenciometro,,,e como é que o pino pwr é o causador dos caracteres estranhos.
Mas deixem tar que amanha, as duvidas sao tiradas.
Se alguem tiver ai um lcd que consiga testar era trabalho poupado.
Eu também não acho que seja disso. Mas o PWM não é a mesma coisa que usar o potenciómetro.
O problema não está no código, tem que estar no LCD, no Arduino ou nas ligações.
bom teimoso que é teimoso não descansa....
hoje fui comprar a porcaria do potenciometro a ver se o problema era então esse, visto que o PWR para algumas pessoas não seria o causador,,, mas para outra suscitava dúvidas...
Liguei e Funciona.....era mesmo do PWR
Agora vou testar o codigo da temperatura humidade postado há alguns posts atrás.
-
Então ainda bem que era disso, assim ficou resolvido.
Agora o código deve funcionar sem grandes problemas.
-
Então ainda bem que era disso, assim ficou resolvido.
Agora o código deve funcionar sem grandes problemas.
há coisas... agora tou todo baralhado já com tanto código..
supostamente não era este para o emissor:
#include <dht11.h>
#include <VirtualWire.h>
dht11 DHT11;
#define DHT11PIN 7
void setup()
{
Serial.begin(115200);
pinMode(6,OUTPUT);
vw_set_tx_pin(6);
vw_set_ptt_inverted(true);
vw_setup(2000);
}
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
char data[2];
data[0] = DHT11.temperature;
data[1] = DHT11.humidity;
Serial.print("Humidity (%): ");
Serial.println(data[1]+0);
Serial.print("Temperature (oC): ");
Serial.println(data[0]+0);
const char *msg = data;
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
delay(2000);
}
e este para o receptor:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int i;
digitalWrite(13, true); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==1){
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(buf[i], DEC);
lcd.print(" %");
}
if (i==0){
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(buf[i], DEC);
lcd.print(" C");
}
}
Serial.println(String("Humidade: " + String(buf[1],DEC) + "%; Temperatura: " + String(buf[0],DEC) + "ºC"));
digitalWrite(13, false);
}
}
é que com isto não funciona no lcd..
-
O serial funciona?
O Hello World funciona?
Tens as ligações iguais às do exemplo? Senão tens que alterar isto:
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
-
O serial funciona?
O Hello World funciona?
Tens as ligações iguais às do exemplo? Senão tens que alterar isto:
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
no serial do emissor:
Temperature (oC): 30
Read sensor: OK
Humidity (%): 48
Temperature (oC): 30
Read sensor: OK
Humidity (%): 48
Temperature (oC): 30
Read sensor: OK
Humidity (%): 48
Temperature (oC): 30
no serial do receptor:
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
Humidade: 48%; Temperatura: 30ºC
o hello world funciona perfeitamente agora com o potenciometro e aparece o tempo em baixo..
sim mudei os pinos correctamente..
-
Tenta este código que eu tinha posto na página 7 deste tópico, no receptor:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 60);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int temperatura = 0;
int humidade = 0;
digitalWrite(13, HIGH); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (int i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0) temperatura = (buf[0], DEC);
else if (i==1) humidade = (buf[1],DEC);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(String(humidade));
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(String(temperatura));
lcd.print(" C");
Serial.println(String("Humidade: " + String(humidade) + "%; Temperatura: " + String(temperatura) + "ºC"));
digitalWrite(13, LOW); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
}
}
-
Tenta este código que eu tinha posto na página 7 deste tópico, no receptor:
#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(9,INPUT);
vw_set_rx_pin(9); // Pino de recepção
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start(); // Necessário para começar a receber informação
}
void loop()
{
analogWrite(ledPin, 60);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Caso chegue alguma mensagem ao receptor
{
int temperatura = 0;
int humidade = 0;
digitalWrite(13, HIGH); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
for (int i = 0; i < buflen; i++) // Basicamente isto vai repetir para cada byte recebido e vai guardar a informação numa array de caracteres
{
if (i==0) temperatura = (buf[0], DEC);
else if (i==1) humidade = (buf[1],DEC);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humi ");
lcd.print(String(humidade));
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp ");
lcd.print(String(temperatura));
lcd.print(" C");
Serial.println(String("Humidade: " + String(humidade) + "%; Temperatura: " + String(temperatura) + "ºC"));
digitalWrite(13, LOW); // Esta parte é opcional, eu utilizei para testar e ver se estava a receber alguma coisa
}
}
depois de varios testes aqui com o pedrock pelo msn nao se chegou a conclusao nenhuma.
nao se entende porque é que o codigo com o pino PWR funciona MAS MAL...
ou seja ainda aparece a primeira vez a temperatura e humidade bem.. so que depois do loop faz caracteres malucos..
no example hello world.. a contagem nao aparecia...
agora comprei o potenciometro e é o inverso..
o codigo que o pedro postou... so aparece caracteres malucos,,,
e o hello world funciona perfeitamente bem e com a contagem a aparecer sem caracteres.
enfim...
-
eu sei a solução pra isso ...
VAI À BRUXA !!!!!!!!!!!!!!!!!!!!!
LOOOOOOOOL ;D ;D ;D
-
Experimenta os primeiros códigos que postámos aqui que não funcionaram antes. PWM não faz o mesmo que um potênciómetro... O potênciómetro é um divisor de tensão, enquanto que o pino PWM apenas envia pulsos. O problema pode estar ai, resolves se fizeres um divisor de tensão, assim não precisas de usar potênciómetro.
Quanto ao que se passa agora, onde é que aparecem os caracteres?
Se o hello world funciona, penso que o problema do lcd já foi ultrapassado e agora é apenas com o código... Digo eu. Experimenta outros códigos exemplo para ter a certeza que o problema já não está no lcd.
-
Ele testou o exemplo do serial e também funcionou sem problemas.
-
Então experimenta todos os códigos que postámos antes... Agora o erro já não deve estar no lcd.
-
bom descobri o problema..
então é assim
o example original do hello world tem esta linha:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
eu tinha modificado essa linha conforme tinha ligado no arduino ou seja assim:
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
e com esta linha o hello world funcionou com o potenciometro.. logo tambem deveria funcionar com o codigo do receptor...
entao decidi por carolice, trocar os pinos de 10 para 11..
e cheguei a conclusao que funciona...
lol, olhem que há coisas