Pages: [1]   Go Down
Author Topic: invalid conversion from const char*' to char  (Read 770 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos. Estoy haciendo mi primer proyecto con arduino.
El proyecto consiste en una puerta de un garaje.
Dispone de un botón de apertura, 2 finales de carrera y una fotocelula.
El numero de los pines los he puesto a boleo, ahora mismo solo me importa la parte de la programación.

Resulta que quiero depurar el programa a través del puerto serie del ordenador. Solo quiero que me envíe el nuevo mensaje, en vez de que me estén saliendo un montón de lineas que me digan lo mismo. El error es el que se muestra en el titulo. Sospecho que es algo relacionado con punteros (aún no los he estudiado). Os dejo el código para que me echeis una mano.


Quote
int boton = 4;
int fc_arriba =3;
int fc_abajo =2;
int fotocelula =5;
int led_verde = 7;
int led_rojo =6;
int motord =8;
int motori =9;
int tiempo = 15000;
int x=0;
int arriba=0;
void fenviar (char dato);
char dato;
char envio;

void setup()
{
  Serial.begin(9600);
  pinMode(motord,OUTPUT);
  pinMode(motori, OUTPUT);
  pinMode(led_verde, OUTPUT);
  pinMode(led_rojo,OUTPUT);
  digitalWrite(led_rojo,LOW);
  digitalWrite(led_verde,LOW);
  digitalWrite(motord, LOW);
  digitalWrite(motori, LOW);
}
void fenviar (char dato)
{
  if (dato!=envio);
  {
    Serial.println(dato);
    envio=dato;
  }
}

   

void loop()
{
  if (digitalRead(boton)==HIGH && digitalRead(fc_abajo)==HIGH)
  {
    dato="Abriendose puerta";
    fenviar(dato);
    digitalWrite(led_rojo,HIGH);
    digitalWrite(motord,HIGH);
  }
  if (digitalRead(motord)==1 && digitalRead(fc_arriba)==1)
  {
    dato="Puerta abierta";
    fenviar(dato);
    digitalWrite(motord,LOW);
    digitalWrite(led_rojo,LOW);
    digitalWrite(led_verde, HIGH);
    delay(tiempo);
    arriba=1;
  }
  if (arriba==1 && digitalRead(fc_arriba)==1)
  {
    dato="Bajando puerta";
    fenviar(dato);
    digitalWrite(led_verde,LOW);
    digitalWrite(led_rojo,HIGH);
    digitalWrite(motori,HIGH);
  }
  if (digitalRead(motori)==1 && digitalRead(fc_abajo)==1)
  {
    dato="Puerta cerrada";
    fenviar(dato);
    digitalWrite(motori, LOW);
    digitalWrite(led_rojo,LOW);
  }
  if (digitalRead(fotocelula)==HIGH && (digitalRead(motord)==HIGH ||digitalRead(motori)==HIGH))
  {
    arriba=0;
    digitalWrite(motord,HIGH);
    digitalWrite(led_verde,LOW);
    digitalWrite(led_rojo,HIGH);
    dato="Subiendo puerta (fotocelula)";
    fenviar(dato);
  }
}
 
 
   

Gracias de antemano.
Un saludo: eduardogi
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

dato es un char, no es un vector o un string que es lo que estás asignando.

Por otro lado, fenviar acepta como parámetro un char no un string que es lo que realmente le quieres pasar.
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por tu respuesta.
No acabo de comprender. Char es un único carácter, por lo tanto ami no me vale. Si a las variables las declaro String, me da otro tipos de errores.
Nose exactamente cual es el fallo.

Un saludo: eduardogi
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Digamos que estas manejando una cadena de caracteres como si fuese un simple carácter. Quita la función fenvio, pon la cadena a mandar directamente en Serial.println("hola""); y elimina la variable dato.
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si así lo tenía al principio. Pero lo que ocurre es que si la puerta se esta subiendo durante 20s, me va a estar llegando el mismo mensaje durante ese tiempo. Yo solo quiero que me llegue el mensaje únicamente cuando haya un cambio de estado.

Lo que pretendo hacer es llevar esa cadena de caracteres a la función enviar. Si es igual que la anterior enviada, no hacer nada, y si por el contrario es distinta, que me la envie.

Ejemplo:
Subiendo puerta
Puerta subida
Bajando puerta
Puerta bajada

En vez de:
Subiendo puerta
Subiendo puerta
Subiendo puerta
Subiendo puerta
Subiendo puerta
Subiendo puerta
Subiendo puerta
Subiendo puerta
Subiendo puerta
Puerta subida
Puerta subida
Puerta subida
Puerta subida
Puerta subida
Bajando puerta
Bajando puerta
Bajando puerta
Bajando puerta
Bajando puerta
....
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues tendras que manejar cadenas de caracteres, funciones a usar: strcpy, strlen, ...
Varias cosas: no puedes usar char solo, es un unico caracter, no puedes asignar ni compara una cadena de caracteres como si fuese una variable. Una cadena de caracteres es como un array, contiene n elementos del tipo char y ademas esta terminada por el caracter 0.
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

He echo un pequeño apaño, pero no consigo que me aparezca una sola linea, y evitar que se me repitan.
En vez de comparar dos String comparo dos números, y dependiendo de cual sea, envío un mensaje u otro.
Aquí el código a ver si conseguís ver el error:

Quote
int n;
#define ldr A0
int ldr_max =0;
int ldr_min = 1024;
int sensorvalue;
int altavoz=10;

int motord =6;
int motori =9;
int led_verde=8;
int led_rojo=7;

int dato;
boolean arriba;
boolean subiendo=false;
boolean bajando=false;
int boton = 3;
int fc_abajo =4;
int fc_arriba=5;
int tiempo=2000;


void setup()
{
  Serial.begin(9600);
  for(n=6;n<10;n++)
  {
    pinMode(n,OUTPUT);
  }
  delay(3000);
  for(n=6;n<10;n++)
  {
    digitalWrite(n,HIGH);
  }
  Serial.println("Iniciando calibracion");
  while (millis()<8000)
  {
    sensorvalue=analogRead(ldr);
    if (sensorvalue>ldr_max)
    {
      ldr_max=sensorvalue;
    }
    if (sensorvalue<ldr_min)
    {
      ldr_min=sensorvalue;
    }
  }
  for(n=6;n<10;n++)
  {
    digitalWrite(n,LOW);
  }
  Serial.println("Fin calibracion");
}

void fenviar (int dato)
{
  int envio;
  if (dato!=envio)
  {
    switch (dato)
    {
      case 1:
      Serial.println("Subiendo puerta");
      break;
      case 2:
      Serial.println("Puerta abierta");
      break;
      case 3:
      Serial.println("Bajando puerta");
      break;
      case 4:
      Serial.println("Puerta cerrada");
      break;
      case 5:
      Serial.println("Subiendo puerta (fotocelula)");
      break;
    }
    
  }
}
void loop()
{
  sensorvalue=analogRead(ldr);
  sensorvalue=map(sensorvalue,ldr_min,ldr_max,0,100);
  if (digitalRead(boton)==HIGH && digitalRead(fc_abajo)==HIGH)
  {
    dato=1;
    fenviar(dato);
    subiendo=true;
    digitalWrite(led_rojo,HIGH);
    digitalWrite(motord,HIGH);
    digitalWrite(motori,LOW);
  }
  
  if (subiendo==true)
  {
    dato=1;
    fenviar(dato);
    digitalWrite(led_rojo,HIGH);
    digitalWrite(motord,HIGH);
    digitalWrite(motori,LOW);
  }
  
  
  if (digitalRead(motord)==1 && digitalRead(fc_arriba)==1)
  {
    subiendo=false;
    dato=2;
    fenviar(dato);
    digitalWrite(motord,LOW);
    digitalWrite(led_rojo,LOW);
    digitalWrite(led_verde, HIGH);
    delay(tiempo);
    arriba=1;
  }
  if (arriba==1 && digitalRead(fc_arriba)==1)
  {
    bajando=true;
    dato=3;
    fenviar(dato);
    digitalWrite(led_verde,LOW);
    digitalWrite(led_rojo,HIGH);
    digitalWrite(motori,HIGH);
  }
  
  if (bajando==true)
  {
    playTone(500,200);
    delay(100);
    dato=3;
    fenviar(dato);
    digitalWrite(led_verde,LOW);
    digitalWrite(led_rojo,HIGH);
    digitalWrite(motori,HIGH);
  }
  
  if (digitalRead(motori)==1 && digitalRead(fc_abajo)==1)
  {
    bajando=false;
    dato=4;
    fenviar(dato);
    digitalWrite(motori, LOW);
    digitalWrite(led_rojo,LOW);
    }
    if (analogRead(sensorvalue)<20 && digitalRead(motori)==HIGH )
    {
      bajando=false;
      subiendo=true;
      digitalWrite(led_rojo,HIGH);
      digitalWrite(led_verde,LOW);
      digitalWrite(motord,HIGH);
      digitalWrite(motori,LOW);
      dato=5;
      fenviar(dato);  
    }
}


void playTone(int tone, int duration)
{
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(altavoz, HIGH);
    delayMicroseconds(tone);
    digitalWrite(altavoz, LOW);
    delayMicroseconds(tone);
  }
}


Gracias por la respuesta.
Un saludo: eduardogi
Logged

Pages: [1]   Go Up
Jump to: