216 lines
8.2 KiB
Arduino
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
|