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.

21 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)

Leave a Reply

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