Furgovw

Zona Técnica => Bricolaje => Electricidad => Mensaje iniciado por: gcab en Noviembre 13, 2016, 20:16:23 pm

Título: Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Noviembre 13, 2016, 20:16:23 pm
Arduino como sustitucion de la ECU, controlador de la calefaccion y placa controladora del ventilador.

Abro este hilo para explicar el proceso de la creacuon de un sistema de control para una calefaccion EBERSPACHER D3LC pero que seguramente servira para casi cualquier calefaccion estatica, haciendo algunas pequeñas modificaciones.
Como tengo la centralita de mi eberspacher fastidiada y ya viene el invierno y el precio de una Ecu ronda los 250€ pues. Me hago la mia y aprobecho para mejorar el controlador de serie en mi t4 multivan.

(http://www.furgovw.org/galeria/fotos/gcab/mitimer0.jpg)

Tengo este timer, aue entre esto y un interruptor on/off... Bueno que apqrobecho que tengo el arduino y depaso lo mejoro unñoco poniendo le control poet temperatura.
La idea:
Arduino para reemplazar todo el control de bomba de gasoil, bujia, velocidades de ventilador y  encendido apagado para un tiwmpo concreto o fijando una temperatura para toda la noche.


(http://www.furgovw.org/galeria/fotos/gcab/img_20161030_1246120.jpg)


Aqui unas pruebas alimentando la calefa con una fuente de alimentacion de ordenador.

(http://www.furgovw.org/galeria/fotos/gcab/img_20161030_1105240.jpg)

El grafico de los valores de resistencia que ofrece el sensor de temperatura de dentro de la calefa.

Funcionamiento:
Selecciono con un mando la opcion entre encender con un tiempo predeterminado o temperatura,(tambien se puede solo el ventilador, pal verano), se enciende el ventilador pa limpiar unpoco la camara, se enciende la bujia y empieza la bomba a bomhear lento, una vez que la resistencia detecta un valor de temperatura alto se deduce que hay llama asique ventilador al 100% y bomba rapido, y cuando llega a una temperatura cercana al sobrecalentamiento, menos gasoil para quemar no seme vaya a invendiar la furgo  ;Dy asi hasta que se acabe el ciclo.


Pal control del ventilador y bomba de gasoil he usado dos mosfets y para la bujia un rele pero bueno tampoco voy a echar la chapa  sobre montaje del circuito aqui, si a alguien le interesa el modelo o el montaje que pregunte .malabares
Ya ire adjuntando fotos .fotografo .fotografo

(http://www.furgovw.org/galeria/fotos/gcab/img_20160515_1439420.jpg)


El codigo lo pondre cuando lo termine, ire actualizando este post pero cualquier duda o si alguien lo quiere para hacerse su propio controlador que lo pida y selo paso.
Los materiales:
Un arduino .sombrero
Semsonr de temperatura LM35 (para la temperatura dentro de la furgo)
Un rele
Dos mosfets
Resistencias variass
Un mando infrarojo como losde los reproductores mp3para coche de los chinos
Un receptor de infrarojos
Una pantalla lcd y modulo i2c pa no tener 74939479 cables desde el arduino ala pantalla
Una calefa ;)
Cables y una placa para soldar todo
Y con esto y un bizcocho...

Todavia esta sin acabar pero espero que quede txulo y no me tenga qie comprar una calefa nueva.
AGUR!!

Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: arkaizt en Noviembre 13, 2016, 20:24:42 pm
puf... la idea es buena pero yo no la montaba asi ni loco...

Y el sensor de sobretrabajo de la turbina?
Y el sensor de bloqueo de la turbina?
Y el sensor de fallo de llama (3 veces)
Y el sensor de bajo voltaje o sobre voltaje?

Asi por encima son los mas importantes, pero tienes muchos mas... inclusive que al reitera un fallo varias veces la maquina entre en bloqueo para revisar lo que falla...

Ten cuidado compañero que juegas con un aparato que esta quemando gasoil mientras duermes... ;D

La idea es buena, si la desarrollas del todo puede funcionar.
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Noviembre 13, 2016, 21:41:54 pm
Por supuesto, esto es una explica cion muy simplificada del funcionamiento, esos factores ya los tengo en cuenta en el codigo, y todo se puede simplificar a que si pasado un tiempo la temperatura dentro de la camara de combustion no es la adecuada, inmediatamente parar todo y ya se vera la mañana siguiente que ha ocurrido.
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Argibay en Noviembre 13, 2016, 21:51:29 pm
Pasate por aqui

http://www.furgovw.org/index.php?topic=160490.msg1158900#msg1158900
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: amikoj en Noviembre 13, 2016, 22:33:02 pm
Te sigo para ver cómo va yendo todo.

Una pregunta, ¿en lugar de un LM35, has pensado en el DS18B20? lo digo porque si hay que recoger varias temperaturas, el DS18B20 está direccionado de fábrica y se pueden conectar todos en un mismo par de cables. Eso ahorraría mucho hardware y por lo tanto espacio y complicaciones. Es sólo una sugerencia porque tengo poca idea de todo ésto.

Felicidades por empezar y gracias por compartir.

Salud!
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Pequeño Iván en Noviembre 13, 2016, 23:20:57 pm

-Genial  .palmas

-El Arduino una vez más, va a ser genial dentro de nada, nos vamos a poder modular bien la gestión domótica de la furgo  .ereselmejor

-Ánimo con el proyecto, si me gustaría cuando lo termines, acceder a la información y al exquema, sería bueno estudiarlo y aprender de ello  :roll:

Gracias y un saludo furgonetero  ;)
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Noviembre 13, 2016, 23:51:16 pm
UNAS FOTOS:
Una vez la calefaccion este funcionando en el modo temperatura:
(http://www.furgovw.org/galeria/fotos/gcab/img_20161113_2315160.jpg)

El selector de modo

(http://www.furgovw.org/galeria/fotos/gcab/img_20161113_2313330.jpg)

El montaje:

(http://www.furgovw.org/galeria/fotos/gcab/img_20161113_2310080.jpg)
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: adric en Noviembre 14, 2016, 03:24:30 am
Yo me quedo por aquí, que tengo la del hidronic cascada y el principio de funcionamiento es el mismo... Aunque es algo en lo que da apuro tocar, ya que puede ser una bomba...

Enviado desde mi Aquaris X5 mediante Tapatalk

Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Pequeño Iván en Noviembre 14, 2016, 21:47:04 pm

-Temperatura actual 20.02  :o ¿No me digas que te mide centésimas?   .palmas

-Va tomando color y forma GO  ;)
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: arkaizt en Noviembre 15, 2016, 09:27:24 am
Parece que vas viento en popa! Y oye, le has sacado decimales al lm35? Los tiene? La verdad que es poco fiable ese sensor, si pudieras cambiar a otro seguro que te funciona mejor. Yo he hecho pruebas con un lm y según vas usándolo se va volviendo más errático...

Enviado desde mi Aquaris M5 mediante Tapatalk

Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Noviembre 15, 2016, 14:15:10 pm
Unas fotos de la la placa de cntrol ya soldada
Tiene 2 mosfet IRF540N que pueden desobra con la tension y corriente que nos pide el ventilador y la bomba, la bujia la controlare con un rele.

La original y la mia:, es una chapuzilla pero ya la he probado y funciona perfectmente, adenas, gracias al mosfet puedo controlar la velocidad del ventilador con el PWM del arduino.

(http://www.furgovw.org/galeria/fotos/gcab/img_20161114_1237030.jpg)

(http://www.furgovw.org/galeria/fotos/gcab/img_20161114_1233570.jpg)

(http://www.furgovw.org/galeria/fotos/gcab/img_20161114_1231310.jpg)


Al LM35 si que le voy a quitar los decimales porque bailan mucho, pero da suficientemente buenas medidas asique en principio usare este.
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Acv636 en Noviembre 19, 2016, 20:55:46 pm
Moooooooooola

Yo tengo un a d3lc pero a 24voltios

Y recogí una airtronic d2 que solo vale para camiones Iveco,...por can bus
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Noviembre 30, 2016, 19:49:43 pm
Bueno aqui el código: todavia no funciona perfectamente pero ya arranca, echando humareda jajaja ya pondre el nuevo cuando consiga que vaya perfecto!!

Me ha sido de gran ayuda lo hecho por barrigo en  http://www.furgovw.org/index.php?topic=258432.15

#include <Wire.h>



#include <LiquidCrystal_I2C.h>//Recuerda descargar la libreria en electrocrea.com   



#include <MsTimer2.h>



#include <IRremote.h> // use the library for IR



LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//Direccion de LCD



byte bat[8] = {



  0b00000,



  0b00000,



  0b10001,



  0b11111,



  0b11111,



  0b11111,



  0b00000,



  0b00000



};



byte term[8] = {



  0b00100,



  0b00100,



  0b00100,



  0b01110,



  0b11111,



  0b11111,



  0b01110,



  0b00000



};



////////////////////////////////7pins//////////////////



#define receptorPin 10 // pin pal receptor



#define ventiladorPin 9



#define bombaPin 8



#define bujiaPin 7

#define voltimetro A0



#define RESET 13



#define termometroPin A1  // pin pal sensor temp



int llamaPin = 2;       //pin sensor llama



//////////////////////////////////////////////////////



//////////////7aldagai//////



int intentos = 0;



int tiempo_akt = 0;



int temp_akt = 10;

unsigned long Ahora = 0;

float temp = 0.00;



int mando;



int menuorain = 0;



int raw = 0;



int Vin = 5;



float Vout = 0;



float R1 = 1000;



float R2 = 0;



float buffer = 0;



unsigned long tiempo_final;

unsigned long ant = 0; //aktualizazion txek



float temperatura_final;



boolean piztuta = LOW;



boolean bomba = LOW;



boolean tiempo_b = LOW;



boolean temperatura_b = LOW;

unsigned long TiempoAnterior2 = 0;

float t = 0;



int sel = 50; //seleccion velocidad ventilador



int veces_bomba = 0;

int t_off = 14;        //Cantidad de gasoil adecuado para arranque, ventilador 60%

int PWM_ventilador = 0;

/////////////////////////////////////







IRrecv irrecv(receptorPin); // create instance of 'irrecv'







decode_results results;





void setup()   {



  Serial.print("\nHOOOLA");



  pinMode(ventiladorPin, OUTPUT);



  ///analoglWrite(ventiladorPin,0);



  pinMode(bujiaPin, OUTPUT);



  digitalWrite(bujiaPin, HIGH);



  pinMode(bombaPin, OUTPUT);



  digitalWrite(bombaPin, LOW);







  lcd.begin(16, 2); // Indicamos medidas de LCD



  lcd.createChar(0, bat);



  lcd.createChar(1, term);



  lcd.setBacklight(0);

  ant = millis();





  irrecv.enableIRIn(); // Start the receiver



  Serial.begin(9600);



}















void loop()  {

  //actualizaciones continuas





  if (irrecv.decode(&results))



  {





    mando = hartuIR();



    irrecv.resume(); // receive the next value





    if (piztuta == HIGH && mando == 10) {



      itzali();







    } else if (piztuta == LOW && mando == 10) {



      ///Sekuenzia encendido



      lcd.setBacklight(1);



      lcd.clear();//Elimina todos los simbolos del LCD



      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



      lcd.print("EBERSPACHER D3L");



      lcd.setCursor(0, 1);



      lcd.write((uint8_t)1);







      lcd.print(temperatura());







      Serial.print("\nHOOOLA");



      delay(2000);



      piztuta = HIGH;



      selektmenu(mando);



    } else if (piztuta == HIGH) {







      selektmenu(mando);

     



      // Serial.print(mando);



      //Serial.print(" <--ditxo porel mando\n");







    }



  }

 

if (piztuta == HIGH){

if (millis() > (ant + 5000)) {

    ant = millis();



    txek();//comprobasionesencendido

   

  }





}



}



/////////////////////////////////////////////////////////////////////////////////////7



/////////////////FUNTXZIOAK////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////



void txek() {



  //Serial.print("dentrodetxek\n");

// Serial.print(ant);



  if (tiempo_b == HIGH) {



    if (tiempo_final >= millis()) {



      lcd.clear();



      lcd.print("Faltan-> ");



      lcd.print((tiempo_final - millis()) / 60000);



      lcd.print("mins");



      lcd.setCursor(0, 1);



      lcd.write((uint8_t)1);



      lcd.print(temperatura());







    } else if (tiempo_final <= millis()) {



      itzali();



    }



    llamakontrol();

    Serial.print("dentrodetxektiempo\n");

  }



  if (temperatura_final) {





    if (temperatura_b == HIGH) {

//regulador();





      if (temperatura_final >= temperatura()) {



        lcd.clear();



        lcd.write((uint8_t)1);



        lcd.print(" Actual->");



        lcd.print(temperatura());





        lcd.setCursor(0, 1);



        lcd.write((uint8_t)1);



        lcd.print(" Final-> ");



        lcd.print(temperatura_final);



        llamakontrol();



      } else if (temperatura_final <= temperatura()) {



        itzali();



      }



    } else if (temperatura_b == LOW) {







      lcd.setBacklight(1);



      lcd.clear();//Elimina todos los simbolos del LCD



      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



      lcd.print("EBERSPACHER D3L");



      lcd.setCursor(0, 1);



      lcd.write((uint8_t)1);







      lcd.print(temperatura());







      Serial.print("\nHOOOLA");



      piztuta = HIGH;



      temperatura_b = HIGH;



      delay(2000);

piztu(100);





    }

    //Serial.print("dentrodetxektemp\n");



  }















}





/////////////////////////////////////////////////////////////////////////////////////7



/////////////////FUNTXZIOAK////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////





void selektmenu(int mandu) {











  switch (menuorain)







  {







    case 0: empezarmenu(mandu) ; break;



    case 1:  empezar_temp(mandu); break;



    case 2:  empezar_tiempo(mandu); break;



    case 3:  empezarmenu2(mandu); break;



    case 4: piztu(mandu) ; break;



    case 5: ventiselekt(mandu) ; break;



    case 6: datos(mandu) ; break;



  }







}



void empezarmenu(int mandu)



{







  lcd.clear();



  lcd.setCursor(0, 0);



  lcd.print("1-> Temperatura");



  lcd.setCursor(0, 1);



  lcd.print("2-> Tiempo");







  Serial.print("\nPLAY-> empezar ya\n1-> empezar con temperatura\n2-> empezar con tiempo");







  if (mandu == 10) {



    empezar_ya();







  } else if (mando == 1) {



    menuorain = 1;



    empezar_temp(100);







  } else if (mando == 2) {



    menuorain = 2;



    empezar_tiempo(100);







  } else  if (mando == 15) {



    lcd.clear();



    lcd.setCursor(0, 0);



    lcd.print("3-> Ventilador");



    lcd.setCursor(0, 1);



    lcd.print("4-> Datos");



    menuorain = 3;



  }



}







void empezarmenu2(int mandu)



{







  lcd.clear();



  lcd.setCursor(0, 0);



  lcd.print("3-> Ventilador");



  lcd.setCursor(0, 1);



  lcd.print("4-> Datos");







  Serial.print("\n3-> ventilador\n4-> datos");







  if (mandu == 3) {



    ventiselekt(100);



    menuorain = 5;



  } else if (mando == 4) {



    menuorain = 6;



    datos(100);







  } else if (mando == 14) {



    menuorain = 0;



    empezarmenu(100);







  }



}















void empezar_ya() {



  Serial.print("\nempezarya");



}











void datos(int mandu) {



  Serial.print("\ndatos");



  lcd.clear();



  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



  lcd.write((uint8_t)1);



  lcd.print(temperatura());



  lcd.print(" ");



  lcd.write((uint8_t)0);



  lcd.print(volt());



  lcd.print("V");



  lcd.setCursor(0, 1);



  lcd.print("R");



  lcd.print(llama());



  if (mando == 14) {



    lcd.clear();



    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



    lcd.print("1-> Temperatura");



    lcd.setCursor(0, 1);



    lcd.print("2-> Tiempo");



    menuorain = 0;



  }



}















void ventiselekt(int mandu) {







  Serial.print("\nvwntiselekt");



  if (mandu == 100) {



    lcd.clear();//Elimina todos los simbolos del LCD



    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



    lcd.print("Elegir velocidad:");



    lcd.setCursor(0, 1);



    lcd.print("50");







    Serial.print("\nElegir temperatura->>>");



  } else {







    if (mandu == 18) {



      if (sel < 250) {



        sel = sel + 10;



      } else {



        sel = 255;



      }



      Serial.print("\n ACTUAL->");



      Serial.print(sel);



      lcd.setCursor(0, 1);



      lcd.print(sel);







    } else if (mandu == 17) {



      if (sel > 0) {



        sel = sel - 10;



      } else {



        sel = 0;



      }







      Serial.print(sel);



      lcd.setCursor(0, 1);



      lcd.print(sel);



      lcd.setCursor(6, 1);







    } else if (mando == 16) {



      Serial.print("\n ACTUAL->");







      Serial.print("velozidad selekzionada --->>");



      Serial.print(sel);







      lcd.clear();



      lcd.setCursor(0, 0);



      lcd.print("Velocidad:");



      lcd.setCursor(0, 1);



      lcd.print(sel);



      delay(1000);



      ventil(sel);



    }







  }



}







void empezar_temp(int mandu) {



  //Serial.print("\nempezartemp");



  menuorain = 1;



  if (mandu == 100) {



    lcd.clear();//Elimina todos los simbolos del LCD



    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



    lcd.print("Elegir temp:");



    lcd.setCursor(0, 1);



    lcd.print("10");



    lcd.setCursor(6, 1);



    lcd.print(temperatura());



    Serial.print("\nElegir temperatura->>>");



  } else {







    if (mandu == 18) {



      temp_akt = temp_akt + 1;



      Serial.print("\n ACTUAL->");



      Serial.print(temp_akt);



      lcd.setCursor(0, 1);



      lcd.print(temp_akt);



      lcd.setCursor(6, 1);



      t = temperatura();



      lcd.print(t);



    } else if (mandu == 17) {



      temp_akt = temp_akt - 1;



      Serial.print(temp_akt);



      lcd.setCursor(0, 1);



      lcd.print(temp_akt);



      lcd.setCursor(6, 1);



      t = temperatura();



      lcd.print(t);



    } else if (mando == 16) {



      Serial.print("\n ACTUAL->");



      temperatura_final = temp_akt;



      Serial.print("Temperatura selekzionada --->>");



      Serial.print(temperatura_final);



      temperatura_b = HIGH;



      lcd.clear();



      lcd.setCursor(0, 0);



      lcd.print("Temperatura:");



      lcd.setCursor(0, 1);



      lcd.print(temperatura_final);



      delay(1000);



      piztu(100);



    }







  }



}











void empezar_tiempo(int mandu) {



  menuorain = 2;



  if (mandu == 100) {



    lcd.clear();//Elimina todos los simbolos del LCD



    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



    lcd.print("Elegir tiempo:");



    lcd.setCursor(0, 1);



    lcd.print("0 mins");



    Serial.print("\nelegir tiempo en minutos");



  } else {







    if (mando == 18) {



      tiempo_akt = tiempo_akt + 5;



      lcd.setCursor(0, 1);



      lcd.print(tiempo_akt);



      lcd.print(" mins");



      Serial.print("\n ACTUAL->");



      Serial.print(tiempo_akt);



      //empezar_tiempo();



    } else if (mando == 17) {



      tiempo_akt = tiempo_akt - 5;



      lcd.setCursor(0, 1);



      lcd.print(tiempo_akt);



      lcd.print(" mins");



      Serial.print("\n ACTUAL->");



      Serial.print(tiempo_akt);



    } else if (mando == 16) {



      tiempo_b = HIGH;



      tiempo_final = millis() + tiempo_akt * 60000;



      Serial.print("Tiempo ofisssial--->>");



      Serial.print(tiempo_akt);



      lcd.clear();



      lcd.setCursor(0, 0);



      lcd.print("Tiempo:");



      lcd.setCursor(0, 1);



      lcd.print(tiempo_akt);



      lcd.print(" mins");



      delay(1000);



      piztu(100);



    }







  }



}















void piztu(int mandu)



{



  //empieza sekuencia



  //garbiketa





  if (llama() > 1220) {

    for (int s = 0; s <= 100; s++)



    {

      analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera

      delay(20);

    }

    analogWrite(ventiladorPin, 100);

    while (llama() < 1220) {

      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

      lcd.print("DEMASIAU CALIENTE");

      delay(1000);

      lcd.setCursor(0, 1); //Posiciona la primera letra despues del segmento 5 en linea 1

      lcd.print(llama());

      lcd.print(">1270, 50");

      delay (1000);

    }



  }





/////////////////////////sekuencia encendido





  lcd.clear();

lcd.setCursor(0, 0);

lcd.print("VENT ON");


//////////////////////////7
ventiladorf(40);
///////////////////////////


  lcd.setCursor(0, 1);
lcd.print("BUJIA ON");
Serial.print("\n VENT ON");

Serial.print("\nBUJIA ON");
lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

  lcd.print("BUJIA ON");

  digitalWrite(bujiaPin, LOW);



  lcd.setCursor(0, 1);

///////////////////////////////////bujia calentando

  for (int s = 0; s <= 15; s++)



  {

    lcd.print(s);

    Serial.print("\n");

    Serial.print(s);

    delay(1000);

  }
///////////////////////////////////////////////


  lcd.clear();



  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1



  lcd.print("BOMBA ON");

  delay(100);

  lcd.clear();

  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

  lcd.print("ESPERANDO LLAMA");

    bomba = HIGH;

    ////////////////////////////

   t_off=15;//bomaba mientras encendido

//////////////////////////
//unos pulsos para llenarlo
for (int s = 0; s <= 10; s++)

  {
digitalWrite( bombaPin, 1);
    delay(30);
digitalWrite( bombaPin, 0);
  }



  unsigned long startdenbora=millis();
  unsigned long kount=millis();
  while (llama() < 1200) { //esperandop a que se caliente
if (millis() > kount+300) {
   kount=millis();
    if (llama() < 1200 ) {

  Serial.print("\nesperando llama="); 
Serial.print(llama());
     
      lcd.setCursor(0, 1); //Posiciona la primera letra despues del segmento 5 en linea 1


      lcd.print(llama());

      lcd.print("<1380, 100");



    }

//////////////////// control stasrt tiempo
  if (millis() > startdenbora+30000) {
Serial.print("se ha pasau de tiempo");
itzali();
  }
///////////////////
  }
  }
digitalWrite(bujiaPin, HIGH);
MsTimer2::set(100, bombaf);

  MsTimer2::start();
  Serial.print("\n BOMBA ON piztuakabau");



  ////////////////////////////

   t_off=10;//bomaba despues de encendido

//////////////////////////



  lcd.clear();

  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

  lcd.print("LLAMA DETECTADA");

  delay(1000);



ventiladorf(255);//ventiladro atope





  txek();





}


int ventiladorf(int vel){

if (PWM_ventilador != vel)
  {
    if(PWM_ventilador > vel)
    {
      for(int s = PWM_ventilador; s > vel; s--)
      {
        analogWrite(ventiladorPin,s);
       
        delay(100);
      }
    }
    else if(PWM_ventilador < vel)
    {
      for(int s = PWM_ventilador; s < vel; s++)
      {
        analogWrite(ventiladorPin,s);
       
        delay(100);
      }
    }
  }
  PWM_ventilador=vel;
}



void regulador()

{

  int diferencia = 0;



    diferencia = temperatura_final - temperatura();

       

   

    if (diferencia >= 21) {

      t_off = 9;

    }

    else if (diferencia >= 19 && diferencia < 21) {

      t_off = 11;

    }

    else if (diferencia >= 17 && diferencia < 19) {

      t_off = 13;

    }

    else if (diferencia >= 15 && diferencia < 17) {

      t_off = 15;

    }

    else if (diferencia >= 13 && diferencia < 15) {

      t_off = 17;

    }

    else if (diferencia >= 11 && diferencia < 13) {

      t_off = 19;

    }

    else if (diferencia >= 9 && diferencia < 11) {

      t_off = 21;

    }

    else if (diferencia >= 7 && diferencia < 9) {

      t_off = 23;

    }

    else if (diferencia >= 5 && diferencia < 7) {

      t_off = 25;

    }

    else if (diferencia >= 3 && diferencia < 5) {

      t_off = 27;

    }

    else if (diferencia < 3) {

      t_off = 29;

    }

  seleccion();

 

}



void seleccion()

{

  if (t_off < 30 && t_off >= 28)

  {

    t_off = 29;



    PWM_ventilador = 80;

  }

  else if (t_off < 28 && t_off >= 26)

  {

    t_off = 27;



    PWM_ventilador = 90;

  }

  else if (t_off < 26 && t_off >= 24)

  {

    t_off = 25;



    PWM_ventilador = 100;

  }

  else if (t_off < 24 && t_off >= 22)

  {

    t_off = 23;

    PWM_ventilador = 110;

  }

  else if (t_off < 22 && t_off >= 20)

  {

    t_off = 21;

    PWM_ventilador = 120;

  }

  else if (t_off < 20 && t_off >= 18)

  {

    t_off = 19;

    PWM_ventilador = 130;

  }

  else if (t_off < 18 && t_off >= 16)

  {

    t_off = 17;

    PWM_ventilador = 142;

  }

  else if (t_off < 16 && t_off >= 14)

  {

    t_off = 15;

    PWM_ventilador = 155;

  }

  else if (t_off < 14 && t_off >= 12)

  {

    t_off = 13;

    PWM_ventilador = 170;

  }

  else if (t_off < 12 && t_off >= 10)

  {

    t_off = 11;

    PWM_ventilador = 185;

  }

  else if (t_off < 10 && t_off >= 9)

  {

    t_off = 9;

    PWM_ventilador = 200;

  }





}





void itzali()



{



  piztuta = LOW;



  bomba = LOW;



  tiempo_b = LOW;



  temperatura_b = LOW;



  MsTimer2::stop();



  digitalWrite(bombaPin, 0);



  digitalWrite(bujiaPin, 0);



  lcd.clear();



  lcd.print("APAGANDO");



  lcd.setCursor(0, 1);



  lcd.print("BOMBA");



  delay(1000);



  lcd.setCursor(0, 1);



  lcd.print("BUJIA");



  delay(1000);



  int llamav = llama();



  analogWrite(ventiladorPin, 150);



  while (llamav > 1250) {



    llamav = llama();







    lcd.setCursor(0, 1);



    lcd.print("VENTILADOR: ");



    lcd.print(llamav);



    delay(2000);



  }



  analogWrite(ventiladorPin, 150);



  lcd.setCursor(0, 1);



  lcd.print("VENTILADOR");



  delay(1000);



  lcd.setCursor(0, 1);



  lcd.print("====AGURR====");



  delay(1000);



  Serial.print("\nAGURRRRR");



  lcd.clear();



  delay(1000);



  lcd.setBacklight(0);



}







float llama()



{



  raw = analogRead(llamaPin);



  if (raw)



  {



    buffer = raw * Vin;



    Vout = (buffer) / 1024.0;



    buffer = (Vin / Vout) - 1;



    R2 = R1 * buffer;



    Serial.print("Vout: ");



    Serial.println(Vout);



    Serial.print("SENSOR LLAMA: ");



    Serial.println(R2);



    return R2;



  }



}



void ventil(int potensia)



{



  int s = 0;



  while ( s <= potensia)



  {



    analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera



    delay(20);



    s++;



  }



  analogWrite(ventiladorPin, potensia);



}











float temperatura()



{



  int temp_val = analogRead(termometroPin);



  float mv = (temp_val / 1024.0) * 5000;



  float cel = mv / 10;



  return cel;



}

float volt()



{

  float vout = 0.0;

  float vin = 0.0;

  float R1 = 100000.0; // resistance of R1 (100K) -see text!

  float R2 = 10000.0; // resistance of R2 (10K) - see text!

  int value = 0;



  value = analogRead(voltimetro);

  vout = (value * 5.0) / 1024.0; // see text

  vin = vout / (R2 / (R1 + R2));

  if (vin < 0.09) {

    vin = 0.0; //statement to quash undesired reading !

  }

  return vin;





}









void bombaf() {


  veces_bomba++;

  if (bomba == HIGH)

  {

    bomba = LOW;

  }

  else if (veces_bomba >= t_off)

  {

    bomba = HIGH;

    veces_bomba = 0;

  }

  digitalWrite( bombaPin, bomba);

   if (bomba == HIGH){

    // lcd.setCursor(15, 1);

// lcd.print("B");

Serial.print("\nbombA: ");

Serial.print(bomba);

Serial.print("\ntiempo: ");

Serial.print(millis());

   }

}





void llamakontrol() {



  int orain = 0;

  orain = llama();

  if (orain < 1200) {

    //nollama

  } else if (orain > 1200 && orain < 1800) {

    //funciona bien le falta mas

  } else if (orain > 1800 && orain < 2000) {

    //bajar bomba

  } else if (orain > 2100) {

    //sobrecalentamiento



  }

}



int hartuIR() // takes action based on IR code received















{







  switch (results.value)







  {







    case 0xFFA25D:  return (10); break; //on







    case 0xFF629D:  return (11); break; //mode







    case 0xFFE21D:  return (12); break; //mute







    case 0xFF22DD:  return (13); break; //play







    case 0xFF02FD:  return (14); break; //prev







    case 0xFFC23D:  return (15); break; //next







    case 0xFFE01F:  return (16); break; //eq







    case 0xFFA857:  return (17); break; //-







    case 0xFF906F:  return (18); break; //+







    case 0xFF6897:  return (0); break;







    case 0xFF9867:  return (19); break; //aleatrorio







    case 0xFFB04F:  return (20); break; //u/sd







    case 0xFF30CF:  return (1); break;







    case 0xFF18E7:  return (2); break;







    case 0xFF7A85:  return (3); break;







    case 0xFF10EF:  return (4); break;



    case 0xFF38C7:  return (5); break;

case 0xFF5AA5:  return (6); break;



    case 0xFF42BD:  return (7); break;





    case 0xFF4AB5: return (; break;





    case 0xFF52AD:  return (9); break;

    default: return (1000);







  }







  delay(500);











}

Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Guille_iomtt en Diciembre 07, 2016, 05:19:19 am
Joder, flipo con vosotros. Sois unos cracks.
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Diciembre 21, 2016, 10:15:41 am
Ya esta todo montado y funcionando perfectamente. No echa nada de humo(la foto es de las pruebas) tiene dos modos de velocidad y control de temperatura, todo funciona perfecto pero me falta mejorar algunos aspectos de seguridad.
Abajo os dejo el código.

Ademas del control de la eberspacher, ya que estaba le he puesto dos medidores de tempretura, (interior y exterior) y tambien un voltimetro que aprobecho para controlar tambien la calefacción



(http://www.furgovw.org/galeria/fotos/gcab/img_20161209_1322100.jpg)






(http://www.furgovw.org/galeria/fotos/gcab/img_20161209_1210540.jpg)




(http://www.furgovw.org/galeria/fotos/gcab/img_20161128_1252470.jpg)




(http://www.furgovw.org/galeria/fotos/gcab/gy0.jpg)







CODIGO:>

//librerias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MsTimer2.h>
#include <RCSwitch.h>
//fin librerias


LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//Direccion de LCD
RCSwitch mySwitch = RCSwitch();

//DEFINES
byte bat[8] = {
  0b00000,
  0b00000,
  0b10001,
  0b11111,
  0b11111,
  0b11111,
  0b00000,
  0b00000
};

byte term[8] = {
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b11111,
  0b11111,
0b01110,
  0b00000
};


#define ventiladorPin 9
#define bombaPin 5
#define bujiaPin 7
#define voltimetro A0
#define termometroPin A1  // pin pal sensor temp
int llamaPin = 2;       //pin sensor llama


//FIN DEFINES

//START VARIABLES
int intentos = 0;
int tiempo_akt = 0;
int temp_akt = 10;
unsigned long Ahora = 0;
float temp = 0.00;
int mando;
unsigned long tiempo_final;
unsigned long ant = 0; //aktualizazion txek
int temperatura_final;
boolean bomba = LOW;
unsigned long TiempoAnterior2 = 0;
int sel = 50; //seleccion velocidad ventilador
int veces_bomba = 0;
int t_off = 14;        //Cantidad de gasoil adecuado para arranque, ventilador 60%
int PWM_ventilador = 0;
int estado=0;


/*
* 0->apagau
* 1->encendido menu 1
* 2->encendido menu 2
* 3->menu ventilador
* 4-menu datos
* 5->menu sel temp
* 6-Menusel tiempo
* 7->`piztu
* 8->espera tiempo
* 9->espera temp
* 10-> apagando
* 11-> apagado control temp
12->espera tiempo atope
13->espera temp atope
*
14->en marca motor
* on->1332531
* ok->1332540
* menos->1332675
* mas->1332684
* izk->1332995
*dtxa-> 1333004
*
*/
//FIN VARIABLES



void setup() {
Serial.print(F("\nHOOOLA"));
analogReference(INTERNAL);
////PIN
  pinMode(ventiladorPin, OUTPUT);
  ///analoglWrite(ventiladorPin,0);
  pinMode(bujiaPin, OUTPUT);
  digitalWrite(bujiaPin, HIGH);
  pinMode(bombaPin, OUTPUT);
  digitalWrite(bombaPin, LOW);
///FINPIN
  lcd.begin(16, 2); // Indicamos medidas de LCD
  lcd.createChar(0, bat);
  lcd.createChar(1, term);
  lcd.setBacklight(0);
  ant = millis();
mySwitch.enableReceive(0);
  Serial.begin(9600);

}

void loop() {
 
 
  if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
mando=hartuRC(value);
menus(mando);
mySwitch.resetAvailable();
mando=0;
}
 

if (estado>6){

if (millis() > (ant + 5000)) {

    ant = millis();
    txek(100);//comprobasionesencendido
  }

}
}



/////////////////FUNTXZIOAK////////////////////////////////////////////

void txek(int mandu) {
 
  if (volt()>13&&estado!=14){
    estado=14;
     lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3L");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
   
  }
 
 
  if (mandu!=100){
    if (mandu==6 && estado==8){
      estado=12;
      t_off=1;//bomaba despues de encendido
analogWrite(ventiladorPin,240);
    } else  if (mandu==5 && estado==12){
       estado=8;
////////////////////////////
   t_off=5;//bomaba despues de encendido
analogWrite(ventiladorPin,90);
//////////////////////////
    } else  if (mandu==6 && estado==9){
       estado=13;
         t_off=1;//bomaba despues de encendido
analogWrite(ventiladorPin,240);
  } else  if (mandu==5 && estado==13){
       estado=9;
        ////////////////////////////
   t_off=5;//bomaba despues de encendido
analogWrite(ventiladorPin,90);
//////////////////////////
  } else if(mandu==3){
    if(estado==8||estado==12){
      tiempo_final--;
      txek(100);
    }else if(estado==9||estado==13){
      temperatura_final--;
      txek(100);
    }
  }else if(mandu=4){
    if(estado==8||estado==12){
      tiempo_final++;
      txek(100);
    }else if(estado==9||estado==13){
      temperatura_final++;
      txek(100);
    }
   
  }
  }
  if (estado == 8|| estado==12) {
    if (tiempo_final >= millis()) {
      lcd.clear();
      lcd.print("Faltan-> ");
      lcd.print((tiempo_final - millis()) / 60000);
      lcd.print("mins");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
      lcd.print("L->");
      lcd.print(llama());
    } else if (tiempo_final <= millis()) {

      itzali();
    }
   // llamakontrol();
    Serial.print(F("dentrodetxektiempo\n"));
  }

  if (temperatura_final) {

    if (estado == 9 || estado == 13) {

      if (temperatura_final >= temperatura()) {

        lcd.clear();
        lcd.write((uint8_t)1);
        lcd.print(" Actual->");
        lcd.print(temperatura());
        lcd.setCursor(0, 1);
        lcd.write((uint8_t)1);
        lcd.print(" Final-> ");
        lcd.print(temperatura_final);
      } else if (temperatura_final <= temperatura()) {
        estado=11;
        itzali();
       
      }
    } else if (estado == 11 && temperatura_final >= temperatura()) {
      lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3L");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
      Serial.print(F("\nHOOOLA"));

     estado = 9;
      delay(2000);
piztu(100);
    }
  }
}

void menus(int mandu) {
  /*
* 0->apagau
* 1->encendido menu 1
* 2->encendido menu 2
* 3->menu ventilador
* 4-menu datos
* 5->menu sel temp
* 6-Menusel tiempo
* 7->`piztu
* 8->espera tiempo
* 9->espera temp
* 10-> apagando
* 11-> apagado control temp
*
*/
  if (mandu!=0)
  {
   
     Serial.print(mandu);
    if (estado == 0 && mandu==1) {
     lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3LC");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
      Serial.print(F("\nHOOOLA"));
      delay(2000);
     estado=1;
      selektmenu(mando);
    } else if (estado!=0 && mandu==1) {
    //itzali();


    } else  {
      selektmenu(mandu);
     
    }
  }
}

void selektmenu(int mandu) {

  switch (estado)
  {

    case 1: empezarmenu(mandu) ; break;
     case 2:  empezarmenu2(mandu); break;
      case 3: ventiselekt(mandu) ; break;
      case 4: datos(mandu) ; break;
    case 5:  empezar_temp(mandu); break;
    case 6:  empezar_tiempo(mandu); break;
    case 7: piztu(mandu) ; break;
     case 8: txek(mandu) ; break;
   case 9: txek(mandu) ; break;
   case 12: txek(mandu) ; break;
   case 13: txek(mandu) ; break;
   
  }

}



void empezarmenu(int mandu)

{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("1-> Temperatura");
  lcd.setCursor(0, 1);
  lcd.print("2-> Tiempo");
  Serial.print(F("\nPLAY-> empezar ya\n1-> empezar con temperatura\n2-> empezar con tiempo"));
  if (mandu == 1) {
    empezar_ya();

  } else if (mando == 3) {
   estado = 5;
    empezar_temp(100);
  } else if (mando == 4) {
   estado = 6;
    empezar_tiempo(100);

  } else  if (mando == 6) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("3-> Ventilador");
    lcd.setCursor(0, 1);
    lcd.print("4-> Datos");
    estado = 2;
  }
}


void empezarmenu2(int mandu)

{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("1-> Ventilador");
  lcd.setCursor(0, 1);
  lcd.print("2-> Datos");
  Serial.print(F("\n3-> ventilador\n4-> datos"));
  if (mandu == 3) {
ventiselekt(100);
    estado = 3;

  } else if (mando == 4) {
    estado = 4;
    datos(100);
  } else if (mando == 5) {
   estado = 1;
    empezarmenu(100);
  }
}


void empezar_ya() {
  Serial.print(F("\nempezarya"));
}


void datos(int mandu) {
  Serial.print(F("\ndatos"));
  lcd.clear();
  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.write((uint8_t)1);
  lcd.print(temperatura());
  lcd.print(" ");
  lcd.write((uint8_t)0);
  lcd.print(volt());
  lcd.print("V");
  lcd.setCursor(0, 1);
  lcd.print("R");
  lcd.print(llama());
  if (mando == 5) {
    lcd.clear();
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("1-> Temperatura");
    lcd.setCursor(0, 1);
    lcd.print("2-> Tiempo");
    estado=1;
  }
}




void ventiselekt(int mandu) {
  Serial.print(F("\nvwntiselekt"));
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea
    lcd.print("Elegir velocidad:");
    lcd.setCursor(0, 1);
    lcd.print("50");
    Serial.print(F("\nElegir temperatura->>>"));
  } else {
    if (mandu == 4) {
      if (sel < 250) {
        sel = sel + 10;
      } else {
        sel = 255;
      }
      Serial.print(F("\n ACTUAL->"));
      Serial.print(sel);
      lcd.setCursor(0, 1);
      lcd.print(sel);
    } else if (mandu == 3) {
      if (sel > 0) {
        sel = sel - 10;
      } else {
        sel = 0;

      }
      Serial.print(sel);
      lcd.setCursor(0, 1);
      lcd.print(sel);
      lcd.setCursor(6, 1);
    } else if (mando == 2) {
      Serial.print(F("\n ACTUAL->"));
      Serial.print(F("velozidad selekzionada --->>"));
      Serial.print(sel);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Velocidad:");
      lcd.setCursor(0, 1);
      lcd.print(sel);
     delay(1000);
      ventil(sel);
    }
  }
}


void empezar_temp(int mandu) {

estado = 5;
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("Elegir temp:");
    lcd.setCursor(0, 1);
    lcd.print("10");
    lcd.setCursor(6, 1);
    lcd.print(temperatura());
    Serial.print(F("\nElegir temperatura->>>"));
  } else {
    if (mandu == 4) {
      temp_akt++;
      Serial.print(F("\n ACTUAL->"));
      Serial.print(temp_akt);
      lcd.setCursor(0, 1);
      lcd.print(temp_akt);
      lcd.setCursor(6, 1);
      lcd.print(temperatura());
    } else if (mandu == 3) {
      temp_akt--;
      Serial.print(temp_akt);
      lcd.setCursor(0, 1);
      lcd.print(temp_akt);
      lcd.setCursor(6, 1);
      lcd.print( temperatura());
    } else if (mando == 2) {
      Serial.print(F("\n ACTUAL->"));
      temperatura_final = temp_akt;
      Serial.print(F("Temperatura selekzionada --->>"));
      Serial.print(temperatura_final);
      estado=9;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperatura:");
      lcd.setCursor(0, 1);
      lcd.print(temperatura_final);
      estado = 9;
      delay(1000);
      piztu(100);
    }

  }
}



void empezar_tiempo(int mandu) {


  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("Elegir tiempo:");
    lcd.setCursor(0, 1);
    lcd.print("0 mins");
    Serial.print(F("\nelegir tiempo en minutos"));
  } else {
    if (mando == 4) {
      tiempo_akt = tiempo_akt + 5;
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" mins");
      Serial.print(F("\n ACTUAL->"));
      Serial.print(tiempo_akt);
      //empezar_tiempo();

    } else if (mando == 3) {
      tiempo_akt = tiempo_akt - 5;
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" mins");
      Serial.print(F("\n ACTUAL->"));
      Serial.print(tiempo_akt);
     
    } else if (mando == 2) {
     tiempo_final = millis() + tiempo_akt * 60000;
      Serial.print(F("Tiempo ofisssial--->>"));
      Serial.print(tiempo_akt);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tiempo:");
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" mins");
      estado=8;
      delay(1000);
     
      piztu(100);
    }
  }
}



void piztu(int mandu){
 
  if (llama() > 1200) {

    for (int s = 0; s <= 100; s++)
    {
      analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera
      delay(20);
    }
    analogWrite(ventiladorPin, 100);
    while (llama() > 1220) {
     lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
     lcd.print("DEMASIAU CALIENTE");
     delay(1000);
      lcd.setCursor(0, 1); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print(llama());
      lcd.print(">1220, 50");
      delay (1000);
    }
  }
/////////////////////////sekuencia encendido
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("VENT ON");

//////////////////////////
PWM_ventilador=60;
analogWrite(ventiladorPin,PWM_ventilador);
t_off=1;
///////////////////////////
Serial.print("\n VENT ON");
Serial.print("\nBUJIA ON");
lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

  lcd.print("BUJIA ON");
  digitalWrite(bujiaPin, LOW);
  lcd.setCursor(0, 1);

///////////////////////////////////bujia calentando

  for (int s = 0; s <= 30; s++)
  {
    lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.print("BUJIA ON");
  lcd.setCursor(0, 1);
    lcd.print(s);
Serial.print(F("\n"));
    Serial.print(s);
 
if (s>25){
  bombaf();
lcd.print("B");
}
delay(1000);
  }
///////////////////////////////////////////////
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();

  lcd.clear();
  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.print("BOMBA ON");
  delay(100);


 
  //unsigned long startdenbora=millis();
  unsigned long kount=millis();


MsTimer2::set(100, bombaf);
  MsTimer2::start();
  t_off=10;
  kount=millis();
while (PWM_ventilador < 90) { //esperandop a que se caliente

if(millis() > kount+2000) {
kount=millis();
      PWM_ventilador=PWM_ventilador+5;
      t_off--;
      analogWrite(ventiladorPin,PWM_ventilador);
      lcd.clear();
       lcd.setCursor(0, 0);
  lcd.print("V>");
  lcd.setCursor(3, 0);
    lcd.print(PWM_ventilador);
    lcd.setCursor(6, 0);
    lcd.print("B->");
     lcd.print(t_off);
     lcd.setCursor(0, 1);
      lcd.print("Llama->");
      lcd.setCursor(9, 1);
  lcd.print(llama());
        Serial.print(llama()); 
       
  }
}

  Serial.print(F("\n BOMBA ON piztuakabau"));

digitalWrite(bujiaPin, HIGH);
////////////////////////////
   t_off=5;//bomaba despues de encendido
   PWM_ventilador=90;
analogWrite(ventiladorPin,PWM_ventilador);

//////////////////////////

while (PWM_ventilador < 240) { //esperandop a que se caliente

if(millis() > kount+4000) {
kount=millis();
      PWM_ventilador=PWM_ventilador+30;
      t_off--;
      analogWrite(ventiladorPin,PWM_ventilador);
      lcd.clear();
       lcd.setCursor(0, 0);
  lcd.print("V>");
  lcd.setCursor(3, 0);
    lcd.print(PWM_ventilador);
    lcd.setCursor(6, 0);
    lcd.print("B->");
     lcd.print(t_off);
     lcd.setCursor(0, 1);
      lcd.print("Llama->");
      lcd.setCursor(9, 1);
  lcd.print(llama());
        Serial.print(llama()); 
       

  }
}

  t_off=1;//bomaba despues de encendido
  PWM_ventilador=240;
analogWrite(ventiladorPin,PWM_ventilador);
Serial.print(F("\n VENTILADOR ATOPE"));


  float emaitzz=llama()+llama()+llama()+llama()+llama();
  emaitzz=emaitzz/5;
   Serial.print(F("\nEMAITZA DE LLAMA TOTAL===>"));
    Serial.print(emaitzz);
    if(emaitzz<1050){
      Serial.print(F("\n============NO HAY LLAMA=============="));
       lcd.clear();
       lcd.print("NO HAY LLAMA!");
}else{
   lcd.clear();
  lcd.print("LLAMA DETECTADA");
}


  txek(100);


}





void itzali(){

  MsTimer2::stop();
  digitalWrite(bombaPin, LOW);
  digitalWrite(bujiaPin, HIGH);
  lcd.clear();
  lcd.print("APAGANDO");
  lcd.setCursor(0, 1);
  lcd.print("BOMBA");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("BUJIA");
  delay(1000);
  int llamav = llama();
  analogWrite(ventiladorPin, 150);

  while (llamav > 1100) {
    llamav = llama();
    lcd.setCursor(0, 1);
    lcd.print("VENTILADOR: ");
    lcd.print(llamav);
    delay(2000);

  }
  analogWrite(ventiladorPin, 150);
  lcd.setCursor(0, 1);
  lcd.print("VENTILADOR");
  delay(1000);
  estado=0;
  lcd.setCursor(0, 1);
  lcd.print("====AGURR====");
  delay(1000);
Serial.print(F("\nAGURRRRR"));
  lcd.clear();
  delay(1000);
  lcd.setBacklight(0);
}




float llama()

{
int raw = 0;
int Vin = 5.2;
float Vout = 0;

float R2 = 0;
float buffer = 0;
  raw = analogRead(llamaPin);
  if (raw)
  {
    buffer = raw * Vin;
    Vout = (buffer) / 1024.0;
    buffer = (Vin / Vout) - 1;
    R2 = 1000 * buffer;
    return R2;
  }
}


void ventil(int potensia)
{
  int s = 0;
  while ( s <= potensia)
  {
    analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera
    delay(20);
    s++;
  }
  analogWrite(ventiladorPin, potensia);
}


void bombaf() {
  veces_bomba++;
  if (bomba == HIGH)
  {
    bomba = LOW;
  }
  else if (veces_bomba >= t_off)
  {
    bomba = HIGH;
    veces_bomba = 0;
  }
  digitalWrite( bombaPin, bomba);
   //if (bomba == HIGH){
//Serial.print("\nbombA: ");
//Serial.print(bomba);
//Serial.print("\ntiempo: ");
///Serial.print(millis());
   //}
}

int temperatura()
{
  int val = analogRead(termometroPin);
int tempC = val / 9.31;
  return tempC;
}

float volt()
{
  float vout = 0.0;
  float vin = 0.0;
  int value = 0;
  value = analogRead(voltimetro);
  vout = (value * 5.0) / 1024.0; // see text
  vin = vout / (10000 / (100000 + 10000));
  if (vin < 0.09) {
  vin = 0.0; //statement to quash undesired reading !
  }
  return vin;
}


int hartuRC(int mandu) // takes action based on IR code received

{
  switch (mandu) {
    case 1332531:
      return 1;
      break;
    case 1332540:
      return 2;
      break;
        case 1332675:
      return 3;//mwenos(1)
      break;
        case 1332684:
      return 4;//mas(2)
      break;
        case 1332995:
      return 5; //iz(3)
      break;
       case 1333004:
      return 6; //dtxa(4)
      break;
    default:
      return 101;
    break;
  }

  delay(50);

}

Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: microtus en Diciembre 21, 2016, 10:18:32 am
Pinchado para seguimiento :)
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: adric en Diciembre 21, 2016, 19:15:18 pm
Cita de: gcab en Diciembre 21, 2016, 10:15:41 am
Ya esta todo montado y funcionando perfectamente. No echa nada de humo(la foto es de las pruebas) tiene dos modos de velocidad y control de temperatura, todo funciona perfecto pero me falta mejorar algunos aspectos de seguridad.
Abajo os dejo el código.

Ademas del control de la eberspacher, ya que estaba le he puesto dos medidores de tempretura, (interior y exterior) y tambien un voltimetro que aprobecho para controlar tambien la calefacción



(http://www.furgovw.org/galeria/fotos/gcab/img_20161209_1322100.jpg)






(http://www.furgovw.org/galeria/fotos/gcab/img_20161209_1210540.jpg)




(http://www.furgovw.org/galeria/fotos/gcab/img_20161128_1252470.jpg)




(http://www.furgovw.org/galeria/fotos/gcab/gy0.jpg)







CODIGO:>

//librerias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MsTimer2.h>
#include <RCSwitch.h>
//fin librerias


LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//Direccion de LCD
RCSwitch mySwitch = RCSwitch();

//DEFINES
byte bat[8] = {
  0b00000,
  0b00000,
  0b10001,
  0b11111,
  0b11111,
  0b11111,
  0b00000,
  0b00000
};

byte term[8] = {
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b11111,
  0b11111,
0b01110,
  0b00000
};


#define ventiladorPin 9
#define bombaPin 5
#define bujiaPin 7
#define voltimetro A0
#define termometroPin A1  // pin pal sensor temp
int llamaPin = 2;       //pin sensor llama


//FIN DEFINES

//START VARIABLES
int intentos = 0;
int tiempo_akt = 0;
int temp_akt = 10;
unsigned long Ahora = 0;
float temp = 0.00;
int mando;
unsigned long tiempo_final;
unsigned long ant = 0; //aktualizazion txek
int temperatura_final;
boolean bomba = LOW;
unsigned long TiempoAnterior2 = 0;
int sel = 50; //seleccion velocidad ventilador
int veces_bomba = 0;
int t_off = 14;        //Cantidad de gasoil adecuado para arranque, ventilador 60%
int PWM_ventilador = 0;
int estado=0;


/*
* 0->apagau
* 1->encendido menu 1
* 2->encendido menu 2
* 3->menu ventilador
* 4-menu datos
* 5->menu sel temp
* 6-Menusel tiempo
* 7->`piztu
* 8->espera tiempo
* 9->espera temp
* 10-> apagando
* 11-> apagado control temp
12->espera tiempo atope
13->espera temp atope
*
14->en marca motor
* on->1332531
* ok->1332540
* menos->1332675
* mas->1332684
* izk->1332995
*dtxa-> 1333004
*
*/
//FIN VARIABLES



void setup() {
Serial.print(F("\nHOOOLA"));
analogReference(INTERNAL);
////PIN
  pinMode(ventiladorPin, OUTPUT);
  ///analoglWrite(ventiladorPin,0);
  pinMode(bujiaPin, OUTPUT);
  digitalWrite(bujiaPin, HIGH);
  pinMode(bombaPin, OUTPUT);
  digitalWrite(bombaPin, LOW);
///FINPIN
  lcd.begin(16, 2); // Indicamos medidas de LCD
  lcd.createChar(0, bat);
  lcd.createChar(1, term);
  lcd.setBacklight(0);
  ant = millis();
mySwitch.enableReceive(0);
  Serial.begin(9600);

}

void loop() {
 
 
  if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
mando=hartuRC(value);
menus(mando);
mySwitch.resetAvailable();
mando=0;
}
 

if (estado>6){

if (millis() > (ant + 5000)) {

    ant = millis();
    txek(100);//comprobasionesencendido
  }

}
}



/////////////////FUNTXZIOAK////////////////////////////////////////////

void txek(int mandu) {
 
  if (volt()>13&&estado!=14){
    estado=14;
     lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3L");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
   
  }
 
 
  if (mandu!=100){
    if (mandu==6 && estado==8){
      estado=12;
      t_off=1;//bomaba despues de encendido
analogWrite(ventiladorPin,240);
    } else  if (mandu==5 && estado==12){
       estado=8;
////////////////////////////
   t_off=5;//bomaba despues de encendido
analogWrite(ventiladorPin,90);
//////////////////////////
    } else  if (mandu==6 && estado==9){
       estado=13;
         t_off=1;//bomaba despues de encendido
analogWrite(ventiladorPin,240);
  } else  if (mandu==5 && estado==13){
       estado=9;
        ////////////////////////////
   t_off=5;//bomaba despues de encendido
analogWrite(ventiladorPin,90);
//////////////////////////
  } else if(mandu==3){
    if(estado==8||estado==12){
      tiempo_final--;
      txek(100);
    }else if(estado==9||estado==13){
      temperatura_final--;
      txek(100);
    }
  }else if(mandu=4){
    if(estado==8||estado==12){
      tiempo_final++;
      txek(100);
    }else if(estado==9||estado==13){
      temperatura_final++;
      txek(100);
    }
   
  }
  }
  if (estado == 8|| estado==12) {
    if (tiempo_final >= millis()) {
      lcd.clear();
      lcd.print("Faltan-> ");
      lcd.print((tiempo_final - millis()) / 60000);
      lcd.print("mins");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
      lcd.print("L->");
      lcd.print(llama());
    } else if (tiempo_final <= millis()) {

      itzali();
    }
   // llamakontrol();
    Serial.print(F("dentrodetxektiempo\n"));
  }

  if (temperatura_final) {

    if (estado == 9 || estado == 13) {

      if (temperatura_final >= temperatura()) {

        lcd.clear();
        lcd.write((uint8_t)1);
        lcd.print(" Actual->");
        lcd.print(temperatura());
        lcd.setCursor(0, 1);
        lcd.write((uint8_t)1);
        lcd.print(" Final-> ");
        lcd.print(temperatura_final);
      } else if (temperatura_final <= temperatura()) {
        estado=11;
        itzali();
       
      }
    } else if (estado == 11 && temperatura_final >= temperatura()) {
      lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3L");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
      Serial.print(F("\nHOOOLA"));

     estado = 9;
      delay(2000);
piztu(100);
    }
  }
}

void menus(int mandu) {
  /*
* 0->apagau
* 1->encendido menu 1
* 2->encendido menu 2
* 3->menu ventilador
* 4-menu datos
* 5->menu sel temp
* 6-Menusel tiempo
* 7->`piztu
* 8->espera tiempo
* 9->espera temp
* 10-> apagando
* 11-> apagado control temp
*
*/
  if (mandu!=0)
  {
   
     Serial.print(mandu);
    if (estado == 0 && mandu==1) {
     lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3LC");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temperatura());
      Serial.print(F("\nHOOOLA"));
      delay(2000);
     estado=1;
      selektmenu(mando);
    } else if (estado!=0 && mandu==1) {
    //itzali();


    } else  {
      selektmenu(mandu);
     
    }
  }
}

void selektmenu(int mandu) {

  switch (estado)
  {

    case 1: empezarmenu(mandu) ; break;
     case 2:  empezarmenu2(mandu); break;
      case 3: ventiselekt(mandu) ; break;
      case 4: datos(mandu) ; break;
    case 5:  empezar_temp(mandu); break;
    case 6:  empezar_tiempo(mandu); break;
    case 7: piztu(mandu) ; break;
     case 8: txek(mandu) ; break;
   case 9: txek(mandu) ; break;
   case 12: txek(mandu) ; break;
   case 13: txek(mandu) ; break;
   
  }

}



void empezarmenu(int mandu)

{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("1-> Temperatura");
  lcd.setCursor(0, 1);
  lcd.print("2-> Tiempo");
  Serial.print(F("\nPLAY-> empezar ya\n1-> empezar con temperatura\n2-> empezar con tiempo"));
  if (mandu == 1) {
    empezar_ya();

  } else if (mando == 3) {
   estado = 5;
    empezar_temp(100);
  } else if (mando == 4) {
   estado = 6;
    empezar_tiempo(100);

  } else  if (mando == 6) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("3-> Ventilador");
    lcd.setCursor(0, 1);
    lcd.print("4-> Datos");
    estado = 2;
  }
}


void empezarmenu2(int mandu)

{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("1-> Ventilador");
  lcd.setCursor(0, 1);
  lcd.print("2-> Datos");
  Serial.print(F("\n3-> ventilador\n4-> datos"));
  if (mandu == 3) {
ventiselekt(100);
    estado = 3;

  } else if (mando == 4) {
    estado = 4;
    datos(100);
  } else if (mando == 5) {
   estado = 1;
    empezarmenu(100);
  }
}


void empezar_ya() {
  Serial.print(F("\nempezarya"));
}


void datos(int mandu) {
  Serial.print(F("\ndatos"));
  lcd.clear();
  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.write((uint8_t)1);
  lcd.print(temperatura());
  lcd.print(" ");
  lcd.write((uint8_t)0);
  lcd.print(volt());
  lcd.print("V");
  lcd.setCursor(0, 1);
  lcd.print("R");
  lcd.print(llama());
  if (mando == 5) {
    lcd.clear();
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("1-> Temperatura");
    lcd.setCursor(0, 1);
    lcd.print("2-> Tiempo");
    estado=1;
  }
}




void ventiselekt(int mandu) {
  Serial.print(F("\nvwntiselekt"));
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea
    lcd.print("Elegir velocidad:");
    lcd.setCursor(0, 1);
    lcd.print("50");
    Serial.print(F("\nElegir temperatura->>>"));
  } else {
    if (mandu == 4) {
      if (sel < 250) {
        sel = sel + 10;
      } else {
        sel = 255;
      }
      Serial.print(F("\n ACTUAL->"));
      Serial.print(sel);
      lcd.setCursor(0, 1);
      lcd.print(sel);
    } else if (mandu == 3) {
      if (sel > 0) {
        sel = sel - 10;
      } else {
        sel = 0;

      }
      Serial.print(sel);
      lcd.setCursor(0, 1);
      lcd.print(sel);
      lcd.setCursor(6, 1);
    } else if (mando == 2) {
      Serial.print(F("\n ACTUAL->"));
      Serial.print(F("velozidad selekzionada --->>"));
      Serial.print(sel);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Velocidad:");
      lcd.setCursor(0, 1);
      lcd.print(sel);
     delay(1000);
      ventil(sel);
    }
  }
}


void empezar_temp(int mandu) {

estado = 5;
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("Elegir temp:");
    lcd.setCursor(0, 1);
    lcd.print("10");
    lcd.setCursor(6, 1);
    lcd.print(temperatura());
    Serial.print(F("\nElegir temperatura->>>"));
  } else {
    if (mandu == 4) {
      temp_akt++;
      Serial.print(F("\n ACTUAL->"));
      Serial.print(temp_akt);
      lcd.setCursor(0, 1);
      lcd.print(temp_akt);
      lcd.setCursor(6, 1);
      lcd.print(temperatura());
    } else if (mandu == 3) {
      temp_akt--;
      Serial.print(temp_akt);
      lcd.setCursor(0, 1);
      lcd.print(temp_akt);
      lcd.setCursor(6, 1);
      lcd.print( temperatura());
    } else if (mando == 2) {
      Serial.print(F("\n ACTUAL->"));
      temperatura_final = temp_akt;
      Serial.print(F("Temperatura selekzionada --->>"));
      Serial.print(temperatura_final);
      estado=9;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temperatura:");
      lcd.setCursor(0, 1);
      lcd.print(temperatura_final);
      estado = 9;
      delay(1000);
      piztu(100);
    }

  }
}



void empezar_tiempo(int mandu) {


  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("Elegir tiempo:");
    lcd.setCursor(0, 1);
    lcd.print("0 mins");
    Serial.print(F("\nelegir tiempo en minutos"));
  } else {
    if (mando == 4) {
      tiempo_akt = tiempo_akt + 5;
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" mins");
      Serial.print(F("\n ACTUAL->"));
      Serial.print(tiempo_akt);
      //empezar_tiempo();

    } else if (mando == 3) {
      tiempo_akt = tiempo_akt - 5;
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" mins");
      Serial.print(F("\n ACTUAL->"));
      Serial.print(tiempo_akt);
     
    } else if (mando == 2) {
     tiempo_final = millis() + tiempo_akt * 60000;
      Serial.print(F("Tiempo ofisssial--->>"));
      Serial.print(tiempo_akt);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tiempo:");
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" mins");
      estado=8;
      delay(1000);
     
      piztu(100);
    }
  }
}



void piztu(int mandu){
 
  if (llama() > 1200) {

    for (int s = 0; s <= 100; s++)
    {
      analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera
      delay(20);
    }
    analogWrite(ventiladorPin, 100);
    while (llama() > 1220) {
     lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
     lcd.print("DEMASIAU CALIENTE");
     delay(1000);
      lcd.setCursor(0, 1); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print(llama());
      lcd.print(">1220, 50");
      delay (1000);
    }
  }
/////////////////////////sekuencia encendido
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("VENT ON");

//////////////////////////
PWM_ventilador=60;
analogWrite(ventiladorPin,PWM_ventilador);
t_off=1;
///////////////////////////
Serial.print("\n VENT ON");
Serial.print("\nBUJIA ON");
lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

  lcd.print("BUJIA ON");
  digitalWrite(bujiaPin, LOW);
  lcd.setCursor(0, 1);

///////////////////////////////////bujia calentando

  for (int s = 0; s <= 30; s++)
  {
    lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.print("BUJIA ON");
  lcd.setCursor(0, 1);
    lcd.print(s);
Serial.print(F("\n"));
    Serial.print(s);
 
if (s>25){
  bombaf();
lcd.print("B");
}
delay(1000);
  }
///////////////////////////////////////////////
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();
delay(20);
bombaf();

  lcd.clear();
  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.print("BOMBA ON");
  delay(100);


 
  //unsigned long startdenbora=millis();
  unsigned long kount=millis();


MsTimer2::set(100, bombaf);
  MsTimer2::start();
  t_off=10;
  kount=millis();
while (PWM_ventilador < 90) { //esperandop a que se caliente

if(millis() > kount+2000) {
kount=millis();
      PWM_ventilador=PWM_ventilador+5;
      t_off--;
      analogWrite(ventiladorPin,PWM_ventilador);
      lcd.clear();
       lcd.setCursor(0, 0);
  lcd.print("V>");
  lcd.setCursor(3, 0);
    lcd.print(PWM_ventilador);
    lcd.setCursor(6, 0);
    lcd.print("B->");
     lcd.print(t_off);
     lcd.setCursor(0, 1);
      lcd.print("Llama->");
      lcd.setCursor(9, 1);
  lcd.print(llama());
        Serial.print(llama()); 
       
  }
}

  Serial.print(F("\n BOMBA ON piztuakabau"));

digitalWrite(bujiaPin, HIGH);
////////////////////////////
   t_off=5;//bomaba despues de encendido
   PWM_ventilador=90;
analogWrite(ventiladorPin,PWM_ventilador);

//////////////////////////

while (PWM_ventilador < 240) { //esperandop a que se caliente

if(millis() > kount+4000) {
kount=millis();
      PWM_ventilador=PWM_ventilador+30;
      t_off--;
      analogWrite(ventiladorPin,PWM_ventilador);
      lcd.clear();
       lcd.setCursor(0, 0);
  lcd.print("V>");
  lcd.setCursor(3, 0);
    lcd.print(PWM_ventilador);
    lcd.setCursor(6, 0);
    lcd.print("B->");
     lcd.print(t_off);
     lcd.setCursor(0, 1);
      lcd.print("Llama->");
      lcd.setCursor(9, 1);
  lcd.print(llama());
        Serial.print(llama()); 
       

  }
}

  t_off=1;//bomaba despues de encendido
  PWM_ventilador=240;
analogWrite(ventiladorPin,PWM_ventilador);
Serial.print(F("\n VENTILADOR ATOPE"));


  float emaitzz=llama()+llama()+llama()+llama()+llama();
  emaitzz=emaitzz/5;
   Serial.print(F("\nEMAITZA DE LLAMA TOTAL===>"));
    Serial.print(emaitzz);
    if(emaitzz<1050){
      Serial.print(F("\n============NO HAY LLAMA=============="));
       lcd.clear();
       lcd.print("NO HAY LLAMA!");
}else{
   lcd.clear();
  lcd.print("LLAMA DETECTADA");
}


  txek(100);


}





void itzali(){

  MsTimer2::stop();
  digitalWrite(bombaPin, LOW);
  digitalWrite(bujiaPin, HIGH);
  lcd.clear();
  lcd.print("APAGANDO");
  lcd.setCursor(0, 1);
  lcd.print("BOMBA");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("BUJIA");
  delay(1000);
  int llamav = llama();
  analogWrite(ventiladorPin, 150);

  while (llamav > 1100) {
    llamav = llama();
    lcd.setCursor(0, 1);
    lcd.print("VENTILADOR: ");
    lcd.print(llamav);
    delay(2000);

  }
  analogWrite(ventiladorPin, 150);
  lcd.setCursor(0, 1);
  lcd.print("VENTILADOR");
  delay(1000);
  estado=0;
  lcd.setCursor(0, 1);
  lcd.print("====AGURR====");
  delay(1000);
Serial.print(F("\nAGURRRRR"));
  lcd.clear();
  delay(1000);
  lcd.setBacklight(0);
}




float llama()

{
int raw = 0;
int Vin = 5.2;
float Vout = 0;

float R2 = 0;
float buffer = 0;
  raw = analogRead(llamaPin);
  if (raw)
  {
    buffer = raw * Vin;
    Vout = (buffer) / 1024.0;
    buffer = (Vin / Vout) - 1;
    R2 = 1000 * buffer;
    return R2;
  }
}


void ventil(int potensia)
{
  int s = 0;
  while ( s <= potensia)
  {
    analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera
    delay(20);
    s++;
  }
  analogWrite(ventiladorPin, potensia);
}


void bombaf() {
  veces_bomba++;
  if (bomba == HIGH)
  {
    bomba = LOW;
  }
  else if (veces_bomba >= t_off)
  {
    bomba = HIGH;
    veces_bomba = 0;
  }
  digitalWrite( bombaPin, bomba);
   //if (bomba == HIGH){
//Serial.print("\nbombA: ");
//Serial.print(bomba);
//Serial.print("\ntiempo: ");
///Serial.print(millis());
   //}
}

int temperatura()
{
  int val = analogRead(termometroPin);
int tempC = val / 9.31;
  return tempC;
}

float volt()
{
  float vout = 0.0;
  float vin = 0.0;
  int value = 0;
  value = analogRead(voltimetro);
  vout = (value * 5.0) / 1024.0; // see text
  vin = vout / (10000 / (100000 + 10000));
  if (vin < 0.09) {
  vin = 0.0; //statement to quash undesired reading !
  }
  return vin;
}


int hartuRC(int mandu) // takes action based on IR code received

{
  switch (mandu) {
    case 1332531:
      return 1;
      break;
    case 1332540:
      return 2;
      break;
        case 1332675:
      return 3;//mwenos(1)
      break;
        case 1332684:
      return 4;//mas(2)
      break;
        case 1332995:
      return 5; //iz(3)
      break;
       case 1333004:
      return 6; //dtxa(4)
      break;
    default:
      return 101;
    break;
  }

  delay(50);

}




Ooooyeee, ¡¡qué crack!!

Me interesa mucho el esquema de montaje de componentes, que voy para dos inviernos sin calefacción ni agua caliente en la furgo ...

.ereselmejor .ereselmejor .ereselmejor .ereselmejor
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Freview en Diciembre 27, 2016, 21:24:23 pm
A mi tambien me interesa el esquema, si pudieras compartirlo  :D :D
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: amikoj en Diciembre 28, 2016, 00:38:59 am
Vaya crak con el código!!!!! .palmas
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Freview en Diciembre 28, 2016, 09:54:37 am
Como as solucionado el zumbido de la bobina del ventilador?

https://www.youtube.com/watch?v=kHZ0b0wFjaw&feature=youtu.be
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Diciembre 28, 2016, 18:12:32 pm
Cita de: firewer88 en Diciembre 28, 2016, 09:54:37 am
Como as solucionado el zumbido de la bobina del ventilador?

https://www.youtube.com/watch?v=kHZ0b0wFjaw&feature=youtu.be


Ese ruido lo hacen todos los motores con el PWM, lo que hay que hacer es envontrar un valor en el que no pite y listo, el mio pitaba en 80, lo puse a 90 y ya no pita.
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Diciembre 28, 2016, 19:21:51 pm
Aver, el esquema.

Me ha salido una buena txapuza asique aqui podeis ver como va la idea jajajaja
http://www.laziomatica.com/web/archives/category/arduino (http://www.laziomatica.com/web/archives/category/arduino)

Y aqui mi intento: jajaja yo no valgo pa esto
(https://www.furgovw.org/galeria/fotos/gcab/captura0.png)

(https://www.furgovw.org/galeria/fotos/gcab/captura20.png)
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: adric en Diciembre 29, 2016, 01:34:24 am
Cita de: gcab en Diciembre 28, 2016, 19:21:51 pm
Aver, el esquema.

Me ha salido una buena txapuza asique aqui podeis ver como va la idea jajajaja
http://www.laziomatica.com/web/archives/category/arduino (http://www.laziomatica.com/web/archives/category/arduino)

Y aqui mi intento: jajaja yo no valgo pa esto
(https://www.furgovw.org/galeria/fotos/gcab/captura0.png)

(https://www.furgovw.org/galeria/fotos/gcab/captura20.png)


Nos faltan saber los sensores y toda la parafernalia, como bujía y tal ...

¿El ventilador que pones es el que da aire al interior de la furgo o es el que mueve el aire para la combustión? ¿O en las de aire sólo existe un ventilador? Es que yo lo quier aplicar a un hydronic ...
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Diciembre 29, 2016, 10:12:01 am
Cita de: adric en Diciembre 29, 2016, 01:34:24 am
Nos faltan saber los sensores y toda la parafernalia, como bujía y tal ...

¿El ventilador que pones es el que da aire al interior de la furgo o es el que mueve el aire para la combustión? ¿O en las de aire sólo existe un ventilador? Es que yo lo quier aplicar a un hydronic ...


Mira, explico un poco todo lo que va conectado al arduino,

1- el sensor de llamade de serie de la eberspacher, leo su resistencia con el arduino, deapues la comparp con el grafico que subi del manual de eberspacher y consigo la temperatura de la caldera, esto me vale para saber cuando hay llama o esta sobrecalentado.
2- el ventilador de eberspacher, solo hay uno, el mismo para mover aire y para la camara de combustion, lo controlo con un mosfet siguiendo el esquema de arriba, le marco la velocidad por PWM evitando pasar por las velocidades en las que pita como dijo firewer88.
3- sensor de temperatura LM35, lo utilizo para medir ña temperatura dentro de la furgo.
4- control de la bomba de gasoil, tambien con un mosfet como en el esquema, las pulsaciones las he idoa ajustando a ojo, siempre intentando pasarme de aire antes que de combustible, para la d3lc las adecuadas son las de mi codigo, funciona perfectamenete.
5-control de la bujia, directamente le doy positibo de la bateria con un rele para arduino de los de ebay (1€) la tengo unos 30s encendida para quese ponga al rojo(creo que mi bateria anda un poco chunga?)
6- entrada del control remoto para arduino, no utilizo botones, asi puedo controlarla desde la cama, al principio era un mando infrarojonpero lo he cambiado por uno de radiofrecuencia que funciona mucho mejor.
7- un voltimetro, un cable saliendo ,de uno de los pines analogicos que mide la tension de la bateria, para saber cuando esta arrancada la furgo y para usar el arduino de voltimetro, sin mas

Creo que no se me olvida nada, porcierto yo tambien tengo un hidroniyc que no me enciende asique igual.....
Espero que os sea de ayuda!
Agur.
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Freview en Diciembre 29, 2016, 11:55:30 am
Los mosfet IRF540N  los conectas directamente a arduino solo con una resistencia en el gate? de que valor? no tienes etapa de preamplificacion?

No se te ponen achicharrando?
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: adric en Diciembre 30, 2016, 02:35:27 am
Cita de: gcab en Diciembre 29, 2016, 10:12:01 am
Mira, explico un poco todo lo que va conectado al arduino,

1- el sensor de llamade de serie de la eberspacher, leo su resistencia con el arduino, deapues la comparp con el grafico que subi del manual de eberspacher y consigo la temperatura de la caldera, esto me vale para saber cuando hay llama o esta sobrecalentado.
2- el ventilador de eberspacher, solo hay uno, el mismo para mover aire y para la camara de combustion, lo controlo con un mosfet siguiendo el esquema de arriba, le marco la velocidad por PWM evitando pasar por las velocidades en las que pita como dijo firewer88.
3- sensor de temperatura LM35, lo utilizo para medir ña temperatura dentro de la furgo.
4- control de la bomba de gasoil, tambien con un mosfet como en el esquema, las pulsaciones las he idoa ajustando a ojo, siempre intentando pasarme de aire antes que de combustible, para la d3lc las adecuadas son las de mi codigo, funciona perfectamenete.
5-control de la bujia, directamente le doy positibo de la bateria con un rele para arduino de los de ebay (1€) la tengo unos 30s encendida para quese ponga al rojo(creo que mi bateria anda un poco chunga?)
6- entrada del control remoto para arduino, no utilizo botones, asi puedo controlarla desde la cama, al principio era un mando infrarojonpero lo he cambiado por uno de radiofrecuencia que funciona mucho mejor.
7- un voltimetro, un cable saliendo ,de uno de los pines analogicos que mide la tension de la bateria, para saber cuando esta arrancada la furgo y para usar el arduino de voltimetro, sin mas

Creo que no se me olvida nada, porcierto yo tambien tengo un hidroniyc que no me enciende asique igual.....
Espero que os sea de ayuda!
Agur.


Buena explicación, ¡eres un crack!

Ui, si tienes tiempo para ver si funciona con el hydronic, sería un tremendo puntazo ;D, porque yo tiempo para trastear últimamente poco tengo ...  :'( ¡NECESITO DÍAS DE 36 HORAS! .malabares ¿Se podrán generar horas con Arduino? :roll:
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: gcab en Marzo 15, 2017, 21:17:07 pm
Buuenass!
Actualizo con el código. que he estado probando bastantes dias, y ya todo perfecto, este es el código final y ningun problema por ahora, tampoco la tengo toda la noche puesta con el control de temperatura por si acaso pero por lo demas todo bien!

Espero que sea de ayuda para la gente que quiera trastear un poco, que lomio me ha costau!

//librerias
#include <Wire.h>
#include <DHT11.h>
#include <LiquidCrystal_I2C.h>
#include <MsTimer2.h>
#include <RCSwitch.h>
//fin librerias


LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//Direccion de LCD
RCSwitch mySwitch = RCSwitch();

//DEFINES
byte bat[8] = {
  0b00000,
  0b00000,
  0b10001,
  0b11111,
  0b11111,
  0b11111,
  0b00000,
  0b00000
};

byte term[8] = {
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b11111,
  0b11111,
0b01110,
  0b00000
};


#define ventiladorPin 9
#define bombaPin 5
#define bujiaPin 8
#define voltimetro A0
#define termometroPin 7  // pin pal sensor temp
int llamaPin = 2;       //pin sensor llama


//FIN DEFINES

//START VARIABLES
int intentos = 0;
int tiempo_akt = 0;
int temp_akt = 10;
unsigned long Ahora = 0;
float temp = 0.00;
float humedad = 0.00;
int mando;
unsigned long tiempo_final;
unsigned long ant = 0; //aktualizazion txek
int temperatura_final;
boolean bomba = LOW;
unsigned long TiempoAnterior2 = 0;
int sel = 50; //seleccion velocidad ventilador
int veces_bomba = 0;
int t_off = 14;        //Cantidad de gasoil adecuado para arranque, ventilador 60%
int PWM_ventilador = 0;
int estado=0;
  DHT11 dht11(termometroPin);

/*
* 0->apagau
* 1->encendido menu 1
* 2->encendido menu 2
* 3->menu ventilador
* 4-menu datos
* 5->menu sel temp
* 6-Menusel tiempo
* 7->`piztu
* 8->espera tiempo
* 9->espera temp
* 10-> apagando
* 11-> apagado control temp
12->espera tiempo atope
13->espera temp atope
*
14->en marca motor
* on->1332531
* ok->1332540
* menos->1332675
* mas->1332684
* izk->1332995
*dtxa-> 1333004
*
*/
//FIN VARIABLES



void setup() {
Serial.print(F("\nHOOOLA"));

////PIN
  pinMode(ventiladorPin, OUTPUT);
  ///analoglWrite(ventiladorPin,0);
  pinMode(bujiaPin, OUTPUT);
  digitalWrite(bujiaPin, HIGH);
  pinMode(bombaPin, OUTPUT);
  digitalWrite(bombaPin, LOW);
///FINPIN
  lcd.begin(16, 2); // Indicamos medidas de LCD
  lcd.createChar(0, bat);
  lcd.createChar(1, term);
  lcd.setBacklight(0);

  ant = millis();
mySwitch.enableReceive(0);
  Serial.begin(9600);
temperatura();
}

void loop() {
 
 
  if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
mando=hartuRC(value);
menus(mando);
mySwitch.resetAvailable();
mando=0;
}



if (millis() > (ant + 5000)) {

    ant = millis();
      temperatura();
   if (estado>6){
    txek(100);//comprobasionesencendido
   }
  }

}




/////////////////FUNTXZIOAK////////////////////////////////////////////

void txek(int mandu) {
 
  /*if (volt()>13&&estado!=14){
    estado=14;
     lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3L");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temp);
   
  }
  */
 
  if (mandu!=100){
    if (mandu==6 && estado==8){
      estado=12;
      t_off=2;//bomaba despues de encendido
analogWrite(ventiladorPin,255);
    } else  if (mandu==5 && estado==12){
       estado=8;
////////////////////////////
   t_off=5;//bomaba despues de encendido
analogWrite(ventiladorPin,90);
//////////////////////////
    } else  if (mandu==6 && estado==9){
       estado=13;
         t_off=2;//bomaba despues de encendido
analogWrite(ventiladorPin,255);
  } else  if (mandu==5 && estado==13){
       estado=9;
        ////////////////////////////
   t_off=5;//bomaba despues de encendido
analogWrite(ventiladorPin,90);
//////////////////////////
  } else if(mandu==3){
    if(estado==8||estado==12){
      tiempo_final--;
      txek(100);
    }else if(estado==9||estado==13){
      temperatura_final--;
      txek(100);
    }
  }else if(mandu=4){
    if(estado==8||estado==12){
      tiempo_final++;
      txek(100);
    }else if(estado==9||estado==13){
      temperatura_final++;
      txek(100);
    }
   
  }
  }
  if (estado == 8|| estado==12) {
    if (tiempo_final >= millis()) {
      lcd.clear();
      lcd.print("Faltan-> ");
      lcd.print((tiempo_final - millis()) / 60000);
      lcd.print("mins");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temp);
      lcd.print("L->");
      lcd.print(llama());
   
    } else if (tiempo_final <= millis()) {

      itzali();
    }
   txekllama();
    Serial.print(F("dentrodetxektiempo\n"));
  }

  if (temperatura_final) {

    if (estado == 9 || estado == 13) {

      if (temperatura_final >= temp) {

        lcd.clear();
        lcd.write((uint8_t)1);
        lcd.print(" Orain->");
        lcd.print(temp);
        lcd.setCursor(0, 1);
        lcd.write((uint8_t)1);
        lcd.print(" Helmuga-> ");
        lcd.print(temperatura_final);
      } else if (temperatura_final <= temp) {
        estado=11;
        itzali();
       
      }
       txekllama();
    } else if (estado == 11 && temperatura_final >= temp) {
      lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3L");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temp);
      Serial.print(F("\nHOOOLA"));

     estado = 9;
      delay(2000);
piztu(100);
    }
  }
}

void menus(int mandu) {
  /*
* 0->apagau
* 1->encendido menu 1
* 2->encendido menu 2
* 3->menu ventilador
* 4-menu datos
* 5->menu sel temp
* 6-Menusel tiempo
* 7->`piztu
* 8->espera tiempo
* 9->espera temp
* 10-> apagando
* 11-> apagado control temp
*
*/
  if (mandu!=0)
  {
   
     Serial.print(mandu);
    if (estado == 0 && mandu==1) {
     lcd.setBacklight(1);
      lcd.clear();//Elimina todos los simbolos del LCD
      lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print("EBERSPACHER D3LC");
      lcd.setCursor(0, 1);
      lcd.write((uint8_t)1);
      lcd.print(temp);
      Serial.print(F("\nHOOOLA"));
      delay(2000);
     estado=1;
      selektmenu(mando);
    } else if (estado!=0 && mandu==1) {
    itzali();


    } else  {
      selektmenu(mandu);
     
    }
  }
}

void selektmenu(int mandu) {

  switch (estado)
  {

    case 1: empezarmenu(mandu) ; break;
     case 2:  empezarmenu2(mandu); break;
      case 3: ventiselekt(mandu) ; break;
      case 4: datos(mandu) ; break;
    case 5:  empezar_temp(mandu); break;
    case 6:  empezar_tiempo(mandu); break;
    case 7: piztu(mandu) ; break;
     case 8: txek(mandu) ; break;
   case 9: txek(mandu) ; break;
   case 12: txek(mandu) ; break;
   case 13: txek(mandu) ; break;
   
  }

}



void empezarmenu(int mandu)

{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("1-> Tenperatura");
  lcd.setCursor(0, 1);
  lcd.print("2-> Denbora");
  Serial.print(F("\nPLAY-> empezar ya\n1-> empezar con temperatura\n2-> empezar con tiempo"));
  if (mandu == 1) {
    empezar_ya();

  } else if (mando == 3) {
   estado = 5;
    empezar_temp(100);
  } else if (mando == 4) {
   estado = 6;
    empezar_tiempo(100);

  } else  if (mando == 6) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("1-> Aire");
    lcd.setCursor(0, 1);
    lcd.print("2-> Datuak");
    estado = 2;
  }
}


void empezarmenu2(int mandu)

{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("1-> Aire");
  lcd.setCursor(0, 1);
  lcd.print("2-> Datuak");
  Serial.print(F("\n3-> ventilador\n4-> datos"));
  if (mandu == 3) {
ventiselekt(100);
    estado = 3;

  } else if (mando == 4) {
    estado = 4;
    datos(100);
  } else if (mando == 5) {
   estado = 1;
    empezarmenu(100);
  }
}


void empezar_ya() {
  Serial.print(F("\nempezarya"));
}


void datos(int mandu) {
  Serial.print(F("\ndatos"));
  lcd.clear();
  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.write((uint8_t)1);
  lcd.print(temp);
  lcd.print(" ");
  lcd.write((uint8_t)0);
  lcd.print(volt());
  lcd.print("V");
  lcd.setCursor(0, 1);
  lcd.print("R");
  lcd.print(llama());
  lcd.print(" H");
  lcd.print(humedad);
  if (mando == 5) {
    lcd.clear();
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("1-> Tenperatura");
    lcd.setCursor(0, 1);
    lcd.print("2-> Denbora");
    estado=1;
  }
}




void ventiselekt(int mandu) {
    if (mando == 5) {
    lcd.clear();
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("1-> Tenperatura");
    lcd.setCursor(0, 1);
    lcd.print("2-> Denbora");
    estado=1;
  }
  Serial.print(F("\nvwntiselekt"));
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea
    lcd.print("Abiadura aukeratu:");
    lcd.setCursor(0, 1);
    lcd.print("50");
    Serial.print(F("\nElegir temperatura->>>"));
  } else {
    if (mandu == 4) {
      if (sel < 250) {
        sel = sel + 10;
      } else {
        sel = 255;
      }
      Serial.print(F("\n ACTUAL->"));
      Serial.print(sel);
      lcd.setCursor(0, 1);
      lcd.print(sel);
    } else if (mandu == 3) {
      if (sel > 0) {
        sel = sel - 10;
      } else {
        sel = 0;

      }
      Serial.print(sel);
      lcd.setCursor(0, 1);
      lcd.print(sel);
      lcd.setCursor(6, 1);
    } else if (mando == 2) {
      Serial.print(F("\n ACTUAL->"));
      Serial.print(F("velozidad selekzionada --->>"));
      Serial.print(sel);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Abiadura:");
      lcd.setCursor(0, 1);
      lcd.print(sel);
     delay(1000);
      ventil(sel);
    }
  }
}


void empezar_temp(int mandu) {

estado = 5;
   if (mando == 5) {
    lcd.clear();
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("1-> Tenperatura");
    lcd.setCursor(0, 1);
    lcd.print("2-> Denbora");
    estado=1;
  }
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("Tenp aukeratu:");
    lcd.setCursor(0, 1);
    lcd.print("10");
    lcd.setCursor(6, 1);
    lcd.print(temp);
    Serial.print(F("\nElegir temperatura->>>"));
  } else {
    if (mandu == 4) {
      temp_akt++;
      Serial.print(F("\n ACTUAL->"));
      Serial.print(temp_akt);
      lcd.setCursor(0, 1);
      lcd.print(temp_akt);
      lcd.setCursor(6, 1);
      lcd.print(temp);
    } else if (mandu == 3) {
      temp_akt--;
      Serial.print(temp_akt);
      lcd.setCursor(0, 1);
      lcd.print(temp_akt);
      lcd.setCursor(6, 1);
      lcd.print( temp);
    } else if (mando == 2) {
      Serial.print(F("\n ACTUAL->"));
      temperatura_final = temp_akt;
      Serial.print(F("Temperatura selekzionada --->>"));
      Serial.print(temperatura_final);
      estado=9;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tenperatura:");
      lcd.setCursor(0, 1);
      lcd.print(temperatura_final);
      estado = 9;
      delay(1000);
      piztu(100);
    }

  }
}



void empezar_tiempo(int mandu) {
estado=6;
  if (mando == 5) {
    lcd.clear();
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("1-> Tenperatura");
    lcd.setCursor(0, 1);
    lcd.print("2-> Denbora");
    estado=1;
  }
  if (mandu == 100) {
    lcd.clear();//Elimina todos los simbolos del LCD
    lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
    lcd.print("Denbora aukeratu:");
    lcd.setCursor(0, 1);
    lcd.print("0 min");
    Serial.print(F("\nelegir tiempo en minutos"));
  } else {
    if (mando == 4) {
      tiempo_akt = tiempo_akt + 5;
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" min");
      Serial.print(F("\n ACTUAL->"));
      Serial.print(tiempo_akt);
      //empezar_tiempo();

    } else if (mando == 3) {
      tiempo_akt = tiempo_akt - 5;
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" min");
      Serial.print(F("\n ACTUAL->"));
      Serial.print(tiempo_akt);
     
    } else if (mando == 2) {
     tiempo_final = millis() + tiempo_akt * 60000;
      Serial.print(F("Tiempo ofisssial--->>"));
      Serial.print(tiempo_akt);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Denbora:");
      lcd.setCursor(0, 1);
      lcd.print(tiempo_akt);
      lcd.print(" min");
      estado=8;
      delay(1000);
     
      piztu(100);
    }
  }
}



void piztu(int mandu){
   if (intentos< 2) {
    intentos++;
   }
  if (llama() > 1200) {

    for (int s = 0; s <= 100; s++)
    {
      analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera
      delay(20);
    }
    analogWrite(ventiladorPin, 100);
    while (llama() > 1220) {
     lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
     lcd.print("OSO BEROA");
     delay(1000);
      lcd.setCursor(0, 1); //Posiciona la primera letra despues del segmento 5 en linea 1
      lcd.print(llama());
      lcd.print(">1220, 50");
      delay (1000);
    }
  }
/////////////////////////sekuencia encendido
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("VENT ON");

//////////////////////////
PWM_ventilador=60;
analogWrite(ventiladorPin,PWM_ventilador);
t_off=0;
///////////////////////////
Serial.print("\n VENT ON");
Serial.print("\nBUJIA ON");
lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1

  lcd.print("BUJIA ON");
  digitalWrite(bujiaPin, LOW);
  lcd.setCursor(0, 1);

///////////////////////////////////bujia calentando

  for (int s = 30; s >= 0; s--)
  {
    lcd.clear();
lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.print("BUJIA ON");
  lcd.setCursor(0, 1);
    lcd.print(s);
Serial.print(F("\n"));
    Serial.print(s);
 
//if (s>25){
  //bombaf();
//lcd.print("B");
//}
delay(1000);
  }
///////////////////////////////////////////////

bombaf();
delay(100);
bombaf();
delay(100);
bombaf();
delay(100);
bombaf();
delay(100);
bombaf();
delay(100);
bombaf();

  lcd.clear();
  lcd.setCursor(0, 0); //Posiciona la primera letra despues del segmento 5 en linea 1
  lcd.print("BOMBA ON");
  delay(100);


 
  //unsigned long startdenbora=millis();
  unsigned long kount=millis();


MsTimer2::set(100, bombaf);
  MsTimer2::start();
  t_off=10;
  kount=millis();
while (PWM_ventilador < 90) { //esperandop a que se caliente

if(millis() > kount+2000) {
kount=millis();
      PWM_ventilador=PWM_ventilador+5;
      t_off--;
      analogWrite(ventiladorPin,PWM_ventilador);
      lcd.clear();
       lcd.setCursor(0, 0);
  lcd.print("V>");
  lcd.setCursor(3, 0);
    lcd.print(PWM_ventilador);
    lcd.setCursor(6, 0);
    lcd.print("B->");
     lcd.print(t_off);
     lcd.setCursor(0, 1);
      lcd.print("Llama->");
      lcd.setCursor(9, 1);
  lcd.print(llama());
        Serial.print(llama()); 
       
  }
}

  Serial.print(F("\n BOMBA ON piztuakabau"));

digitalWrite(bujiaPin, HIGH);
////////////////////////////
   t_off=5;//bomaba despues de encendido
   PWM_ventilador=90;
analogWrite(ventiladorPin,PWM_ventilador);

//////////////////////////

while (PWM_ventilador < 240) { //esperandop a que se caliente

if(millis() > kount+4000) {
kount=millis();
      PWM_ventilador=PWM_ventilador+30;
      t_off--;
      analogWrite(ventiladorPin,PWM_ventilador);
      lcd.clear();
       lcd.setCursor(0, 0);
  lcd.print("V>");
  lcd.setCursor(3, 0);
    lcd.print(PWM_ventilador);
    lcd.setCursor(6, 0);
    lcd.print("B->");
     lcd.print(t_off);
     lcd.setCursor(0, 1);
      lcd.print("Llama->");
      lcd.setCursor(9, 1);
  lcd.print(llama());
        Serial.print(llama()); 
       

  }
}

  t_off=2;//bomaba despues de encendido
  PWM_ventilador=255;
analogWrite(ventiladorPin,PWM_ventilador);
Serial.print(F("\n VENTILADOR ATOPE"));


  float emaitzz=llama()+llama()+llama()+llama()+llama();
  emaitzz=emaitzz/5;
   Serial.print(F("\nEMAITZA DE LLAMA TOTAL===>"));
    Serial.print(emaitzz);
    if(emaitzz<950){
      Serial.print(F("\n============NO HAY LLAMA=============="));
       lcd.clear();
       lcd.print("Ez da detektatu");
      // MsTimer2::stop();
      // piztu(100);
}else{
   lcd.clear();
  lcd.print("===DETEKTATUTA===");
}
  txek(100);
}
}





void itzali(){

  MsTimer2::stop();
  digitalWrite(bombaPin, LOW);
  digitalWrite(bujiaPin, HIGH);
  lcd.clear();
// lcd.print("APAGANDO");
// lcd.setCursor(0, 1);
  //lcd.print("BOMBA");
  //delay(1000);
// lcd.setCursor(0, 1);
  //lcd.print("BUJIA");
// delay(1000);
  int llamav = llama();
  analogWrite(ventiladorPin, 150);

  while (llamav > 950) {
    llamav = llama();
    lcd.setCursor(0, 1);
    lcd.print("VENTILADOR: ");
    lcd.print(llamav);
    delay(2000);

  }
  analogWrite(ventiladorPin,0);
// lcd.setCursor(0, 1);
  //lcd.print("VENTILADOR");
// delay(1000);
  estado=0;
  lcd.setCursor(0, 1);
  lcd.print("======AGUR======");
  delay(1000);
Serial.print(F("\nAGURRRRR"));
  lcd.clear();
  delay(1000);
  lcd.setBacklight(0);
}






float llama()
{
int raw = 0;
int Vin = 5.2;
float Vout = 0;
float R1 = 1000;
float R2 = 0;

float buffer = 0;
  raw = analogRead(llamaPin);
  if (raw)
  {
   buffer = raw * Vin;
    Vout = (buffer) / 1024.0;
buffer = (Vin / Vout) - 1;
    R2 = R1 * buffer;
   
    Serial.print(F("SENSOR LLAMA: "));
    Serial.print(R2);
    return R2;
  }
}



void ventil(int potensia)
{
  int s = 0;
  while ( s <= potensia)
  {
    analogWrite(ventiladorPin, s); //enciendo el ventilador poco a poco hasta el 50% para limpiar la caldera
    delay(20);
    s++;
  }
  analogWrite(ventiladorPin, potensia);
}


void bombaf() {
  veces_bomba++;
  if (bomba == HIGH)
  {
    bomba = LOW;
  }
  else if (veces_bomba >= t_off)
  {
    bomba = HIGH;
    veces_bomba = 0;
  }
  digitalWrite( bombaPin, bomba);
   //if (bomba == HIGH){
//Serial.print("\nbombA: ");
//Serial.print(bomba);
//Serial.print("\ntiempo: ");
///Serial.print(millis());
   //}
}




void temperatura()
{
  int err;

err=dht11.read(humedad, temp);
 

 
}



float volt()
{
  float vout = 0.0;
  float vin = 0.0;
  float R1 = 100000.0; // resistance of R1 (100K) -see text!
  float R2 = 10000.0; // resistance of R2 (10K) - see text!
  int value = 0;
  value = analogRead(voltimetro);
  vout = (value * 5.0) / 1024.0; // see text
  vin = vout / (R2 / (R1 + R2));
  if (vin < 0.09) {
    vin = 0.0; //statement to quash undesired reading !
  }
  return vin;

}

void txekllama(){
  float emaitzz=llama()+llama()+llama()+llama()+llama();
  emaitzz=emaitzz/5;
  if(emaitzz>1300){
      lcd.setCursor(1, 0);
  lcd.print("OSO BEROA");
  lcd.setCursor(0, 1);
  lcd.print(emaitz);
   lcd.print(">1300");
     t_off=3;//bomaba despues de encendido
  PWM_ventilador=255;
analogWrite(ventiladorPin,PWM_ventilador);
  delay(1000);


  }

 
   Serial.print(F("\nEMAITZA DE LLAMA TOTAL===>"));
    Serial.print(emaitzz);
    if(emaitzz<950&&intentos<2&&(millis()-kount)>1000){
          Serial.print(kount);
      Serial.print(F("\n============NO HAY LLAMA=============="));
       lcd.clear();
       lcd.print("Ez da detektatu");
       MsTimer2::stop();
      intentos++;
      piztu(100);
}else if(emaitz<950&&intentos>2){
  itzali();
}


int hartuRC(int mandu) // takes action based on IR code received

{
  switch (mandu) {
    case 1332531:
      return 1;
      break;
    case 1332540:
      return 2;
      break;
        case 1332675:
      return 3;//mwenos(1)
      break;
        case 1332684:
      return 4;//mas(2)
      break;
        case 1332995:
      return 5; //iz(3)
      break;
       case 1333004:
      return 6; //dtxa(4)
      break;
    default:
      return 101;
    break;
  }

  delay(50);

}


Agurr!
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: adric en Abril 07, 2017, 03:11:11 am
Habrá que probarlo en cuanto disponga de tiempo...
Eres un crack!

Enviado desde mi Aquaris X5 mediante Tapatalk

Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: raguti en Abril 13, 2017, 23:53:27 pm
Qué bueno!! .ereselmejor
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: eltoni en Abril 14, 2017, 00:02:12 am
menudo jefe :o
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: Juarmis en Noviembre 13, 2017, 20:53:57 pm
Me sumo al hilo...vaya cómo pilotas, Gcab!!!  .ereselmejor .ereselmejor .ereselmejor

Por cierto, nos puedes informar de cómo sigue funcionando tu calefa? La has usado ya de noche?

Saludos!!!
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: carlos cortes en Marzo 10, 2018, 15:10:13 pm
Hola, a todos, yo también tengo una d3lc con la centralita jodida, quiero hacer lo del Arduino y no lo tengo claro del todo, podrías pasarme información o ponerla aquí.
Me parece un gran trabajo y un puntazo
Gracias
Título: Re:Arduino reemplazando ECU de Eberspacher
Publicado por: carlos cortes en Marzo 12, 2018, 08:20:58 am
Nadie que pueda ayudarme??