NIBE F1245 & F1145 Compressor Soft Starter Arduinolle

Niben on/off maalämpöpumpuissa on kompressorin pehmokäynnistin, jolla vältetään virtapiikki kompressorin käynnistyksessä. Käynnistin sisältää myös vaihevahdin puuttuvien vaiheiden ja väärän vaihejärjestyksen tarkkailulle.

Samassa paketissa on myös moottorinsuojakytkin, mallia EATON PKZM0-6.3-C. Kompressori itsessään ei tarvitse nollajohtoa, mutta pehmokäynnistimen piirilevy tarvitsee nollan vaiheiden mittauksen vertailutasoksi.

Digitaaliosien jännitteensyöttö on 12V liittimen X5 kautta (musta ja punainen johdin). Maalämpöpuppu kommunikoi moduliin kanssa ”lähes” I2C-väylän kautta. Väylässä ei ole osoitteitusta eikä varsinaisia start/stop -tiloja.

Käynnistys ja käynnissäpito maalämpöpumpun komennolla 0x01,0x33, 0x33 ,0x00 ja sammutus komennolla 0x01,0x2d, 0x2d ,0x00. Komennon jälkeen pehmokäynnistin vastaa neljätavuisella statussanomalla.

Jos kylmämoduulia ja kompressoria haluaa käyttää pehmokäynnistimen kautta kokonaisuudesta irrotettuna, tarvitaan logiikka sanomien lähettämiseen. Tässä yksinkertainen toteutus Arduinolle.

Huom! Tässä ei huomioida keruun tai lämmönjaon nestekiertoa ja pumppujen ohjausta. Myös yli- ja alipainepressostaattien tarkkailu jätetään huomioimatta. Suoralla syötöllä kompressori käy rikkoontumiseen asti tai kun moottorinsuojakytkin laukeaa.

Arduino käynnistää kompressorin, kun sen sarjaportista vastaanotetaan 1 tai jumpperipinnit on yhdistetty. Kompressori sammuu, kun uutta käynnistyssanomaa ei tule muutamaan sekuntiin tai välittömästi Arduinon vastaanotettua 0 ja sammutussanoman lähettämisen jälkeen.

Käynnistyssanoman jälkeen pehmokäynnistyksen releet kytkeytyvät ja compr.on LED syttyy. Pienen viiveen (1-2s) jälkeen pehmokäynnistys kytkeytyy ohitukselle ja Bypass LED syttyy.

Pehmokäynnistimen piirilevyllä ohjauksesta vastaa pic16f677-mikrokontrolleri. Tämä ohjaa kuutta relettä, joilla kompressorin syöttö valitaan halutulle reitille.

Nelinapaliitin:
1: Punainen, 12V
2: Musta, GND (Myös Arduino!)
3: Harmaa, SCL (0-5V)
4: Valkoinen, SDA (0-5V)

Arduinon C-koodi

/*
 * NIBE F1245 & F1145 compressor soft start communication controller 
 * Uart commands:
 * 1: Set compressor ON
 * 0: Set compressor OFF
 * 
 * Close jumper pins for continuous ON state kicking
 * 
 * Some return values:
 * 0x3: Phase1 missing
 * 0x5: Phase2 missing
 * 0x7: Phase3 missing
 * 0x9: Incorrect phase order
 * 
 * 0xB: Phases OK, compressor OFF
 * 0xD: Compressor on
 * 0x11: All phases missing
 * 
 * (c) 2024 Janne Kivijakola
 */


#define PIN_SCL 19
#define PIN_SDA 18

#define PIN_JUMPER1 2
#define PIN_JUMPER2 3

void setCompressor(byte state);

void setup()
{
  Serial.begin(115200);
  Serial.println("\nNIBE SOFT STARTER");

  pinMode(PIN_SDA, INPUT_PULLUP);
  pinMode(PIN_SCL, OUTPUT);

  //Jumper
  pinMode(PIN_JUMPER1, INPUT_PULLUP);
  pinMode(PIN_JUMPER2, OUTPUT);
  digitalWrite(PIN_JUMPER2, LOW);
}

void loop()
{
  byte incomingByte;

  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();

    if(incomingByte == '1')
    {
      setCompressor(1);
    }
    if( incomingByte == '0')
    {
      setCompressor(0);
    }
  }

  //Jumper in place --> Do kicking
  if(!digitalRead(PIN_JUMPER1))
    setCompressor(1);

  delay(1000);
  
}
void setCompressor(byte state)
{
  byte startcmd[] = { 0x01,0x33, 0x33 ,0x00};
  byte stopcmd[]  = { 0x01,0x2d, 0x2d ,0x00};
  byte *writeData = startcmd;

  if(!state)
    writeData = stopcmd;
  
  pinMode(19, OUTPUT);
  digitalWrite(19, HIGH);
   
  //start
  pinMode(PIN_SDA, OUTPUT);
  digitalWrite(PIN_SDA, LOW);
  delay(5);
  digitalWrite(PIN_SCL, LOW);
  delay(5);

  //sync
  for(int i = 0; i<8;i++)
  {
    digitalWrite(PIN_SCL, HIGH);
    delay(5);
    digitalWrite(PIN_SCL, LOW);
    delay(5);
  }

  //Write data
  for(int k = 0; k<4;k++)
  {
    byte writeByte = writeData[k];
    for(int i = 0; i<8;i++)
    {  
      digitalWrite(PIN_SDA, writeByte >> 7);
      writeByte = writeByte << 1;
      digitalWrite(PIN_SCL, HIGH);
      delay(5);
      digitalWrite(PIN_SCL, LOW);
      delay(5);
    }
    delay(5);
  }
  pinMode(PIN_SDA, INPUT_PULLUP);

  //Read data
  for(int k = 0; k<4;k++)
  {
    byte readData = 0;
    for(int i = 0; i<8;i++)
    {
      readData = readData << 1;
      digitalWrite(PIN_SCL, HIGH);
      
      delay(5);
      readData|= digitalRead(PIN_SDA);
      digitalWrite(PIN_SCL, LOW);
      delay(5);
    }
    Serial.print("READ: 0x");
    Serial.println(readData, HEX);
    
  }
  pinMode(PIN_SCL, INPUT_PULLUP);

}