ArduinoIHC

ArduinoIHC er et library til arduino som implementerer IHC protokollen for in- og output moduler. Output modulet har desuden support for temperatur/fugtighedsføler protokollen. Kan også kører på ESP8266 dog med den begrænsning at der kun kan anvendes 1 input.

Først læs ansvarsfraskrivelse – Så hvis du futter din IHC controller af eller din hund springer i luften, så er det dit ansvar.

See this new post for download

IHCoutput klassen implemeterer et IHC output på en port. Den initialiseres med Begin( port) – hvor port er den arduino port som du vil have output på. Efterfølgelde kan du styrer output med Set( channel,int state) f.eks Set( 2,HIGH) vil sætte ihc indgang 3  høj. (Bemærk at channel starter med 0 så det svarer til ihc indgang 1 – fordi ihc indgange starter med 1) Der er 16 outputs – fordi et IHC input modul har 16 indgange.

IHCinput klassen implementerer et IHC input modul. Den initialiseres med Begin( port) – hvor port er den arduino port som du vil have input på. IHCinput har kun 8 indgange fordi et IHC output module kun har 8 udgange. Til at teste om en indgang er høj eller lav brugers GetData( channel), eller man kan bruge GetInput() til at få state på alle indgange. GetInput returnerer en byte med en bit pr indgang.  Til at test for ændringer bruges GetChangeMask() den returnerer en byte med en bit sat for de indgange der er ændret siden sidst.

IHCtemperature klassen implementerer en temperatur/fugtighedsføler på en udgang på et IHCoutput

Optimeringer til at minimere kodestørelse

For at minimerer kode størrelsen er der forskellige defines som vil fjerne kode hvis du ikke skal bruge det.

#define IHCINPUT_NO_MULTIPORTSUPPORT

Fjerner support for mere end en IHCinput port.

#define IHC_NOTEMPERATURE

Fjerner temperatur support

#define IHCINPUT_NO_CALLBACK

Fjerner support for at overskrive OnChange IHCinput som bliver kaldt direkte fra interrupt når input ændres.

Timing

For at IHCoutput kan virker anvendes timer2 fra arduino og timer1 på ESP8266. D.v.s. du skal være opmærksom på om du anvender andre libraries som også bruger disse timere. Hvis det er tilfældet vil de ikke virke sammen. Timer interrupt køre med 8kHz.

Her ken du se timingen fra en et output på en arduino:

Arduino timing

 

 

og den tilsvarende på en ESP8266-12

ESP8266 IHC timing

Som det kan ses ligger det meget tæt på timingen fra et orginalt IHC modul.

Forbindelse til IHC controller

Arduino in-og output at alm TTL nivuea så du kan godt forbinde direkte til IHC controlleren. Hvis du ønsker elektrisk adskillelse imellem de to så kan du sætte en optokobler imellem. I den forbindelse skal du være opmærksom på at IHC data input ikke har pullup til høj ligesom en indgang har på et IHC indgangs modul. Så hvis du bruger en optokobler skal du sætte en pullup modstand på. Selv bruger jeg en 1K modstand bare for en sikkerhedskyld i tilfælde af at man kommer til at sætte to udgange sammen.

44 responses to “ArduinoIHC”

  1. Rudi Hilven says:

    Hi,
    i’m from Belgium and i would like to use IHC input to read 2 inputs.
    do you have example code?

    my code display’s only the last initialised input (pin 5).

    my code:

    #define IHC_USEPINCHANGEINT
    #include
    #include

    IHCinput input1;
    IHCinput input2;

    void setup() {
    Serial.begin(9600);
    input1.Begin(4);
    input2.Begin(5);
    }

    void loop() {
    Serial.print(“inp1: “);
    Serial.print(input1.GetInput());
    Serial.print(” inp2: “);
    Serial.println(input2.GetInput());
    }

    thanks in advance
    Rudi

  2. Jens says:

    For multiple inputs to work, the library need to use the “PinChangeInt” library. Something must have changed in the way the Arduino IDE builds the project since it was made originally. (Several arduino versions ago). You have #define IHC_USEPINCHANGEINT in the top and that should work, but it looks like this define is not being used when compiling the IHCInput files. If you insert the line

    #define IHC_USEPINCHANGEINT

    in the top of the 2 files IHCinput.h and IHCinput.cpp and also comment out the

    #include “pcint.h”

    in IHCinput.cpp – then it should work. I have just verified it with Arduino 1.8.1

    Personally I use Visual Studio with Visual Micro – here you can make defines globally on the properties for the ino file.

  3. Rudi Hilven says:

    i think you mean comment out pcint.h in IHCinp.ccp (text is gone in message above)
    i did the suggested adjustments and everything works great

    thanks very much!!!

  4. Morten says:

    Thank you so much for publishing this! Will make it much easier for the rest of us to get started.

    Can you elaborate on why the library is limited to 1 input on ESP8266?

    I know the PinChangeInt library does not work on ESP8266, but it seems the reason is logical – ESP8266 supports change interupt in hardware on all GPIO’s except GPIO16. It would be interesting to know if you had persued or thought about an implementation without any interrupt handling library but just using the basic EnableInterrupt function in the Arduino environment.

    • Jens says:

      It is because I made is so there is only one function handling the interrupts for whatever pin you choose to use. And the same function is use by all IHCinput objects. The PinChangeInt library keep track of the pin triggering the interrupt, I use this to find the associated IHCinput object. It is possible to make it with a big switch statement and a separate function for each pin. Originally I only used it on Arduino, the ESP8266 was later and I have not needed more than one input yet.

      I think the EnableInterrupt function is also from a library (unless is has changed lately). The standard arduino library has the attachInterrupt function, but this is limited to pin 2 or 3 on the ATMega328 based ardunio’s.

      It would be nice to avoid any dependencies on other libraries. I will think about it when I make the next version of the ArduinoIHC Librabry.

  5. Jan Ballegaard says:

    Jeg er lidt i tvivl om hvordan Arduino og IHC skal kobles sammen. Hvilke forbindelser skal tilsluttes?
    Findes der et diagram over hvordan optokobler kan forbinde de to enheder?
    Kræver det speciel programmering af IHC?
    Da jeg kun har mit “live” system at udvikle på, vil jeg gerne være helt sikker på hvad jeg gør.
    Håber du kan hjælpe så jeg kan komme i gang med at kode.

  6. Jan says:

    Hej, kan ikke få den til at compile dit eksempel, hvad gør jeg galt 🙂

    Den skriver:
    C:\Users\Jan\ArduinoIHC\Examples\Temperature\Temperature.ino:22:23: fatal error: IHCoutput.h: No such file or directory

    #include

    Har lagt IHCoutput i samme bibliotek.

    Mvh. Jan

  7. Jan says:

    Jan igen…

    Hvis jeg prøver a tilføje filerne manualt, skriver den:

    “IHCoutput.h” contains unrecognized characters. If this code was created with an older version of Arduino, you may need to use Tools -> Fix Encoding & Reload to update the sketch to use UTF-8 encoding. If not, you may need to delete the bad characters to get rid of this warning.

    Bruger Arduino 1.8.3

    Mvh Jan

    • Jens says:

      ArduinoIHC folderen skal ligge i din arduino libraries folder – typisk Dokumenter\Arduino\Libraries på windows.
      Den nemeste måde er fra arduino ide i menuen at vælge sketch|Include Library|Add Zip library og så vælge ArduinoIHC zip filen – så bliver den pakket ud det rigtigt sted. Herefter kan du åbne eksempler fra fil|Eksempler|ArduinoIHC…

      Jeg prøvede lige på Arduino Ide 1.8.1 det virkede fint – derefter opdaterede jeg til nyeste 1.8.4 og det virker også.

  8. Jan says:

    Er det muligt at lade Arduino simulere en enkelt temperatur føler? Altså kunne forbinde arduino til en enkelt indgang på et 24v input modul og lade ihc controlleren se arduino som en temperatur sensor?

    • Jens says:

      ArduinoIHC virker ved at simulere in/out moduler som du så ovenpå kan simulere en temperatur indgang på. D.v.s Arduino forbindes til data in og out-put.

      Det vil være muligt at lave lidt om så du ikke bruger IHCoutput, men istedet laver temperatur protokollen direkte til en arduino output pin der kan forfindes til et 24v input modul.

      Kig på koden i IHCtemperature.cpp – der ligger implementering af temperatur protokollen. Eller kig på det indlæg jeg har skrevet før om IHC temperatur protokolen. Det mest vanskelige er at få checksummen korrekt.

  9. Sten says:

    Hej Jens!
    Interface med optocoupleren, du har tegnet,
    kan jeg ikke få til at virke.
    Med modstanden, virker det korrekt.
    Bliver signalet ikke inverteret, når det sendes
    til IHC?
    Jeg har sat en zenerdiode, på 5,1 volt, mellem
    emitter og kolektor, på optocoupleren.
    På indgangen (led +) er der sat en modstand på 1k til Arduino vcc
    og (led -) går til Arduino Gnd.
    Jeg har sat en NPN transistor (BC 547) mellem kolektor og(led +)
    Emitteren er sat til (led -)
    Basen på transistoren, er forsynes med en 4K7 modstand til
    Arduinoen (IHC Output Library)

    Det virker.

    Det er fine library’s du har lavet.

    mvh. Sten

  10. Henrik Andersen says:

    Hi

    det virker interessant men jeg vil gerne have en ide til hvordan jeg kan bruge disse funktioner.

    eventuelt se et setup / diagram og høre hvordan det virker.

    én simpel kode så jeg er sikker på at jeg få et billede af hvordan det virker.

    • Jens says:

      Der er eksempler til både input og output samt temperatur – så kig på dem. Brug 1K modstand imellem in- og out-put det er det nemmeste. Det her er et værktøj til at forbinde et-eller-andet til IHC ikke en komplet løsning. Det er op til dig hvad du vil lave med det.

  11. Henrik Andersen says:

    Er det tænkt lidt således?

    http://line-web.dk/IHC/Arduino_IHC_MainDiagram.png

    • Jens says:

      Nej det var ikke tænkt sådan. Det er tænk som forbindelse imellem arduino og ihc controlleren, enten data ind eller udgang.
      Du har tegnet det som om arduino skal erstatte ihc controlleren og styre et IHC output eller input modul. Det kan sikkert også virke D.v.s. arduino laver så det data signal som ihc controlleren normalt ville gøre – jeg ved ikke lige hvorfor eller hvad det skal bruges til.
      (På din tegning vender dioden i optokobleren desuden forkert – katoden skal til gnd)

  12. Carsten Madsen says:

    Hej.

    Er det muligt at bruge din kode til at sætte en temperatur i IHC’en fra en Arduino via et input modul?

  13. Johnny says:

    Jeg vil gerne modtage nogle signaler fra IHC systemet. Jeg har i IHC Visual definere et datalinje modul på dataLinje 15 og 4 udgange på datalinje 15.1, 15.2, 15.3 & 15.4.
    Jeg trækker udgangene fra IHC programmet.
    Jeg har nu forbundet en Arduino Nano (Rx/Tx) til udgang 15 på IHC Visual.
    Er det forstået korrekt at Arduinoen kan fungere som IO modul? Og, vil jeg med kode kunne læse hvilken udgang IHC’en ønsker at trække på IO-modulet.
    Hvis ja, hvilken kommando kan jeg bruge getOutput(). hvis ja, hvad returnerer den så? bool/byte? Hvis nej, hvilken kommando er det så?

    #include
    bool out1;
    void setup(){
    IHCoutput output1;
    ihcoutput.Begin(15);
    Serial.begin(115200);
    }
    void loop(){
    out1 = output1.getOutput(1);
    }

    Er der lavet en manual med mulige kommandoer og evt. eksempler.

    • Jens says:

      Der ligger en examples folder samme med arduinoihclib (kig på BasicInput.ino – det svarer til dit eget eksempel forbind gpio 2 til IHC udgang 15 – og en god ide med en 1k modstand imellem i tilfælde af at du får arduino sat i output mode).
      IHCoutput er til at lave output fra arduino til en indgang på IHC. Du bruger “SetOutput” til at sætte alle på en gang eller Set(int channel, int state) (state er 0 eller 1) til at sætte en enkelt udgang.
      IHCinput er til at lave input til arduino fra en udgang på IHC. Det skal være en GPIO pin på arduino som lave interrupt – brug pin 2. GetInput giver alle input (en bit pr input), GetData( int channel) for et enkelt input.

  14. Bart M. says:

    Hi, greeting from Belgium.
    I need to convert an existing installation with a PLC. I was thinking to us an arduino to create a modbus IHC converter. Any tips for this?
    How many modules should I connect to an arduino?

    • Jens says:

      I have no experince with PLC and modbus. You can probably use the arduinolib to make the IHC part of your converter.

      • Bart M. says:

        I have a implementation of Modbus, arduino and PLC. This works fine. Linking the libs would not be a problem.
        How many IHC input or output modules should I connect to one Arduino?

        • Jens says:

          I have only tried with one input and one output, but having mode outputs should not be a problem. The input can be a problem because you need to have an interrupt in the gpio pin you use.

  15. Kenth Jensen says:

    Super spændende projekt.
    Havde selv gået med næsten samme idé.
    Roder selv rigtig meget med en Raspberry Pi til home automation, og bruger også denne til IHC output modul, men timingen i denne gør at den ikke kan bruges til input modul.

    Har netop bestilt en Arduino Uno hvor jeg så vil flytte hele IHC delen over på, for at få frigivet noget resourcer fra Raspberry Pien, og måske prøve at få Raspberry Pien og Arduinoen til at snakke sammen via I2C.

    Super fedst at du har lavet dette library, så sparer jeg mange dages arbejde ved ikke at skulle lave det helt fra bunden af, så mange tak for det.

    Er det teknisk muligt både at køre et input modul og 2 output moduler samtidig med din kode?

    På forhånd tak

    • Jens says:

      Det burde være muligt med 1 input og 2 output – det er dog ikke noget jeg har prøvet (I den forbindelse mener jeg input til arduino – d.v.s. ind i arduino). Problemet er flere input er at der skal bruges en arduino gpio indgang som kan lave interrupt ved ændring, og afhængig af arduino model er der begrænsninger.

      • Kenth Jensen says:

        Perfekt.

        Er dog løbet ind i lidt problemer, er desværre fuldstændig ny indenfor Arduino verdenen.

        Hvis jeg åbner BasicInput eksemplet og prøver at compilere, får jeg følgende fejl:
        PinChangeInt.h: No such file or directory

        Jeg har derefter gået til Library Manager og installeret PinChangeInterrupt biblioteket.

        Derefter fik jeg fejlen at den ikke kunne finde PinChangeInt.h, fandt filen og opdaget at den var omdøbt til PinChangeInterrupt.h, rettede include linien i IHCInput.cpp til at referere til PinChangeInterrupt.h i stedet.

        Nu får jeg fejl som ‘PCintPort’ has not been declared, dette har jeg ikke lige kunne hacke mig frem til.

        Hvis jeg bruger Visual studio får jeg også en masse fejl som disse ‘TCCR2A’ was not declared in this scope

        Sætter stor pris på hvis du har lidt tid til at kigge på dette

        På forhånd tusind tak

        • Kenth Jensen says:

          Jeg tror jeg har fået løst ovenstående problem, men er blot nået frem til et nyt problem, som højst sandsynligt skyldes uvidenhed med hvordan man bruger events

          Mit kode ser ca sådan her ud

          IHCinput ihcInput1;

          void setup()
          {
          ihcInput1.Begin(2); // Connected to Output 2 on IHC controller
          ihcInput1.OnChange(onChangeIhc1); // Forsøg på at definere en eventhandler
          }

          void onChangeIhc1(byte changemask, byte data) // eventhandler
          {

          }

          Jeg får nedenstående fejl ved compilering:
          IHCInput.h:73: note candidate expects 2 arguments, 1 provided

          • Jens says:

            Du kan lave din egen klasse nedarvet fra IHCinput og overskrive OnChange funktionen (den er virtuel). Vær opmærksom på OnChange bliver kaldt dirkte fra interrupt så du ikke må lave ret meget. (Det skal gå hurtigt og f.eks serial.print el. lign vil ikke virke).
            Det bedste er a polle i loop funktionen og bruge GetChangeMask til at se om der er ændringer.

          • Kenth Jensen says:

            Synes lige jeg skylder en tilbagemelding her.

            Med din hjælp er det lykkedes at få det hele op at køre, så nu bruger jeg Arduino’en som 2 IHC outputmoduler og 1 IHC inputmodul.
            Desuden er Arduinoen forbundet til min Raspberry Pi via I2C, så nu kan jeg sende ialt 16 bits både frem og tilbage mellem min Raspberry Pi og mit IHC.

            En kæmpe stor tak skal lyde for at stille dette library til rådighed kvit og frit.

          • Lars says:

            Hvordan løste du problemet med PCintPort?

          • Kristof Aerts says:

            Hi Kenth, could you share your code for the 16 bits return solution? I’m only retrieving the 8 bits currently.

  16. Kristof says:

    Is there a way to use this library to communicate directly with the IHC output module. Triggering the relays?

    • Jens says:

      If you mean connecting an arduino/esp8266 directly to an IHC output module – yes I guess that it is possible, since it is the same signal. But i don’t understand why you would want to do that.

      • Kristof says:

        Well, the thing is, I have the IHC controller set up now for approx. 10 years. My whole domotica (light controls,etc) is dependant on the controller. Not a problem just yet however, I believe Schneider Electric stopped producing the controller. I’m afraid that in 5 years or so, I can’t get a replacement controller if mine breaks down, rendering all my input and output modules useless. That is the reason i’m searching for a way to communicate with my input output modules without the controller. The ultimate goal would be a raspberry pi with home assistant, mqtt host and direct (or via arduinoihc) communication to the modules.

        • Jens says:

          The newest IHC controller was relased about 1-2 years ago I think, and it is compatible with the older versions, so you can replace your existing controller. But I get your idea. I assume you don’t have any IHC wireless devices, because that is probably not going to be easy to replace.

    • Flemming L says:

      Hello Kristof
      Did you do any experiments to replace the controller by an Arduino. I have an SMS module connected to an output module (to control heating), and I would like to be able to change the outputs without sending text messages. A controller is rather expensive for this use, and hence I would like to use the Arduino as a controller.

  17. Lars says:

    I’m a newbie to this but this library really will help me!

    I’m having some difficulties compiling the IHC library as the PinChangeInt library apparently has to be replace by the new PinChangeInterrupt.
    Compiling the codes gives two error of which PCintPort::arduinoPin is one of them.

    Does anyone know how to fix this problem?

Leave a Reply

Your email address will not be published. Required fields are marked *