Files
Michael Wesemann cdee95be6e interlock0.ino fixes
2026-03-27 11:27:44 +01:00

216 lines
8.2 KiB
Arduino

// ================================================================== interlock, first arduino, interlock master
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#define PIN 53 // NeoPixel Pin
#define PIX 51 // number of pixel
#define SWMIN 23 // switch
#define SWMAX 49
#define HBMIN 8 // heartbeat
#define HBMAX 32
#define RESET 51 // reset pin
#define MS (long)millis()
long comtimer;
Adafruit_NeoPixel pixels(PIX, PIN, NEO_GRB + NEO_KHZ800);
int input_values[32];
///////////////// 03.02.2026 Milena changed relais LED's and relais inverted -> original one above in comments
// Relais Number: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//int RP[16] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 14, 15, 16, 17}; // relais pins
//int RL[16] = { 11, 10, 9, 8, 6, 5, 4, 3, 2, 15, 99, 22, 21, 20, 19, 7}; // relais LED's
//int RI[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0}; // relais inverted
///////////////// 03.02.2026 Milena changed relais LED's and relais inverted -> original one above in comments
// Relais Number: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int RP[16] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 14, 15, 16, 17}; // relais pins
int RL[16] = { 11, 10, 9, 8, 6, 5, 4, 3, 2, 1, 15, 22, 21, 20, 19, 7}; // relais LED's
int RI[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0}; // relais inverted
int bright_control;
int bright_increment;
long bright_timer;
int input_ok;
int startup;
typedef struct {
int input;
int input_LED;
int relais[16];
int relais_anzahl;
int relais_LED[16];
int overwrite_switch;
} langDictionary;
const langDictionary D[] {
// input LED relais n relais LED overwrite (Pin des Uberschreibungsschalters)
{22, 46, {}, 0, {}, 45},
{23, 42, {2}, 1, {9}, 41},
{24, 43, {1}, 1, {10}, 42},
{25, 44, {0}, 1, {11}, 43},
{26, 33, {14}, 1, {19}, 32},
{27, 34, {12,13,15}, 3, {21,20,7}, 33},
{28, 35, {12,13,15}, 3, {21,20,7}, 34},
{29, 36, {12,13,15}, 3, {21,20,7}, 35},
{30, 37, {12,13}, 2, {21,20}, 36},
{31, 38, {11}, 1, {22}, 37},
{32, 39, {3,11}, 2, {8,22}, 38},
{33, 47, {5,6,7,8,9,10,12,13,14}, 9, {5,4,3,2,1,15,21,20,19}, 46},
{34, 48, {5,6,7,8,9,10,12,13}, 8, {5,4,3,2,1,15,21,20}, 47},
{35, 49, {11}, 1, {22}, 48},
{36, 50, {4,5,6,7,8,9,10,11}, 8, {6,5,4,3,2,1,15,22}, 49},
{37, 29, {3,11}, 2, {8,22}, 28},
{38, 30, {2,3,12,13,15}, 5, {9,8,21,20,7}, 29},
{39, 31, {0,1,3,12,13}, 5, {11,10,8,21,20}, 30},
{40, 32, {0,1,3,11}, 4, {11,10,8,22}, 31},
{41, 23, {14,15}, 2, {19,7}, 23},
{42, 24, {12,13}, 2, {21,20}, 24},
{43, 25, {12,13,15}, 3, {21,20, 7}, 25},
{44, 26, {}, 0, {}, 26},
{45, 27, {11}, 1, {22}, 27},
{46, 45, {4,5,6,7,8,9,10,12,13,14,15}, 11, {6,5,4,3,2,1,15,21,20,19,7}, 44}
};
void setup() { // ---------------------------------------------------------------------------------------- setup
Wire.begin();
// Serial.begin(9600);
startup=1;
bright_control = HBMIN;
bright_increment = 1;
bright_timer=MS;
pinMode(RESET, INPUT_PULLUP);
for (int i = SWMIN; i < SWMAX; i++) pinMode(i, INPUT_PULLUP);
pixels.begin();
for(int i = 0; i < PIX; i++) pixels.setPixelColor(i, pixels.Color(0,0,0));
pixels.show();
for (int i = 0; i < 16; i++){
pinMode(RP[i], OUTPUT);
// digitalWrite(RP[i], HIGH ^ RI[i]);
// pixels.setPixelColor(RL[i], pixels.Color(0,60,0));
digitalWrite(RP[i], LOW | RI[i]);
pixels.setPixelColor(RL[i], pixels.Color(60,0,0));
}
delay(3000);
input_ok=0;
}
void loop() { // ------------------------------------------------------------------------------------- main loop
if (!digitalRead(RESET)) { // process reset
get_inputs();
int rmem[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for (int i = 0; i < 25; i++) {
int overwrite = !digitalRead(D[i].overwrite_switch);
if(!overwrite){
if(input_values[i] == 0) for (int j = 0; j < D[i].relais_anzahl; j++) rmem[D[i].relais[j]]++;
}
}
for (int i = 0; i < 25; i++) {
int overwrite = !digitalRead(D[i].overwrite_switch);
if(overwrite){
for (int j = 0; j < D[i].relais_anzahl; j++){
if (rmem[D[i].relais[j]]==0) {
digitalWrite(RP[D[i].relais[j]], HIGH ^ RI[D[i].relais[j]] );
pixels.setPixelColor(D[i].relais_LED[j], pixels.Color(0,60,0));
}
}
}
}
}
if(MS-comtimer>500) { // main process
get_inputs();
for (int i = 0; i < 25; i++) {
int overwrite = !digitalRead(D[i].overwrite_switch);
if(overwrite){
pixels.setPixelColor(D[i].input_LED, pixels.Color(0,0,10));
} else {
pixels.setPixelColor(D[i].input_LED, pixels.Color(0,60,0));
if(input_values[i] == 0){
pixels.setPixelColor(D[i].input_LED, pixels.Color(60,0,0));
for (int j = 0; j < D[i].relais_anzahl; j++){
digitalWrite(RP[D[i].relais[j]], LOW | RI[D[i].relais[j]] );
pixels.setPixelColor(D[i].relais_LED[j], pixels.Color(60,0,0));
}
}
}
}
pixels.show();
comtimer=MS;
}
if(MS-bright_timer>50){ // heartbeat
bright_control+=bright_increment;
if (bright_control>=HBMAX || bright_control<=HBMIN) bright_increment = -bright_increment;
if (input_ok) {
pixels.setPixelColor(28, pixels.Color(0,bright_control*2,bright_control/2));
} else {
pixels.setPixelColor(28, pixels.Color(bright_control*2,0,0));
}
pixels.show();
bright_timer=MS;
}
}
void get_inputs() { // ---------------------------------------------------------- get inputs from second arduino
Wire.beginTransmission(0x55);
Wire.write(0);
Wire.endTransmission();
delay(200);
Wire.requestFrom(0x55, 4);
int allbytes[4];
input_ok=0;
if (Wire.available()==4){
for (int i = 0; i < 4; i++){
allbytes[i] = Wire.read();
for (int j = 0; j < 8; j++){
int b = bitRead(allbytes[i], j);
input_values[i*8+j] = b;
}
}
input_ok=1;
}
}
// ===================================================================================================== SUPPORT
void pf(const char* format, ...) {
char buffer[128];
va_list args;
va_start(args, format);
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
Serial.print(buffer);
}
// ========================================================================================================= END