/*
I2C scan and Hall sensors Occupied detection test
JMA 17.5.2026 - zřejmě konečná fungující verze - ! odzkoušet !
pokud jsou dir_s i dir_l v "H" pak po hall_s nebo hall_l zustane occup nahozeno - o.k.
pokud jsou dir_s i dir_l v "L" pak fl_s fl_l schazuji occup - o.k
v s imulaci trva loop cca 3 msec - v tom je asi i Serial.print....
*/
#include "Arduino.h"
#include "PCF8575.h"
// Set i2c address
PCF8575 pcf8575_20(0x20);
PCF8575 PCF_Hall_s(0x21); //HALL_S
PCF8575 PCF_Hall_l(0x22); //HALL_L
PCF8575 PCF_dir_s(0x23); //DIR_S
PCF8575 PCF_dir_l(0x24); //DIR_L
PCF8575 PCF_OCCUP(0x25); //OCCUP
uint16_t hall_s;
uint16_t hall_l;
uint16_t dir_s;
uint16_t dir_l;
uint16_t o_hall_s;
uint16_t o_hall_l;
uint16_t fl_s;
uint16_t fl_l;
uint16_t o_occup;
uint16_t OCCUP = 0xFFFF; // on RESET init
uint16_t O_OCC;
void setup()
{
Serial.begin(9600);
Wire.begin();
Serial.println("\nHALL Test\n");
int nDevices;
int address;
int error;
Serial.println("I2C Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.print("I2C scan done\n");
pcf8575_20.begin();
PCF_Hall_s.begin();
PCF_Hall_l.begin();
PCF_dir_s.begin();
PCF_dir_l.begin();
PCF_OCCUP.begin();
}
PCF_OCCUP.write16(~OCCUP); // on RESET init
Serial.println("Setup completed");
//delay(5000);
Serial.println("\n... main loop continued ...\n");
}
void loop()
{
delay(50);
// Serial.println(millis());
hall_s = ~PCF_Hall_s.read16();
hall_l = ~PCF_Hall_l.read16();
dir_s = ~PCF_dir_s.read16();
dir_l = ~PCF_dir_l.read16();
/*
Serial.println("hall_s / o_hall_s");
Serial.println(hall_s,BIN);
Serial.println(o_hall_s,BIN);
Serial.println("hall_l / o_hall_l");
Serial.println(hall_l,BIN);
Serial.println(o_hall_l,BIN);
*/
fl_s = (hall_s ^ o_hall_s) & ~hall_s & dir_s;
fl_l = (hall_l ^ o_hall_l) & ~hall_l & dir_l;
o_hall_s = hall_s;
o_hall_l = hall_l;
/* Serial.println("fl_s / fll_l");
Serial.println(fl_s,BIN);
Serial.println(fl_l,BIN);
*/
// o_occup = (o_occup & ~(o_occup & fl_s)); // pro l to asi funguje
o_occup = (o_occup & (~(o_occup & fl_s) & ~(o_occup & fl_l)));
o_occup = o_occup | (hall_s | hall_l);
/*
Serial.println("occup");
Serial.println(o_occup,BIN);
Serial.println("");
*/
OCCUP = ~o_occup;
if(OCCUP != O_OCC) {
PCF_OCCUP.write16(OCCUP);
O_OCC = OCCUP;
}
// Serial.println(millis());
delay(500);
}