Go Down

Topic: Control de aire acondicionado (Automóvil) (Read 11792 times) previous topic - next topic

Swift

Pues en principio en la consola serial del putty o la platformio no hay ningún problema la muestra en el mismo sitio, pero en la aplicación para android "ArduinoDroid" lo muestra con un salto de línea pero bueno eso no es problema aquí el video que lo demuestra aplicando sprintf, lo que se me paso por la cabeza al implementar eso que pasara cuando por ejemplo pasa de 1000 RPM a 800 RPM me lo mostrará así 1800 RPM jajaja.

Bien... tengo algunas sugerencias.
Creo que te estas complicando en algunos puntos. Hoy por hoy deberias considerar (pero hablo con alguna ligereza) leer datos del motor usando ODB2. No hay fallos, funciona perfecto. Y tienes eso y mas.
Temperatura, la tienes, RPM, lo tienes. No se que mas. Vale la pena vs lo que estas haciendo.... ya veremos.
El mayor problema de esto es que mi Corolla al ser un generación 9 (G9) no tiene el protocolo estándar que utiliza el OBD2  CAN-H y CAN-L (J-2284) sino utiliza una iso 9141-2 (K-line) o en el peor de los casos es una variante MOBD o EOBD del OBD1, según lo que e investigado ahora me parece que ELM327 soporta este protocolo según el datasheet voy a intentar conseguirme uno para hacer las pruebas y ver lo que sucede.
Gracias por la corrección y por la información adicional.

surbyte

Quote
que lo demuestra aplicando sprintf, lo que se me paso por la cabeza al implementar eso que pasara cuando por ejemplo pasa de 1000 RPM a 800 RPM me lo mostrará así 1800 RPM jajaja.
No se porque pensé que era una pantalla TFT, ya veo e imagino cualquier cosa. Disculpa.

de todas formas si tiene 4 digitos que mostrar con sprintf, puedes decirle que lo haga y si son 3,2 o 1 agregará 0 a la izquierda de este modo. Tienes dos maneras con 0s o sin 0s.

Sin 0s pero con 4 lugares fijos

Code: [Select]
sprintf(buffer, "RPM %4d", iRpm);

Esto daría resultados asi
RPM: __20
RPM: _120
RPM: 2030
olvida el _ es para mostrar el espacio, pero es lugar vacío

Con 0s y además 4 lugares fijos

Code: [Select]
sprintf(buffer, "RPM %04d", iRpm);

Esto daría resultados asi
RPM: 0020
RPM: 0120
RPM: 2030

Swift

#32
Mar 21, 2018, 05:11 am Last Edit: Mar 21, 2018, 05:16 am by Swift
Buenas a todos, se me presentó un problema:
No puedo leer ningún dato adicional al de las revoluciones por el puerto OBD, con el típico elm327, esto puede por ser 2 causas, o bien hay algún fallo en mi sistema eléctrico, o es algún protocolo especial, entonces para hacer las lecturas tanto de revoluciones, temperatura, velocidad tocará utilizar algun convertidor de frecuencia a voltaje como el LM2907 (que me parece que lo utilizan en velocimetros) y este voltaje leerlo por el puerto análogo y posteriormente transformarlo  o algún otro sistema creo que se podría leer las frecuencias con varios attiny2313 comunicados por SPI, IC2, o serial con el arduino mega, bueno solo es una idea, alguna sugerencia.
El código no a cambiado ya que estoy pensando como seria la mejor forma de enviar los datos a la aplicación de la pc, e intentado aplicar los tutoriales de Metaconta pero hay veces que la aplicación se me congela, puede ser un error de la aplicación, seguiré intentando buscar la solución.
Ahora la Aduana me entregó la pantalla se demoró menos de lo que esperaba jajajaj adjunto una imagen de como quedo instalada.  

surbyte

Vaya que ya tiene pinta de un TESLA-TOYOTA o a la inversa!!!

Bien Swift porque no medir esa frecuencia con el mismo Arduino antes de meter un elemento que introduzca error como un LM2907, lo recuerdo de mis comienzos en electrónica pero ahora?? Esta fuera de época.
Puedes medir frecuencia usando un pin dedicado a ello en el Arduino. Hay uno especial asociado con los timers. Se llama Input Capture Pin. Es el pin 8.

Busca como usarlo pero es tu solución.

Swift

Segun busque del Input Capture Pin en el caso del arduino uno es el 8 incluso en la respuesta número 12 de Nick Gammon ponen un ejemplo:
Code: [Select]

// Frequency timer using input capture unit
// Author: Nick Gammon
// Date: 31 August 2013

// Input: Pin D8

volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;

// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect)
{
  overflowCount++;
}  // end of TIMER1_OVF_vect

ISR (TIMER1_CAPT_vect)
  {
  // grab counter value before it changes any more
  unsigned int timer1CounterValue;
  timer1CounterValue = ICR1;  // see datasheet, page 117 (accessing 16-bit registers)
  unsigned long overflowCopy = overflowCount;
  
  // if just missed an overflow
  if ((TIFR1 & bit (TOV1)) && timer1CounterValue < 0x7FFF)
    overflowCopy++;
  
  // wait until we noticed last one
  if (triggered)
    return;

  if (first)
    {
    startTime = (overflowCopy << 16) + timer1CounterValue;
    first = false;
    return;  
    }
    
  finishTime = (overflowCopy << 16) + timer1CounterValue;
  triggered = true;
  TIMSK1 = 0;    // no more interrupts for now
  }  // end of TIMER1_CAPT_vect
  
void prepareForInterrupts ()
  {
  noInterrupts ();  // protected code
  first = true;
  triggered = false;  // re-arm for next time
  // reset Timer 1
  TCCR1A = 0;
  TCCR1B = 0;
  
  TIFR1 = bit (ICF1) | bit (TOV1);  // clear flags so we don't get a bogus interrupt
  TCNT1 = 0;          // Counter to zero
  overflowCount = 0;  // Therefore no overflows yet
  
  // Timer 1 - counts clock pulses
  TIMSK1 = bit (TOIE1) | bit (ICIE1);   // interrupt on Timer 1 overflow and input capture
  // start Timer 1, no prescaler
  TCCR1B =  bit (CS10) | bit (ICES1);  // plus Input Capture Edge Select (rising on D8)
  interrupts ();
  }  // end of prepareForInterrupts
  

void setup ()
  {
  Serial.begin(115200);      
  Serial.println("Frequency Counter");
  // set up for interrupts
  prepareForInterrupts ();  
  } // end of setup

void loop ()
  {
  // wait till we have a reading
  if (!triggered)
    return;
 
  // period is elapsed time
  unsigned long elapsedTime = finishTime - startTime;
  // frequency is inverse of period, adjusted for clock period
  float freq = F_CPU / float (elapsedTime);  // each tick is 62.5 ns at 16 MHz
  
  Serial.print ("Took: ");
  Serial.print (elapsedTime);
  Serial.print (" counts. ");

  Serial.print ("Frequency: ");
  Serial.print (freq);
  Serial.println (" Hz. ");

  // so we can read it  
  delay (500);

  prepareForInterrupts ();  
}   // end of loop
el cual mide correctamente hasta 200 kHz a partir de es frecuencia empieza a fallar, ahora en mi caso necesitaria 3 pines para leer las 3 frecuencias que tengo(Velocidad, Revoluciones, y temperatura) por lo que, en el arduino mega que tengo para controlar los servos de la calefacción y  posición de ventanas y diferentes relés, tienes dos pines que son 48(ICP5) 49(ICP4) que son con los timers 5 y 4 y utilizar también el timer 1 con alguna interrupción no se si esto sea posible ya que tambien tendria que realizar conversiones de temperatura tanto del ambiente como del evaporador que son termistores, también al utilizar el timer 5 tendría no estoy muy seguro si funcionaran los servos ya que la librería de los servos en el mega utiliza el timer 5 y en el arduino uno utiliza el timer 1, no se si estoy errando en algo o estoy en lo correcto.
lo otro sería utilizar los atmega328 uno para cada frecuencia, y que estos se comuniquen con el mega que controla servos, termistor, y protecciones del aire acondicionado, creo que seria lo mas facil.

surbyte

Creo que solo hay un INPUT CAPTURE, no hay 2 ni 3. Reviso y te confirmo.

Quote
el cual mide correctamente hasta 200 kHz a partir de es frecuencia empieza a fallar
Vaya no hubiera imaginado que estuvieran a una frecuencia mayor a esa.

Swift

Creo que no me explique bien, utilice un generador de señal, para comprobar la frecuencia que lograba leer, para que llegue a esa frecuencia tendría que superar las 11.000rpm y no creo que aguante mi motor.

surbyte

#37
Mar 26, 2018, 06:03 pm Last Edit: Mar 26, 2018, 06:03 pm by surbyte
Si te explicaste bien y yo leí pero comprendí mal. Disculpas.

Swift

#38
May 13, 2018, 05:23 am Last Edit: May 13, 2018, 05:25 am by Swift
Buenas a todos, una pequeña actualización, e estado trabajando en la interfaz del corolla, el problema que detecté es que  si el usuario presiona el botón seguido el arduino o bien realiza la acción o aveces no, por lo que tendría que implementar en el código alguna opción para que una vez que realice la acción cambie el comando que envía el botón de la interfaz mientras tanto no cambie la opción.
No tengo idea cómo enviar del arduino a la interfaz los datos de la temperatura, pero que esto puede ser la solución: Comunicación avanzada por puerto serie o me recomiendan alguna otra forma de comunicarlo. La aplicacion la estoy haciendo en C# wpf adjunto todo el código de la interfaz como el de arduino.

Interfaz

Código Arduino

Como esta la interfaz por ahora


Video en funcionamiento

surbyte


Swift

#40
Jun 08, 2018, 09:16 pm Last Edit: Jun 08, 2018, 09:17 pm by Swift
Buenas a todos tengo una pequeña duda acerca de parseInt(), al utilizarla a esta debe lee el primer entero valido, ahora por ejemplo en este código
Code: [Select]
char
comando = ' ';
int
valor = 0;
void setup() {
 Serial.begin(115200);

}
void loop() {
 while (Serial.available()>0) {
 comando = Serial.read();
 valor = Serial.parseInt();
 Serial.print("Comando: ");
 Serial.println(comando);
 Serial.print("Valor: ");
 Serial.println(valor);
 }
}

Al yo enviar por el monitor serie: B.54. me imaginaba que solo entraba una vez y asignaba a comando = B y en valor = 54 pero al imprimir por monitor serie me muestras 2 veces.

y al enviar repetidamente el mismo valor ya no asigna la B a comando solo el número, porque  sucede esto?.

surbyte

Y el . decimal? Lo olvidaste.
Lee el 1ero, lee de nuevo y descarta su valor porque sera el punto decimal y finalmente lee el entero.




Swift

#42
Jun 13, 2018, 08:26 pm Last Edit: Jun 13, 2018, 08:33 pm by Swift
Quote
Y el . decimal? Lo olvidaste.
No me había dado cuenta, que despistado que soy jajajajaj.
Bueno ahora e añadido las lecturas de la interfaz tanto de la temperatura interior, exterior, evaporador y la humedad, ahora me doy cuenta que que la temperatura tanto del evaporador como la del exterior me están variando unos dos a tres grados, cosa rara que se me hace porque cuando recién lo instale no sucedía esto, puede que algo se soltó o paso algo ya me voy a dar tiempo para desarmar y revisar el sistema  :( .
Cual seria la forma correcta o mas aceptada para conectar un termistor:

 Adjunto un vídeo del funcionamiento hasta ahora: 
Interfaz Corolla

Go Up