Como fazer para o elipse ler um resultado do arduino?

Boa noite a todos. Estou utilizando um sensor LM35 para medir temperatura. O Arduíno converte o valor analógico lido pelo sensor em Graus Celsius, agora gostaria de saber como faço para pegar esse resultado obtido e jogar no elipse mobile?

@Renan_Martins_Santi1,

Abaixo segue um vídeo tutorial de como realizar tal procedimento:

Boa noite Gabriel. Já tinha visto esse tutorial. O problema que estou enfrentando, é como fazer o Elipse Mobile ler o resultado de uma formula e não apenas a porta digital ou analógica. Estou fazendo meu projeto de tcc aonde estou usando um sensor ultrassonico para medir nível e um sensor de fluxo. Para ter a variável de nivel e fluxo, é necessário pegar o valor lido na porta digital e tranforma-lá em uma variável de % para o nível e uma variável litros/hora para fluxo. Como faço para o elipse ler os resultados das fórmulas e não apenas as medições das portas?

Olá @Renan_Martins_Santi1

Veja se o tutorial abaixo resolve a sua questão:

Para acessar as variáveis internas, será necessário alterar o arquivo ElipseMobile.cpp da biblioteca da IDE do Arduino.

Observação: Sugerimos fazer um backup do arquivo original para eventuais problemas no arquivo editado.

ELIPSEMOBILE.CPP

Após abrir o arquivo, insira a lista de variáveis internas do tipo extern int na sequência das declarações. No exemplo, colocarei após os comandos #define.

extern int internal_var_0;
extern int internal_var_1;
extern int internal_var_2;
extern int internal_var_3;

Agora é necessário alterar o comando AnalogReadCommand para ler a faixa de variáveis internas. Dentro deste comando, definirei quais os endereços das variáveis internas. No exemplo irei definir que os endereços irão variar de 100 a 103.

Desta forma, testarei se a porta que está sendo lida fica nesta faixa. O comando ficará assim:

void AnalogReadCommand()
{
//Receives 1 characters and sends 2 characters
while(Serial.available() <= 0)
{
}
char port = Serial.read(); //-1 if no data is available

uint16_t readResult = analogRead(port);

if (port == 100)
{
readResult = internal_var_0; //<<–
}
else if (port == 101)
{
readResult = internal_var_1; //<<–
}
else if (port == 102)
{
readResult = internal_var_2; //<<–
}
else if (port == 103)
{
readResult = internal_var_3; //<<–
}
else
{
readResult = digitalRead(port);
}

SendAnalogResponse(1, readResult);
}

O mesmo será feito no comando AnalogWriteCommand para a escrita em memórias internas.

void AnalogWriteCommand()
{
//Receives 2 characters
while(Serial.available() <= 0)
{
}
char port = Serial.read(); //-1 if no data is available
pinMode(port, OUTPUT);
while(Serial.available() <= 0)
{
}
char state = Serial.read();

if (port == 100)
{
internal_var_0 = state; //<<–
}
else if (port == 101)
{
internal_var_1 = state; //<<–
}
else if (port == 102)
{
internal_var_2 = state; //<<–
}
else if (port == 103)
{
internal_var_3 = state; //<<–
}
else
{
analogWrite(port, state);
}
}

Feito isto, salve o arquivo ElipseMobile.cpp e abra a programação do Arduino.

IDE Arduino

No programa, declare as variáveis internas e utilize-as normalmente.
Exemplo:

Declarando:
int internal_var_0 = 12;
int internal_var_1 = 12;
int internal_var_2 = 0;
int internal_var_3 = 0;

E no programa:

void loop() // run over and over
{
internal_var_2 = internal_var_0 + internal_var_1;
internal_var_3 = internal_var_2 *2;
elipse.ProcessCommands(); // communication interface with Ellipse Mobile Server.
}

Feito isto, compile e programe o Arduino.

ELIPSE MOBILE

Após feita a configuração do ElipseMobile.cpp e da construção do programa, será necessário configurar o Elipse Mobile.
Na configuração do tag do objeto, coloque o nome da conexão, concatenado com “:Analog” e concatenado com a memória criada previamente.
Exemplo: arduino:Analog100

Desta forma, o Elipse Mobile estará conectando na porta analógica 100, que na verdade faz parte das memórias internas do Arduino.

Teste isto e me avise.

Olá Bruno. Muito obrigado por responder. Vou fazer o teste nesse final de semana e te aviso se funcionou.

Boa noite Bruno.

Estou tentando vários dias, mas não consegui.

Quero ler no elipse a variavel float distancia_in; mas não estou conseguindo, o que preciso fazer.
Segue o codigo abaixo. Coloquei ele sem as bibliotcas do elipse, pois não está rodando com elas, sera que consegue me ajudar?

// variáveis sensor ultrassonico
float mlContados = 0;
int gatilho = 9; // pino TRIG do sensor ultrassônico
int echo = 8; // pino ECHO do sensor ultrassônico
int rele = 5; //pino digital do rele !!! ALTERAR SE NECESSARIO !!!
float tempo; // para armazenar o tempo de ida e volta do sinal em microsegundos
float distancia_cm; // para armazenar a distância em centímetros
float distancia_in;
float nivel_atual_ml = 0;
float calculoFormula = 0;
int contaPulso; //Variável para a quantidade de pulsos
int i=0; //Variável para contagem
bool boolAplicaMistura = false;

//!!! ALTERAR AQUI !!!
//----------------------------------------------------------------------------
float capacidade_tanque_ml = 18000; //ALTERAR!!! capacidade total do tanque em ML
float setPointPorcentagem = 10; // porcentagem para iniciar mistura

// setup (executado apenas uma vez)
void setup() {
Serial.begin(9600);
// configura pino GATILHO como saída
pinMode(gatilho,OUTPUT);

//inicializa rele
pinMode(rele, OUTPUT);
// inicializa os rele desligado
digitalWrite(rele, HIGH); //em alguns modelos o desligado pode ser LOW
// deixa pino em LOW
digitalWrite(gatilho,LOW);
pinMode(2, INPUT);
attachInterrupt(0, incpulso, RISING); //Configura o pino 2(Interrupção 0) para trabalhar como interrupção
Serial.println("\n\nINICIANDO LEITURA DE NIVEL\n\n"); //Imprime Inicio na serial
delay(2000);

// configura pino ECHO como entrada
pinMode(echo,INPUT);
}

// laço principal (executado infinitamente)
void loop() {
if(!boolAplicaMistura)
{
// disparar pulso ultrassônico
digitalWrite(gatilho, HIGH);
delayMicroseconds(10);
digitalWrite(gatilho, LOW);

// medir tempo de ida e volta do pulso ultrassônico
tempo = pulseIn(echo, HIGH);

// calcular as distâncias em centímetros e polegadas
distancia_cm = tempo / 29.4 / 2;
distancia_in = ((28.6 - (tempo / 29.4 / 2)) / 26.2)*100;

// apresentar resultados no display LCD
Serial.print("Distancia: ");
Serial.print(distancia_cm);
Serial.println(" cm");
Serial.print("Nivel de agua:");
Serial.print(distancia_in);
Serial.println(" % ");


 
  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ALTERAR O CALCULO CONFORME NECESSÁRIO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        
  
  nivel_atual_ml = capacidade_tanque_ml * (distancia_in/100); //através da porcentagem que ele já tem do conteúdo do tanque, agora ele pega o valor da capacidade e multiplica por essa porcentagem para saber quantos ML estão dentro do tanque
  calculoFormula = nivel_atual_ml * 0.5; //aqui ele faz o calculo de quanto de mistura ira fazer


// se o calculo for maior que zero ele começa a injetar a mistura 

if(calculoFormula > 0 && distancia_in >= setPointPorcentagem)
{
  Serial.println(" INICIANDO A MISTURA ");
  delay(2000); 
  contaPulso = 0; //Zera a variável para contar os giros por segundos
  boolAplicaMistura = true;
  
  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ALTERAR  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  //AQUI DEVERÁ VIR O CODIGO PARA LIGAR A BOMBA
  digitalWrite(rele, LOW); //em alguns modelos o ligado pode ser HIGH 
  while(boolAplicaMistura)
  {
       
    sei(); //Habilita interrupção
    delay (1000); //Aguarda 1 segundo
    cli(); //Desabilita interrupção      
    mlContados = contaPulso * 2.25; //Conta o nr de pulsos e multiplica por 2.25 ml 
    if(mlContados >= calculoFormula) // se os mlContados forem iguais ou superiores ao calculo ele desliga a bomba
    {
      Serial.println(" MISTURA CONCLUIDA ");
      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ALTERAR  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      //AQUI DEVERÁ VIR O CODIGO PARA DESLIGAR A BOMBA
      digitalWrite(rele, HIGH); //em alguns modelos o desligado pode ser LOW
      Serial.print("Distancia: ");
      Serial.print(distancia_cm);
      Serial.println(" cm");
      Serial.print("Nivel de agua:");
      Serial.print(distancia_in);
      Serial.println(" % "); 
      break;
    }
    
  }
}

}
delay(2000);
// aguardar um pouquinho antes de começar tudo de novo
delayMicroseconds(200);
}

void incpulso ()
{
contaPulso++; //Incrementa a variável de contagem dos pulsos
}

Olá @Renan_Martins_Santi1,

Chegou a testar o tutorial que postei? Qual foi o resultado?
A diferença dele para o que você precisa é que o tutorial está utilizando o formato int ao invés do float.

Atenciosamente,