int8_t Fan_State_Dur(uint8_t fan, int8_t input){ // Wert bearbeiten? if (input == MENU_INPUT_PUSH) { Fan_edit ^= 1; eeprom_write_byte((void*) &Fan_fansE[fan].dur, Fan_fans[fan].dur); } if (Fan_edit && (input == MENU_INPUT_DOWN)) { Fan_fans[fan].dur = (Fan_fans[fan].dur < FAN_DUR_MAX) ? (Fan_fans[fan].dur+1) : (FAN_DUR_MAX); } if (Fan_edit && (input == MENU_INPUT_UP)) { Fan_fans[fan].dur = (Fan_fans[fan].dur > FAN_DUR_MIN) ? (Fan_fans[fan].dur-1) : (FAN_DUR_MIN); } // Ausgabe lcd_clear(); lcd_home(); if (Fan_edit) lcd_data('*'); else lcd_data('>'); lcd_string_P(MENU_STR_DURATION); lcd_number(Fan_fans[fan].dur, 2, ' '); lcd_string_P(MENU_STR_MIN); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_BACK); return Fan_edit; }
int8_t Fan_State_Humi(uint8_t fan, int8_t input) { // Wert bearbeiten? if (input == MENU_INPUT_PUSH) { Fan_edit ^= 1; eeprom_write_byte((void*) &Fan_fansE[fan].humi, Fan_fans[fan].humi); } if (Fan_edit && (input == MENU_INPUT_DOWN)) { Fan_fans[fan].humi = (Fan_fans[fan].humi < FAN_HUMI_MAX) ? (Fan_fans[fan].humi+1) : (FAN_HUMI_MAX); } if (Fan_edit && (input == MENU_INPUT_UP)) { Fan_fans[fan].humi = (Fan_fans[fan].humi > FAN_HUMI_MIN) ? (Fan_fans[fan].humi-1) : (FAN_HUMI_MIN); } // Ausgabe lcd_clear(); lcd_home(); if (Fan_edit) lcd_data('*'); else lcd_data('>'); lcd_string_P(MENU_STR_HUMIDITY); lcd_number(Fan_fans[fan].humi, 2, ' '); lcd_data('%'); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_ONTIME); lcd_number(Fan_fans[fan].timeH, 2, ' '); lcd_data(':'); lcd_number(Fan_fans[fan].timeM, 2, '0'); return Fan_edit; }
int8_t Menu_Version(int8_t input) { lcd_clear(); lcd_home(); lcd_string_P(MENU_STR_VER); lcd_data(':'); lcd_setcursor(0, 2); lcd_string_P(GITVERSION); return 0; }
int8_t Fan_State_Back(uint8_t fan, int8_t input) { lcd_clear(); lcd_home(); lcd_data(' '); lcd_string_P(MENU_STR_DURATION); lcd_number(Fan_fans[fan].dur, 2, ' '); lcd_string_P(MENU_STR_MIN); lcd_setcursor(0, 2); lcd_data('>'); lcd_string_P(MENU_STR_BACK); return 0; }
int8_t Fan_State_On(uint8_t fan, int8_t input) { // Wert bearbeiten? if (input == MENU_INPUT_PUSH) { Fan_edit ^= 1; eeprom_write_byte((void*) &Fan_fansE[fan].timeM, Fan_fans[fan].timeM); eeprom_write_byte((void*) &Fan_fansE[fan].timeH, Fan_fans[fan].timeH); } if (Fan_edit && (input == MENU_INPUT_DOWN)) { if (Fan_fans[fan].timeM < 55) { Fan_fans[fan].timeM += 5; } else if (Fan_fans[fan].timeH < 23) { Fan_fans[fan].timeM = 0; Fan_fans[fan].timeH++; } } if (Fan_edit && (input == MENU_INPUT_UP)) { if (Fan_fans[fan].timeM > 0) { Fan_fans[fan].timeM -= 5; } else if (Fan_fans[fan].timeH > 0) { Fan_fans[fan].timeM = 55; Fan_fans[fan].timeH--; } } // Ausgabe lcd_clear(); lcd_home(); if (Fan_edit) lcd_data('*'); else lcd_data('>'); lcd_string_P(MENU_STR_ONTIME); lcd_number(Fan_fans[fan].timeH, 2, ' '); lcd_data(':'); lcd_number(Fan_fans[fan].timeM, 2, '0'); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_REPEAT); lcd_number(Fan_fans[fan].rep, 2, ' '); lcd_data('h'); return Fan_edit; }
int8_t Fan_State_Ctrl(uint8_t fan, int8_t input) { // Wert bearbeiten? if (input == MENU_INPUT_PUSH) { Fan_edit ^= 1; eeprom_write_byte((void*) &Fan_fansE[fan].ctrl, Fan_fans[fan].ctrl); } if (Fan_edit && (input == MENU_INPUT_DOWN)) { Fan_fans[fan].ctrl = (Fan_fans[fan].ctrl < FAN_CTRL_MAX) ? (Fan_fans[fan].ctrl+1) : (FAN_CTRL_MAX); } if (Fan_edit && (input == MENU_INPUT_UP)) { Fan_fans[fan].ctrl = (Fan_fans[fan].ctrl > FAN_CTRL_MIN) ? (Fan_fans[fan].ctrl-1) : (FAN_CTRL_MIN); } // Ausgabe lcd_clear(); lcd_home(); if (Fan_edit) lcd_data('*'); else lcd_data('>'); lcd_string_P(MENU_STR_CTRL); switch (Fan_fans[fan].ctrl) { case FAN_CTRL_OFF: lcd_string_P(MENU_STR_CTRL_OFF); break; case FAN_CTRL_HUMI: lcd_string_P(MENU_STR_CTRL_HUMI); break; case FAN_CTRL_TIME: lcd_string_P(MENU_STR_CTRL_TIME); break; case FAN_CTRL_REP: lcd_string_P(MENU_STR_CTRL_REP); break; } lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_HUMIDITY); lcd_number(Fan_fans[fan].humi, 2, ' '); lcd_data('%'); return Fan_edit; }
int8_t Menu_Root(int8_t input) { lcd_clear(); lcd_home(); switch (Menu_currState) { case MENU_STATE_STATUS: lcd_number(Clock_getHour(), 2, '0'); lcd_data( 0x3A ); // : lcd_number(Clock_getMinute(), 2, '0'); lcd_data( 0x3A ); // : lcd_number(Clock_getSecond(), 2, '0'); lcd_data(' '); lcd_string_P(MENU_STR_OCLOCK); lcd_setcursor(0, 2); static uint8_t blink; if (Alarm_wasTriggered() && (blink++ & 4)) { lcd_data(LCD_GC_CHAR0); lcd_string_P(MENU_STR_ALARM_STATUS); } else { switch (Sensor_getType()) { case SENSOR_TYPE_SEARCHING: lcd_string_P(MENU_STR_SEARCHING); break; default: case SENSOR_TYPE_NONE: lcd_string_P(MENU_STR_NO_SENSOR); break; case SENSOR_TYPE_ERROR: lcd_string_P(MENU_STR_SENSOR_ERROR); break; case SENSOR_TYPE_SHT1X: case SENSOR_TYPE_HYT131: lcd_number(Sensor_getTemp() / 100, 2, '0'); lcd_data(','); lcd_number(Sensor_getTemp() % 100, 2, '0'); lcd_data( 0xDF ); // ° lcd_data('C'); lcd_data(' '); lcd_data(' '); lcd_data(' '); lcd_number(Sensor_getHumi() / 100, 2, '0'); lcd_data(','); lcd_number(Sensor_getHumi() % 100, 2, '0'); lcd_data('%'); break; } } break; case MENU_STATE_FAN1: lcd_data('>'); lcd_string_P(MENU_STR_FAN1); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_FAN2); break; case MENU_STATE_FAN2: lcd_data('>'); lcd_string_P(MENU_STR_FAN2); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_FAN3); break; case MENU_STATE_FAN3: lcd_data('>'); lcd_string_P(MENU_STR_FAN3); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_FAN4); break; case MENU_STATE_FAN4: lcd_data('>'); lcd_string_P(MENU_STR_FAN4); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_ALARM); break; case MENU_STATE_ALARM: lcd_data('>'); lcd_string_P(MENU_STR_ALARM); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_CAL); break; case MENU_STATE_CAL: lcd_data('>'); lcd_string_P(MENU_STR_CAL); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_TIME); break; case MENU_STATE_TIME: lcd_data('>'); lcd_string_P(MENU_STR_TIME); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_VER); break; case MENU_STATE_VER: lcd_data('>'); lcd_string_P(MENU_STR_VER); lcd_setcursor(0, 2); lcd_data(' '); lcd_string_P(MENU_STR_BACK); break; case MENU_STATE_BACK: lcd_data(' '); lcd_string_P(MENU_STR_VER); lcd_setcursor(0, 2); lcd_data('>'); lcd_string_P(MENU_STR_BACK); break; } return 0; }
int main (void) { // (2) ledidx_t i; DDRB = 0xFF; // Port B: 1 = output PORTB = 0x01; //bootup 1 //_delay_ms(1000); // Initialize LCD Display DDRC |= (1<<PC1) | (1<<PC3); //PC1 = R/W, PC3 = Backlight control PORTC &= ~(1<<PC1); //Switch Backlight on: PORTC |= (1<<PC3); _delay_ms(10); lcd_init(); PORTB = 0x02; //bootup 2 _delay_ms(100); lcd_string_P(PSTR("blinkylight 0.3 ")); lcd_setcursor(0,2); lcd_string_P(PSTR("Booting ... ")); //PORTB = 0x03; //bootup 3 //_delay_ms(1000); uart_init(); uart_putc('p'); uart_putc('w'); uart_putc('r'); uart_putc('O'); uart_putc('N'); uart_putc('\n'); //PORTB = 0x04; //bootup 4 //PORTB = 0x05; //bootup 5 // Enable Interrupts sei(); PORTB = 0x06; //bootup 6 // muss vor ws2801_init stehen, da dieser PA1 und PA2 als output schaltet DDRA = 0x00; // Port A: 0 = input PORTA = 0x00; // 0 = pull-ups off //PORTB = 0x0a; //bootup a PORTB = 0x00; //bootup d lcd_setcursor(0,2); lcd_string_P(PSTR("Boot complete ")); _delay_ms(10); //Switch Backlight off: PORTC &= ~(1<<PC3); // Enter main loop uint8_t dezisek = 0; #define DEZISEKTHRES 4 while(1) { // (5) /* "leere" Schleife*/ // (6) _delay_ms(25); //pb_scroll <<= 1; //if (pb_scroll == 0b00010000) pb_scroll = 0b00000001; //PORTB &= 0b11110000; //PORTB |= pb_scroll; PORTB ^= (1<<PB2); if (dezisek > DEZISEKTHRES) { if (relay_timer > 0) { relay_timer --; if (relay_timer == 0) relay_reset = 1; else { PORTB ^= ( 1 << PB5 )|(1<<PB6)|(1<<PB7); } } } dezisek++; if (disp_set) { lcd_clear(); lcd_home(); for(i=0;i<16;i++)lcd_data(disp_buf[i]); lcd_setcursor(0,2); for(;i<32;i++)lcd_data(disp_buf[i]); disp_set = 0; _delay_ms(250); } if (relay_set) { PORTB |= (1<<PB4); PORTB |= (1<<PB5)|(1<<PB6)|(1<<PB7); relay_set = 0; } if (relay_reset) { PORTB &= ~(1<<PB4); PORTB &= ~((1<<PB5)|(1<<PB6)|(1<<PB7)); relay_reset = 0; relay_timer = 0; } if (PINA & (1<<PA7)) { uart_putc('5'); } if (PINA & (1<<PA6)) { uart_putc('4'); } if (PINA & (1<<PA5)) { uart_putc('3'); } if (PINA & (1<<PA4)) { uart_putc('2'); } if (measure_temp == 1) { //PORTC ^= (1<<PC3); uint8_t sensor_id[OW_ROMCODE_SIZE]; uint8_t diff = OW_SEARCH_FIRST; ow_reset(); DS18X20_find_sensor(&diff, &sensor_id[0]); if (diff == OW_PRESENCE_ERR) strcpy_P(&disp_tmp_buf[0], PSTR("Err:Presence ")); else if (diff == OW_DATA_ERR) strcpy_P(&disp_tmp_buf[0], PSTR("Err:Data ")); else { if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) == DS18X20_OK) { _delay_ms( DS18B20_TCONV_12BIT ); int16_t decicelsius; if ( DS18X20_read_decicelsius( &sensor_id[0], &decicelsius) == DS18X20_OK ) { disp_tmp_buf[0]='T'; disp_tmp_buf[1]='e'; disp_tmp_buf[2]='m'; disp_tmp_buf[3]='p'; disp_tmp_buf[4]=':'; disp_tmp_buf[5]=' '; DS18X20_format_from_decicelsius( decicelsius, &disp_tmp_buf[6], 8 ); } else { strcpy_P(&disp_tmp_buf[0], PSTR("Err: Read ")); } } else { strcpy_P(&disp_tmp_buf[0], PSTR("Err: StartMeasure")); } } sprintf(&disp_tmp_buf[16], "%d bytes recv.", recv_len); //disp_show_buf(&disp_tmp_buf[0]); for(i=0;i<20;i++) uart_putc(disp_tmp_buf[i]); measure_temp=0; } if (PINA & (1<<PA3)) { relay_set = 1; relay_timer = 10; uart_putc('1'); } //uart_putc('+'); // uart_putc('\n'); } // (7) /* wird nie erreicht */ return 0; // (8) }