Ir ao conteúdo
  • Cadastre-se

Arduino e Twitter


Posts recomendados

Olá pessoal, recentemente comprei o livro "Arduino em Ação" muito bom por sinal, recomendo!!

 

Lá ensinava a fazer o arduino enviar um Twitter toda vez que um evento acontece. Até eu fiz, foi a parte fácil...

...MAS (tudo tem um mas), o Twitter não aceita frases repetidas em um espaço de tempo de menos de 12 horas (foi a base que eu fiz com os testes).

 

Ai você diz: "É fácil, incrementa uma variável e manda junto com a frase". Pois é fiz isso, só que o que é postado no twitter são caracteres estranhos. Depois de tanto quebrar a cabeça eu chegei a algumas conclusões:

1 - A biblioteca do Twitter para o arduino só aceita enviar variáveis do tipo CHAR. O que é estranho, pois se você escrever "Sensor de porta Aberta: ON" Diretamente no espaço da mensagem ele envia, mas como tem aquele problema da mensagem repetida, ai não envia a próxima. Então eu coloco:
sendTweet("Sensor de porta Aberta: ON" + x); 

 

Concateno uma variável inteira incrementada toda vez pra não ser igual, só que ai aparece somente caracteres estranhos no twitter.

Se eu fazer isso:
char msg[11] = "Testandado";  // declarar esta variável

sendTweet(msg);    // enviar a variavel declarada 

 

Funciona, envia pro twitter a palavra testando, só que não resolve o problema, pois será uma mesma palavra igual.

 

Então gostaria de saber dos mais entendidos:

 

Quero enviar o valor de uma bateria, ex: 12.7 Volts

 

Onde "12.7" seria o valor de uma variável inteira ou outro tipo

E "Volts" uma constante

 

E tudo isso, "12.7 Volts" tem de estar dentro de uma Variável CHAR ARRAY. Se não da erro no compilar.

 

Resumindo, como transformo uma variável inteira e outra do tipo CHAR ARRAY em uma outra puramente CHAR ARRAY ???

 

Segue abaixo o código:

 

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Can be manually set but use the one that came on the sticker to avoid any possible conflicts
IPAddress manualIP(192,168,0,107); //determined by your network

int b1Pin = 2;
int a=0;     //declaring integer

char msg[11] = "Testandado";


Twitter twitter("Coloque seu Token do twitter aqui");


void setup()
{
   //try to connect using an automatically assigned IP (DHCP)
   //otherwise use the manual IP address defined
  delay(1000);
  if(!Ethernet.begin(mac)){
    Ethernet.begin(mac, manualIP);
  }
  Serial.begin(9600);
}

void sendTweet(const char msgToSend[])
{
  Serial.println("connecting ...");
  delay(2000);
  if (twitter.post(msgToSend)) {
    int status = twitter.wait(&Serial);
    delay(2000);
    if (status == 200) {
      Serial.println("OK.");
    } 
    else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } 
  else {
    Serial.println("connection failed.");
  }
}

void loop()
{

  if(digitalRead(b1Pin) == HIGH)
      {
      sendTweet("Teste com a variável 1");
      delay(2000); 
      }

}

 

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Oscar Acre disse:

Primeiro, a concatenação de strings não funciona assim em C.

Primeiro inclua a library string.h:

#include <string.h>.

Depois, ao invés de usar o comando "frasw" + x, use STRCAT("frase", x).


Moss, que vacilo meu, esqueci do Include ai... :(

Vou testar aqui e dou o resultado.

Muito obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Por quê não cria várias constantes com caracteres em ASCII que podem ser transformadas em variáveis no momento do envio.

Se tiver usando um arduino mega só vai ocupar 10KBytes dos 256K disponíveis para criar 100 mensagens com 100 caracteres diferentes cada.

 

Outra ideia seria juntar, não sei se a IDE do arduino pode fazer, mas sempre faço no BASCOM o seguinte:

Crio uma variável padrão e junto com  a atring TIME$ e DATE$ para formar a segunda variável CHAR para arduino ou STRING no bascom.

Link para o comentário
Compartilhar em outros sites

@Oscar Acre , não entendi muito bem, devo mudar o que? veja ai no código:

 


#include <string.h>  // declarar a biblioteca da String

 

int a=0;                            // criar a variável inteira

const char b = "teste";  // criar a constante

char c[9];                        // Variável que será enviada pro Twitter. 9 pois é 5 caracteres da palavra teste + 3 caracteres possíveis da variável inteira  ex: "250", + 1 (padrão).

 

void loop()

{

 

Como juntar A e B em C ???   /// Coloque um exemplo aqui, se possível.

 

  if(digitalRead(b1Pin) == HIGH){
      sendTweet(c); // envia a variável C (contendo A e B) para o Twitter
      delay(2000);
  }}



Vi esse exemplo na net, consegui transformar a inteira em CharArray, mas não sei como juntar uma constante e uma Char Array em uma terceira CharArray. :confused::confused:
Exemplo:

  int a=1;     //declaring integer
  char b[2];   //declaring character array
  String str;  //declaring string
 
  str=String(a); //converting integer into a string
  str.toCharArray(b,2); //passing the value of the string to the character array
  Serial.print("Value of b is \t");  //display that value
  Serial.println(b);


 

 

 

Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Oscar Acre disse:

STRCPY(c, "\0"); // inicializa a variável

STRCPM(c, (char)a);

STRCAT(c, b);

deu o seguinte erro:

 

Arduino: 1.6.0 (Windows 7), Placa:"Arduino Uno"

Listing8_2.ino:14:16: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
Listing8_2.ino: In function 'void loop()':
Listing8_2.ino:55:15: error: 'STRCPY' was not declared in this scope
Listing8_2.ino:56:18: error: 'STRCPM' was not declared in this scope
Listing8_2.ino:57:12: error: 'STRCAT' was not declared in this scope

 

Esses nomes STRPY, STRCPM e STRCAT são variáveis que precisam ser declaradas ou são comandos internos da biblioteca String.h? Nunca vi isso.

Se for variáveis, de que tipo serão?

Link para o comentário
Compartilhar em outros sites

1 hora atrás, _xyko_ disse:


Cara, você me salvou.... Interessante que eu passei ontem a tarde toda fuçando esse forum do arduino e nada... :(

 

Deu certo, esses links me salvaram!!

 

Valeu tb Oscar Acre pela força.

Olhem o código como ficou:

// Variáveis

int b1Pin = 2;
int a=0;
String str;
char enviar[10];




// Programa Principal

void loop()
{
  a++;
  delay(1000);

  str += a;
  str += " Volts";
  str.toCharArray(enviar,10);
  Serial.println(enviar);
  str = "";
  if (digitalRead(b1Pin) == HIGH)
  {
    sendTweet(enviar);
    delay(2000);
  }


}

Olha no meu Celularxc61flK.jpg

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Pessoal, consegui fazer meu Arduino enviar os Twitter, agora estou com um problema de ruído estranho.

 

usei o seguinte circuito para dizer para o arduino se existe tensão ou não em uma rede de energia 220V:

 

e0dC4oR.png

 

Quando eu tiro da tomada, o arduino envia o twitter "Sem tensão na rede"

 

Mas quando eu conecto na tomada, o arduino trava.

 

Teoricamente o Fotoacoplador serviria para isso não? Evitar transientes e ruidos.

 

O arduino está sendo alimentado pela USB e meu computador tem uma fonte com ótima filtragem é um DELL Optiplex 960.

 

Por onde pode está vindo esse ruído? Tem capacitores de 100nF em vários pontos do circuito para evitar isso, e mesmo assim tá acontecendo... :(

 

Coloquei aquele capacitor de 22nF/400V em paralelo com a entrada AC, mas não mudou nada.

 

Alguém tem alguma dica?

Link para o comentário
Compartilhar em outros sites

Pessoal, a coisa tá feia. Já distribui mais capacitores de 100nF entre outros locais do circuito de entrada e saída.

Já coloquei indutores de 220uH em série com fase e neutro e antes e depois deles coloquei capacitores de filtro X2 100nF/275Vac.

Troquei a alimentação via USB por uma fonte 9V de boa qualidade.

Realmente não sei mais o que testar! :confused::confused::eek::eek::mad::mad:

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Por quê não usa um trafo simples de baixa corrente somente para isolamento. Aí você retifica e filtra a baixa tensão de saída e liga numa entrada ADC do arduino. Caso esta saída ultrapasse os 5V, faça um divisor de tensão. Pela valor medido você calcula a tensão de entrada do trafo pela relção entre enrolamentos do primário e secundário.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Mas como sabes se a tensão de saída é uma amostra fiel e linear da tensão de entrada no optoacoplador?

Pra esta "transferência" eu preferiria fazer um VCO pra modular o led e ler a frequência através de um contador do arduino no coletor do transistor do opto.

edit:

----------------------------

O arduino pode led perfeitamente a onda senoidal pelo ADC. Assim dá pra monitorar até falta de fase.

A vantagem é que não precisa filtrar a saída com um capacitor tão alto e assim fazer a leitura em tempo real.

Já consegui até mesmo gravar e reproduzir áudio em SD cards com attinys e atmegas.

fazendo desta forma, nem precisa ficar conectado direto, basta fazer um datalogger e ler os dados quando quiser, de uma vez só e não apenas pelo twitter.

Veja estes links:

oscilloscope - How to connect 230V 50Hz to arduino analog input - Electrical Engineering Stack Exchange

 

http://mark.mckillen.com/wp-content/uploads/2012/12/Mains-Power-Monitor-Circuit-Diagram-rev1.png

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!