diff --git a/compile_flags.txt b/compile_flags.txt index fba2b46..4e0c1cc 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -1,18 +1,18 @@ --D -__AVR_ATmega2560__ --D -F_CPU=16000000UL --D -_WIZCHIP_=W5100 --I -/usr/lib/avr/include --I -Internet --I -Internet/MQTT --I -Internet/MQTT/MQTTPacket/src --I -Ethernet --I -Ethernet/W5500 +-D +__AVR_ATmega2560__ +-D +F_CPU=16000000UL +-D +_WIZCHIP_=W5100 +-I +/usr/lib/avr/include +-I +Internet +-I +Internet/MQTT +-I +Internet/MQTT/MQTTPacket/src +-I +Ethernet +-I +Ethernet/W5500 diff --git a/main.c b/main.c index 0e1f4ca..9d20b91 100644 --- a/main.c +++ b/main.c @@ -1,345 +1,345 @@ -#include -#include -#include // WatchDog -#include - -#include "Ethernet/socket.h" -#include "Ethernet/wizchip_conf.h" - -#include "Internet/MQTT/mqtt_interface.h" -#include "Internet/MQTT/MQTTClient.h" - -#include "avrIOhelper/io-helper.h" -#include "millis.h" -#include "uart.h" -#include "spi.h" -#include "mqtt.h" - -#include "util/delay.h" - -#define PLC_MQTT_ENABLED 1 - -Client mqtt_client; - -//***********Prologue for fast WDT disable & and save reason of reset/power-up: BEGIN -uint8_t mcucsr_mirror __attribute__ ((section (".noinit"))); - -// This is for fast WDT disable & and save reason of reset/power-up -void get_mcusr(void) \ - __attribute__((naked)) \ - __attribute__((section(".init3"))); -void get_mcusr(void) -{ - mcucsr_mirror = MCUSR; - MCUSR = 0; - wdt_disable(); -} -//***********Prologue for fast WDT disable & and save reason of reset/power-up: END - - -//FUNC headers -static void avr_init(void); -void timer0_init(void); -void print_network_information(void); - -void IO_LIBRARY_Init(void) { - uint8_t bufSize[] = {2, 2, 2, 2, 2, 2, 2, 2}; - - reg_wizchip_cs_cbfunc(spi_select, spi_deselect); - reg_wizchip_spi_cbfunc(spi_read, spi_write); - //reg_wizchip_spiburst_cbfunc(spi_rb_burst, spi_wb_burst); - - wizchip_init(bufSize, bufSize); - wizchip_setnetinfo(&netInfo); - //wizchip_setinterruptmask(IK_SOCK_0); -} - -#define STEP_SIZE 5 -#define TOP_VALUE 40 -void do_luefter(){ - static uint8_t fan_value = TOP_VALUE*0.5; - static uint8_t fan_state = 0; - - - if(!read_Input(IN_ANLAGE_EIN, LEVEL)){ - fan_state = 0; - ioHelperSetBit(outStates, LED_LUEFTER, 0); - } - else{ - if (read_Input(BTN_LUEFTER_EIN, RISING)) { -#if PLC_MQTT_ENABLED - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Luefter", "ein", 3); -#endif - OCR3B = TOP_VALUE/2; - fan_state = 1; - ioHelperSetBit(outStates, LED_LUEFTER, 1); - } - - if (read_Input(BTN_LUEFTER_AUS, RISING)) { -#if PLC_MQTT_ENABLED - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Luefter", "aus", 3); -#endif - fan_state = 0; - ioHelperSetBit(outStates, LED_LUEFTER, 0); - } - - if (read_Input(BTN_LUEFTER_PLUS, RISING) && (fan_value+STEP_SIZE <= TOP_VALUE)) { - fan_value += STEP_SIZE; -#if PLC_MQTT_ENABLED - char _msg[3]; - sprintf(_msg, "%d", fan_value * 100 / 40); - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/LuefterSpeed", _msg, 3); -#endif - printf("luefter %d\n\r", fan_value); - } - - if (read_Input(BTN_LUEFTER_MINUS, RISING) && (fan_value-STEP_SIZE >= STEP_SIZE)) { - fan_value -= STEP_SIZE; -#if PLC_MQTT_ENABLED - char _msg[3]; - sprintf(_msg, "%d", fan_value * 100 / 40); - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/LuefterSpeed", _msg, 3); -#endif - printf("luefter %d\n\r", fan_value); - } - } - - if(fan_state) - OCR3B = fan_value; - else - OCR3B = 0; -} - -void do_zumbach(){ - - if (read_Input(BTN_ZUMBACH_EIN, RISING) && read_Input(IN_ANLAGE_EIN, LEVEL)) { - ioHelperSetBit(outStates, SCHUETZ_ZUMBACH, 1); - ioHelperSetBit(outStates, LED_ZUMBACH, 1); -#if PLC_MQTT_ENABLED - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Zumbach", "ein", 3); -#endif - } - - if (read_Input(BTN_ZUMBACH_AUS, RISING) || read_Input(IN_ANLAGE_EIN, FALLING)) { - ioHelperSetBit(outStates, SCHUETZ_ZUMBACH, 0); - ioHelperSetBit(outStates, LED_ZUMBACH, 0); -#if PLC_MQTT_ENABLED - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Zumbach", "aus", 3); -#endif - } -} - -void do_notaus(){ - if(read_Input(IN_NOTAUS_ANLAGE, LEVEL) || read_Input(IN_NOTAUS_SCHRANK, LEVEL)){ // NOTAUS - set_Output(LED_GRN_NOTAUS_SCHRANK, OFF); // disable green lamps - set_Output(LED_GRN_NOTAUS_ANLAGE, OFF); - } - - if(read_Input(IN_NOTAUS_ANLAGE, LEVEL) && read_Input(IN_NOTAUS_SCHRANK, LEVEL)){ // both activated - set_Output(LED_ROT_NOTAUS_ANLAGE, BLINK); - set_Output(LED_ROT_NOTAUS_SCHRANK, BLINK); - } - else if(read_Input(IN_NOTAUS_ANLAGE, LEVEL)){ // top one activated - set_Output(LED_ROT_NOTAUS_ANLAGE, BLINK); - set_Output(LED_ROT_NOTAUS_SCHRANK, ON); - } - else if(read_Input(IN_NOTAUS_SCHRANK, LEVEL)){ // bottom one activated - set_Output(LED_ROT_NOTAUS_SCHRANK, BLINK); - set_Output(LED_ROT_NOTAUS_ANLAGE, ON); - } - else{ // none activated - set_Output(LED_ROT_NOTAUS_SCHRANK, OFF); - set_Output(LED_ROT_NOTAUS_ANLAGE, OFF); - if(read_Input(IN_ANLAGE_EIN, LEVEL)){ - set_Output(LED_GRN_NOTAUS_ANLAGE, ON); - set_Output(LED_GRN_NOTAUS_SCHRANK, ON); - } - else{ - set_Output(LED_GRN_NOTAUS_ANLAGE, ON); - set_Output(LED_GRN_NOTAUS_SCHRANK, ON); - set_Output(LED_ROT_NOTAUS_ANLAGE, ON); - set_Output(LED_ROT_NOTAUS_SCHRANK, ON); - } - } -} - -int main() -{ - // INIT MCU - avr_init(); - spi_init(); //SPI Master, MODE0, 4Mhz(DIV4), CS_PB.3=HIGH - suitable for WIZNET 5x00(1/2/5) - //spi_speed_tst(); / Here on SPI pins: MOSI 400Khz freq out, on SCLK 3.2MhzOUT (Witk SPI CLK 4Mhz) - - ioHelperInitBuffer(); - ioHelperIoConf(); - - //Wizchip WIZ5500 Ethernet initialize - IO_LIBRARY_Init(); //After that ping must working - print_network_information(); - -#if PLC_MQTT_ENABLED - //****************MQTT client initialize - //Find MQTT broker and connect with it - uint8_t mqtt_buf[100]; - int32_t mqtt_rc = 0; - Network mqtt_network; - mqtt_network.my_socket = SOCK_MQTT; - - printf(">>Trying connect to MQTT broker: %d.%d.%d.%d ..\r\n", MQTT_targetIP[0], MQTT_targetIP[1], MQTT_targetIP[2], MQTT_targetIP[3]); - NewNetwork(&mqtt_network); - ConnectNetwork(&mqtt_network, MQTT_targetIP, 1883); - MQTTClient(&mqtt_client, &mqtt_network, 1000, mqtt_buf, 100, mqtt_readBuffer, MQTT_BUFFER_SIZE); - - //Connection to MQTT broker - MQTTPacket_connectData data = MQTTPacket_connectData_initializer; - data.willFlag = 0; - data.MQTTVersion = 4;//3; - data.clientID.cstring = (char*)"controllino_messmodul"; - data.username.cstring = (char*)"Messmodul"; - data.password.cstring = (char*)"\0"; - data.keepAliveInterval = 10; - data.cleansession = 1; - mqtt_rc = MQTTConnect(&mqtt_client, &data); - if (mqtt_rc == SUCCESSS) - { - printf("++MQTT Connected SUCCESS: %ld\r\n", mqtt_rc); - } - else - { - printf("--MQTT Connected ERROR: %ld\r\n", mqtt_rc); - //while(1); //Reboot the board - } - - // Subscribe to all topics - char SubString[] = "/Filamentanlage/04_Messmodul/set/#"; - mqtt_rc = MQTTSubscribe(&mqtt_client, SubString, QOS0, messageArrived); - printf("Subscribed (%s) %ld\r\n", SubString, mqtt_rc); -#endif - - - ioHelperSetBit(outStatesBlinking, LED_PLC_OK, 1); - - uint32_t timer_blink_outs = millis(); - uint32_t timer_send_uptime = millis(); - - OCR3B = 127; - -#if PLC_MQTT_ENABLED - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Luefter", "aus", 3); -#endif - - while(1) - { - wdt_reset(); // WDT reset at least every sec - - - - //if (flag_refresh_inStates) { - ioHelperReadPins(); - ioHelperDebounce(); - ioHelperEdgeDetector(); - // flag_refresh_inStates = 0; - //} - - // Toggle all outs which are set to blinking - if(millis() - timer_blink_outs > 500){ - outStates[0] ^= outStatesBlinking[0]; - outStates[1] ^= outStatesBlinking[1]; - timer_blink_outs = millis(); - } - -#if PLC_MQTT_ENABLED - // send misc info - if(millis() - timer_send_uptime > 5000){ - timer_send_uptime += 5000; - char msg[64]; - sprintf(msg, "%ld", millis()/1000); - mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/uptime", msg, strlen(msg)); - } -#endif - - - if(read_Input(BTN_ANLAGE_EIN, RISING)){ - printf("anlage in: %x\n\r", read_Input(IN_ANLAGE_EIN, LEVEL)); - } - // ioHelperSetBit(outStates, LED_GRN_NOTAUS_SCHRANK, 1); - //} - //else{ - // ioHelperSetBit(outStates, LED_GRN_NOTAUS_SCHRANK, 0); - //} - - do_luefter(); - do_notaus(); - do_zumbach(); - -#if PLC_MQTT_ENABLED - ioHelperSetBit(outStates, LED_BUS_OK, 1); - ioHelperSetOuts(); - MQTTYield(&mqtt_client, 10); //blocking call - ioHelperSetBit(outStates, LED_BUS_OK, 0); -#endif - ioHelperSetOuts(); - } - return 0; -} - -// Timer0 -// 1ms IRQ -// Used for millis() timing -void timer0_init(void) -{ - TCCR0A = (1<250kHz:250-=>1kHz) - TIMSK0 |= 1< +#include +#include // WatchDog +#include + +#include "Ethernet/socket.h" +#include "Ethernet/wizchip_conf.h" + +#include "Internet/MQTT/mqtt_interface.h" +#include "Internet/MQTT/MQTTClient.h" + +#include "avrIOhelper/io-helper.h" +#include "millis.h" +#include "uart.h" +#include "spi.h" +#include "mqtt.h" + +#include "util/delay.h" + +#define PLC_MQTT_ENABLED 1 + +Client mqtt_client; + +//***********Prologue for fast WDT disable & and save reason of reset/power-up: BEGIN +uint8_t mcucsr_mirror __attribute__ ((section (".noinit"))); + +// This is for fast WDT disable & and save reason of reset/power-up +void get_mcusr(void) \ + __attribute__((naked)) \ + __attribute__((section(".init3"))); +void get_mcusr(void) +{ + mcucsr_mirror = MCUSR; + MCUSR = 0; + wdt_disable(); +} +//***********Prologue for fast WDT disable & and save reason of reset/power-up: END + + +//FUNC headers +static void avr_init(void); +void timer0_init(void); +void print_network_information(void); + +void IO_LIBRARY_Init(void) { + uint8_t bufSize[] = {2, 2, 2, 2, 2, 2, 2, 2}; + + reg_wizchip_cs_cbfunc(spi_select, spi_deselect); + reg_wizchip_spi_cbfunc(spi_read, spi_write); + //reg_wizchip_spiburst_cbfunc(spi_rb_burst, spi_wb_burst); + + wizchip_init(bufSize, bufSize); + wizchip_setnetinfo(&netInfo); + //wizchip_setinterruptmask(IK_SOCK_0); +} + +#define STEP_SIZE 5 +#define TOP_VALUE 40 +void do_luefter(){ + static uint8_t fan_value = TOP_VALUE*0.5; + static uint8_t fan_state = 0; + + + if(!read_Input(IN_ANLAGE_EIN, LEVEL)){ + fan_state = 0; + ioHelperSetBit(outStates, LED_LUEFTER, 0); + } + else{ + if (read_Input(BTN_LUEFTER_EIN, RISING)) { +#if PLC_MQTT_ENABLED + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Luefter", "ein", 3); +#endif + OCR3B = TOP_VALUE/2; + fan_state = 1; + ioHelperSetBit(outStates, LED_LUEFTER, 1); + } + + if (read_Input(BTN_LUEFTER_AUS, RISING)) { +#if PLC_MQTT_ENABLED + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Luefter", "aus", 3); +#endif + fan_state = 0; + ioHelperSetBit(outStates, LED_LUEFTER, 0); + } + + if (read_Input(BTN_LUEFTER_PLUS, RISING) && (fan_value+STEP_SIZE <= TOP_VALUE)) { + fan_value += STEP_SIZE; +#if PLC_MQTT_ENABLED + char _msg[3]; + sprintf(_msg, "%d", fan_value * 100 / 40); + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/LuefterSpeed", _msg, 3); +#endif + printf("luefter %d\n\r", fan_value); + } + + if (read_Input(BTN_LUEFTER_MINUS, RISING) && (fan_value-STEP_SIZE >= STEP_SIZE)) { + fan_value -= STEP_SIZE; +#if PLC_MQTT_ENABLED + char _msg[3]; + sprintf(_msg, "%d", fan_value * 100 / 40); + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/LuefterSpeed", _msg, 3); +#endif + printf("luefter %d\n\r", fan_value); + } + } + + if(fan_state) + OCR3B = fan_value; + else + OCR3B = 0; +} + +void do_zumbach(){ + + if (read_Input(BTN_ZUMBACH_EIN, RISING) && read_Input(IN_ANLAGE_EIN, LEVEL)) { + ioHelperSetBit(outStates, SCHUETZ_ZUMBACH, 1); + ioHelperSetBit(outStates, LED_ZUMBACH, 1); +#if PLC_MQTT_ENABLED + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Zumbach", "ein", 3); +#endif + } + + if (read_Input(BTN_ZUMBACH_AUS, RISING) || read_Input(IN_ANLAGE_EIN, FALLING)) { + ioHelperSetBit(outStates, SCHUETZ_ZUMBACH, 0); + ioHelperSetBit(outStates, LED_ZUMBACH, 0); +#if PLC_MQTT_ENABLED + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Zumbach", "aus", 3); +#endif + } +} + +void do_notaus(){ + if(read_Input(IN_NOTAUS_ANLAGE, LEVEL) || read_Input(IN_NOTAUS_SCHRANK, LEVEL)){ // NOTAUS + set_Output(LED_GRN_NOTAUS_SCHRANK, OFF); // disable green lamps + set_Output(LED_GRN_NOTAUS_ANLAGE, OFF); + } + + if(read_Input(IN_NOTAUS_ANLAGE, LEVEL) && read_Input(IN_NOTAUS_SCHRANK, LEVEL)){ // both activated + set_Output(LED_ROT_NOTAUS_ANLAGE, BLINK); + set_Output(LED_ROT_NOTAUS_SCHRANK, BLINK); + } + else if(read_Input(IN_NOTAUS_ANLAGE, LEVEL)){ // top one activated + set_Output(LED_ROT_NOTAUS_ANLAGE, BLINK); + set_Output(LED_ROT_NOTAUS_SCHRANK, ON); + } + else if(read_Input(IN_NOTAUS_SCHRANK, LEVEL)){ // bottom one activated + set_Output(LED_ROT_NOTAUS_SCHRANK, BLINK); + set_Output(LED_ROT_NOTAUS_ANLAGE, ON); + } + else{ // none activated + set_Output(LED_ROT_NOTAUS_SCHRANK, OFF); + set_Output(LED_ROT_NOTAUS_ANLAGE, OFF); + if(read_Input(IN_ANLAGE_EIN, LEVEL)){ + set_Output(LED_GRN_NOTAUS_ANLAGE, ON); + set_Output(LED_GRN_NOTAUS_SCHRANK, ON); + } + else{ + set_Output(LED_GRN_NOTAUS_ANLAGE, ON); + set_Output(LED_GRN_NOTAUS_SCHRANK, ON); + set_Output(LED_ROT_NOTAUS_ANLAGE, ON); + set_Output(LED_ROT_NOTAUS_SCHRANK, ON); + } + } +} + +int main() +{ + // INIT MCU + avr_init(); + spi_init(); //SPI Master, MODE0, 4Mhz(DIV4), CS_PB.3=HIGH - suitable for WIZNET 5x00(1/2/5) + //spi_speed_tst(); / Here on SPI pins: MOSI 400Khz freq out, on SCLK 3.2MhzOUT (Witk SPI CLK 4Mhz) + + ioHelperInitBuffer(); + ioHelperIoConf(); + + //Wizchip WIZ5500 Ethernet initialize + IO_LIBRARY_Init(); //After that ping must working + print_network_information(); + +#if PLC_MQTT_ENABLED + //****************MQTT client initialize + //Find MQTT broker and connect with it + uint8_t mqtt_buf[100]; + int32_t mqtt_rc = 0; + Network mqtt_network; + mqtt_network.my_socket = SOCK_MQTT; + + printf(">>Trying connect to MQTT broker: %d.%d.%d.%d ..\r\n", MQTT_targetIP[0], MQTT_targetIP[1], MQTT_targetIP[2], MQTT_targetIP[3]); + NewNetwork(&mqtt_network); + ConnectNetwork(&mqtt_network, MQTT_targetIP, 1883); + MQTTClient(&mqtt_client, &mqtt_network, 1000, mqtt_buf, 100, mqtt_readBuffer, MQTT_BUFFER_SIZE); + + //Connection to MQTT broker + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.willFlag = 0; + data.MQTTVersion = 4;//3; + data.clientID.cstring = (char*)"controllino_messmodul"; + data.username.cstring = (char*)"Messmodul"; + data.password.cstring = (char*)"\0"; + data.keepAliveInterval = 10; + data.cleansession = 1; + mqtt_rc = MQTTConnect(&mqtt_client, &data); + if (mqtt_rc == SUCCESSS) + { + printf("++MQTT Connected SUCCESS: %ld\r\n", mqtt_rc); + } + else + { + printf("--MQTT Connected ERROR: %ld\r\n", mqtt_rc); + //while(1); //Reboot the board + } + + // Subscribe to all topics + char SubString[] = "/Filamentanlage/04_Messmodul/set/#"; + mqtt_rc = MQTTSubscribe(&mqtt_client, SubString, QOS0, messageArrived); + printf("Subscribed (%s) %ld\r\n", SubString, mqtt_rc); +#endif + + + ioHelperSetBit(outStatesBlinking, LED_PLC_OK, 1); + + uint32_t timer_blink_outs = millis(); + uint32_t timer_send_uptime = millis(); + + OCR3B = 127; + +#if PLC_MQTT_ENABLED + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/Luefter", "aus", 3); +#endif + + while(1) + { + wdt_reset(); // WDT reset at least every sec + + + + //if (flag_refresh_inStates) { + ioHelperReadPins(); + ioHelperDebounce(); + ioHelperEdgeDetector(); + // flag_refresh_inStates = 0; + //} + + // Toggle all outs which are set to blinking + if(millis() - timer_blink_outs > 500){ + outStates[0] ^= outStatesBlinking[0]; + outStates[1] ^= outStatesBlinking[1]; + timer_blink_outs = millis(); + } + +#if PLC_MQTT_ENABLED + // send misc info + if(millis() - timer_send_uptime > 5000){ + timer_send_uptime += 5000; + char msg[64]; + sprintf(msg, "%ld", millis()/1000); + mqtt_pub(&mqtt_client, "/Filamentanlage/04_Messmodul/state/uptime", msg, strlen(msg)); + } +#endif + + + if(read_Input(BTN_ANLAGE_EIN, RISING)){ + printf("anlage in: %x\n\r", read_Input(IN_ANLAGE_EIN, LEVEL)); + } + // ioHelperSetBit(outStates, LED_GRN_NOTAUS_SCHRANK, 1); + //} + //else{ + // ioHelperSetBit(outStates, LED_GRN_NOTAUS_SCHRANK, 0); + //} + + do_luefter(); + do_notaus(); + do_zumbach(); + +#if PLC_MQTT_ENABLED + ioHelperSetBit(outStates, LED_BUS_OK, 1); + ioHelperSetOuts(); + MQTTYield(&mqtt_client, 10); //blocking call + ioHelperSetBit(outStates, LED_BUS_OK, 0); +#endif + ioHelperSetOuts(); + } + return 0; +} + +// Timer0 +// 1ms IRQ +// Used for millis() timing +void timer0_init(void) +{ + TCCR0A = (1<250kHz:250-=>1kHz) + TIMSK0 |= 1<