#include <LCD5110_Graph.h> // Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). // Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5). #define EXT_FILTER_PIN 12 #define EXT_AIR_PIN 1 #define EXT_HEATER_PIN 13 #define EXT_COOLING_PIN 10 #define EXT_LIGHT_1_PIN 15 #define EXT_LIGHT_2_PIN 16 #define EXT_CO2_PIN 0 #define EXT_POWER_ON_PIN 20 #define EXT_LIGHT_LED_PIN 11 #define EXT_UDO_MICRO_PIN 17 #define EXT_UDO_MACRO_PIN 18 #define EXT_UDO_Fe_PIN 19 #define Key_PIN 7 #define DispLight_min 253 //минимальная подсветка в режиме часов #define CorrTime -3 // коррекция хода системных часов [Сек] выполняется каждый час //const int CorrTime = -23; // коррекция хода системных часов [Сек] // It is assumed that the LCD module is connected to // the following pins using a levelshifter to get the // correct voltage to the module. // SCK - Pin 8 // MOSI - Pin 9 // DC - Pin 10 // RST - Pin 11 // CS - Pin 12 // #include <LCD5110_Graph.h> #define LED_LIGHT_PIN 9 LCD5110 myGLCD(8,7,6,4,5); extern uint8_t SmallFont[]; extern uint8_t BigNumbers[]; //extern unsigned char TinyFont[]; byte ledContrast; byte ledLight; //подключаем заголовочный файл библиотеки EEPROM #include <EEPROM.h> #include <OneWire.h> OneWire temp(14); // on pin 10 (a 4.7K resistor is necessary) float cur_temp = -999; byte temp_type_s; byte temp_data[12]; byte temp_addr[8]; byte temp_cicle = 0; // I assume you know how to connect the DS1307. // DS1307: SDA pin -> Arduino Digital 4 // SCL pin -> Arduino Digital 5 #include <DS1307.h> // Init the DS1307 DS1307 rtc(3, 2); // Init a Time-data structure Time time; unsigned long currentTime; unsigned long loopTime; byte key = 0; byte prev_key = 0; byte idle_key = 0; //const int max_idle_key = 100; //цыклов не активности перед скринсейвером #define max_idle_key 100 //цыклов не активности перед скринсейвером int cur_menu = 0; int cur_item = 0; boolean cur_item_edit = false; byte aquaT; // Требуемая температура воды boolean CoolingEnabled; // Разрешено ли охлаждение куллером boolean light1 = false; boolean light2 = false; boolean air = false; boolean CO2 = false; byte kormMin = 0; // Остаток времени для кормления мин byte minCool = 0; // минимальные обороты кулера для вентиляции крышки и охлаждения ламп byte maxCool = 0; // максимальные обороты для охлаждения воды void setup() { pinMode(EXT_HEATER_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_HEATER_PIN, LOW); // выключает pinMode(EXT_COOLING_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_COOLING_PIN, LOW); // выключает pinMode(EXT_LIGHT_1_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_LIGHT_1_PIN, HIGH); // выключает light1 = true; pinMode(EXT_LIGHT_2_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_LIGHT_2_PIN, LOW); // выключает light2 = false; pinMode(EXT_FILTER_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_FILTER_PIN, HIGH); // выключает pinMode(EXT_CO2_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_CO2_PIN, LOW); // выключает CO2 = false; pinMode(EXT_AIR_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_AIR_PIN, HIGH); // выключает air = true; CoolingEnabled = false; // Разрешено ли охлаждение куллером pinMode(EXT_POWER_ON_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_POWER_ON_PIN, LOW); // выключает pinMode(EXT_LIGHT_LED_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_LIGHT_LED_PIN, LOW); // выключает pinMode(EXT_UDO_MICRO_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_UDO_MICRO_PIN, LOW); // выключает pinMode(EXT_UDO_MACRO_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_UDO_MACRO_PIN, LOW); // выключает pinMode(EXT_UDO_Fe_PIN, OUTPUT); // устанавливает режим работы - выход digitalWrite(EXT_UDO_Fe_PIN, LOW); // выключает //включит pullup резистор для входа: // pinMode(Key_PIN, INPUT); // Init EEPROM // for(int e = 0; e < 2047; e++) EEPROM.write(e,0); // EEPROM.write(0,61); // ledContrast !!!!!!! Очень акуратно иначе белый либо черный экран // EEPROM.write(1,200); // ledLight // EEPROM.write(2,24); // Требуемая температура воды // EEPROM.write(3,1); // Разрешено ли охлаждение куллером ledContrast = EEPROM.read(0); // первичная установка контраста - иначе при первом запуске нихрена невидно if ((ledContrast==0)||(ledContrast==255)){ ledContrast = 65; } ledLight = EEPROM.read(1); myGLCD.InitLCD(ledContrast); pinMode(LED_LIGHT_PIN, OUTPUT); // устанавливает режим работы - выход analogWrite(LED_LIGHT_PIN,ledLight); aquaT = EEPROM.read(2); // Требуемая температура воды minCool = EEPROM.read(3); // минимальные обороты кулера для вентиляции крышки и охлаждения ламп maxCool = EEPROM.read(4); // максимальные обороты для охлаждения воды // Set the clock to run-mode rtc.halt(false); // rtc.setDOW(SUNDAY); // Set Day-of-Week to SUNDAY // rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format) // rtc.setDate(3, 10, 2010); // Set the date to October 3th, 2010 myGLCD.setFont(SmallFont); myGLCD.clrScr(); myGLCD.update(); /* myGLCD.setFont(SmallFont); myGLCD.clrScr(); myGLCD.print("AQUA controll", CENTER, 3); myGLCD.print("ALEX", CENTER, 20); myGLCD.drawRect(28, 18, 56, 28); for (int i=0; i<6; i++) { myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2)); myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2)); } // myGLCD.setFont(TinyFont); myGLCD.print("(C) AlexVOK", CENTER, 36); // myGLCD.print("[email protected]", CENTER, 42); myGLCD.update(); delay(1000); */ //------------------------------------------------------------------------------- byte b = 0; while ( (!temp.search(temp_addr))&&(b < 10)) { //Serial.println("Нет больше адресов."); temp.reset_search(); delay(250); b++; } // if (OneWire::crc8(temp_addr, 7) != temp_addr[7]) { // Serial.println("CRC не является действительным!"); // } // Первый байт ROM указывает, какой чип switch (temp_addr[0]) { case 0x10: // Serial.println(" Chip = DS18S20"); temp_type_s = 1; break; case 0x28: // Serial.println(" Chip = DS18B20"); temp_type_s = 0; break; case 0x22: // Serial.println(" Chip = DS1822"); temp_type_s = 0; break; // default: // Serial.println("Устройство не распознано"); } currentTime = millis(); loopTime = currentTime; } //----------------------------------------------------------------------------------- float getTemp(){ // temp.reset(); // temp.select(temp_addr); // temp.write(0x44, 1); // start conversion, with parasite power on at the end // delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. temp.reset(); temp.select(temp_addr); temp.write(0xBE); // Read Scratchpad for (byte i = 0; i < 9; i++) { // we need 9 bytes temp_data[i] = temp.read(); } // Serial.print(OneWire::crc8(data, 8), HEX); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an "int16_t" type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (temp_data[1] << 8) | temp_data[0]; if (temp_type_s) { raw = raw << 3; // 9 bit resolution default if (temp_data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - temp_data[6]; } } else { byte cfg = (temp_data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } return ((float)raw / 16.0); } //----------------------------------------------------------------------------------- // Нажатые кнопки //int button; const byte BUTTON_NONE = 0; const byte BUTTON_UP = 1; const byte BUTTON_DOWN = 2; const byte BUTTON_OK = 3; const byte BUTTON_CANCEL = 4; int getPressedButton() { byte KeyNum=0; int KeyValue1=0; int KeyValue2=0; //Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны. //Если значения равны 1023 – значит не была нажата ни одна клавиша. do { // считываем значения с аналогового входа(A0) KeyValue1=analogRead(Key_PIN); delay(10); KeyValue2=analogRead(Key_PIN); delay(5); } while (KeyValue1!=KeyValue2); //Интерпретируем полученное значение и определяем код нажатой клавиши if (KeyValue2 > 900) {KeyNum = BUTTON_NONE;} else if (KeyValue2 > 450) {KeyNum = BUTTON_CANCEL;} else if (KeyValue2 > 250) {KeyNum = BUTTON_UP;} else if (KeyValue2 > 100) {KeyNum = BUTTON_DOWN;} else {KeyNum = BUTTON_OK;} //Возвращаем код нажатой клавиши return KeyNum; } //----------------------------------------------------------------------------------- void naviKey(byte maxItems){ if(key == BUTTON_UP){ cur_item--; if(cur_item < 1) cur_item = maxItems; } if(key == BUTTON_DOWN){ cur_item++; if(cur_item > maxItems) cur_item = 1; } } //----------------------------------------------------------------------------------- void drawMenu(String mName, String item1, String item2, String item3, String item4){ myGLCD.setFont(SmallFont); myGLCD.clrScr(); myGLCD.print(mName,1,0); myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0); myGLCD.drawLine(0,8,83,8); myGLCD.drawLine(0,9,83,9); if(cur_item == 1){ myGLCD.print(item1,3,12); myGLCD.drawRoundRect(0,11,83,20); }else myGLCD.print(item1,0,12); if(cur_item == 2){ myGLCD.print(item2,3,21); myGLCD.drawRoundRect(0,20,83,29); }else myGLCD.print(item2,0,21); if(cur_item == 3){ myGLCD.print(item3,3,30); myGLCD.drawRoundRect(0,29,83,38); }else myGLCD.print(item3,0,30); if(cur_item == 4){ myGLCD.print(item4,3,39); myGLCD.drawRoundRect(0,38,83,47); }else myGLCD.print(item4,0,39); myGLCD.update(); } byte menu_hh; byte menu_mi; byte menu_dd; byte menu_mm; int menu_yyyy; byte menu_dow; byte menu_off; byte menu_item_count; int alertAdr; byte curLoad; byte prMin = 0; //----------------------------------------------------------------------------------- void drawIntMenu(String mName, int minVal, int maxVal, int Val){ myGLCD.setFont(SmallFont); myGLCD.clrScr(); myGLCD.print(mName,1,0); // myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0); myGLCD.drawLine(0,8,83,8); myGLCD.drawLine(0,9,83,9); myGLCD.setFont(BigNumbers); myGLCD.printNumI(Val,CENTER,11); myGLCD.drawRoundRect(0,38,83,47); int k = 80*(Val-minVal)/(maxVal - minVal); for(int i = 2; i < k+2; i++) myGLCD.drawLine(i,40,i,46); myGLCD.update(); } boolean new_hour = true; byte secc = 0; byte LED_sunrise = 0; byte LED_cur_pos = 0; byte udo_tim = 0; byte bt; //***************************************************************************************** //***************************************************************************************** void loop() { currentTime = millis(); key = getPressedButton(); if((currentTime >= (loopTime + 250))||(key != prev_key)){ // проверяем каждые 5мс (20 Гц) if((prev_key != key)&&(key != 0)){ idle_key = 0; }else{ idle_key++; } prev_key = key; if (key == 0) // Измереяем температуру только в состоянии простоя { if(temp_cicle == 0){ temp.reset(); temp.select(temp_addr); temp.write(0x44, 1); // start conversion, with parasite power on at the end } if(temp_cicle == 4){ cur_temp = getTemp(); // Управление нагревом и охлаждением ---------------------------------------------- if(cur_temp < (float)aquaT){ digitalWrite(EXT_HEATER_PIN, HIGH); // включает нагреватель }else digitalWrite(EXT_HEATER_PIN, LOW); // выключает нагреватель if (CoolingEnabled) { if(cur_temp > ((float)aquaT+0.1)){ // Разрешено ли охлаждение куллером int coll_cur = minCool+(((float)(maxCool - minCool))/100)*(((float)(cur_temp-aquaT))/0.5)*100; if (coll_cur > maxCool) { coll_cur = maxCool;} analogWrite(EXT_COOLING_PIN, coll_cur); // включает куллер }else{ analogWrite(EXT_COOLING_PIN, minCool); // включаем режим проветривания } }else{ if (air||light1){ // if (air||light1||light2){ analogWrite(EXT_COOLING_PIN, minCool); // включаем режим проветривания }else{ digitalWrite(EXT_COOLING_PIN, LOW); // выключает куллер } } } if(temp_cicle > 51){ temp_cicle = 0; }else{ temp_cicle++; } } // -------------------------------------------------------------------------------- if(secc > 4){ secc = 0; }else{ secc++; } // Get data from the DS1307 time = rtc.getTime(); // коррекция хода системных часов [Сек] if (time.min == 0){ new_hour = true; } if ((time.min == 30)&&(new_hour)){ int corr_sec = time.sec + CorrTime; // коррекция хода системных часов [Сек] byte corr_min = time.min; if (corr_sec < 0){ corr_sec = corr_sec + 60; corr_min--; } if (corr_sec > 59){ corr_sec = corr_sec - 60; corr_min++; } rtc.setTime(time.hour, corr_min, corr_sec); // Set the time to 12:00:00 (24hr format) new_hour = false; } //----- // Новая минута ---------------------------------------------- if(prMin != time.min){ prMin = time.min; // Время для кормления мин if(kormMin > 0){ digitalWrite(EXT_FILTER_PIN, LOW); // выключает Фильтр kormMin--; }else{ digitalWrite(EXT_FILTER_PIN, HIGH); // включает Фильтр } // Восход / Закат if (LED_sunrise > 0){ byte led_val = (LED_sunrise&B01111111); byte led_tmp = 0; if (LED_cur_pos > led_val){ led_tmp = 255; LED_sunrise = 0; }else{ led_tmp = LED_cur_pos*255/led_val; } if(LED_sunrise&B10000000){ // Восход }else{ // Закат led_tmp = 255 - led_tmp; } // Управляем блоком питания if (led_tmp == 0){ digitalWrite(EXT_POWER_ON_PIN, LOW); }else{ digitalWrite(EXT_POWER_ON_PIN, HIGH); } analogWrite(EXT_LIGHT_LED_PIN, led_tmp); // LED LED_cur_pos++; } //-------ALARM------------------------------------------------------------------------- for(int a = 100; a < 1001; a = a + 4){ byte b1 = EEPROM.read(a); // if(((boolean)(b1&B10000000))&((boolean)(_BV(time.dow-1)&b1))){ // активная запись и день недели if(b1&B10000000){ if((1<<(time.dow-1))&b1){ // активная запись и день недели byte b2 = EEPROM.read(a+1); if(time.hour == (byte)(b2&B00011111)){ // сравниваем часы byte b3 = EEPROM.read(a+2); if(time.min == (byte)(b3&B00111111)){ // сравниваем минути byte b4 = EEPROM.read(a+3); switch((byte)((b2>>5)&B00000111)){ // определяем нагрузку case 0: // Разрешено ли охлаждение куллером if (b4&B00000001){ CoolingEnabled = true; analogWrite(EXT_COOLING_PIN, minCool); // включаем режим проветривания }else{ CoolingEnabled = false; digitalWrite(EXT_COOLING_PIN, LOW); } break; case 1: // Light1 if (b4&B00000001){ digitalWrite(EXT_LIGHT_1_PIN, HIGH); light1 = true; }else{ digitalWrite(EXT_LIGHT_1_PIN, LOW); light1 = false; } break; case 2: // Light2 if (b4&B00000001){ digitalWrite(EXT_LIGHT_2_PIN, HIGH); light2 = true; }else{ digitalWrite(EXT_LIGHT_2_PIN, LOW); light2 = false; } break; case 3: // Air if (b4&B00000001){ digitalWrite(EXT_AIR_PIN, HIGH); air = true; }else{ digitalWrite(EXT_AIR_PIN, LOW); air = false; } break; case 4: // CO2 if (b4&B00000001){ digitalWrite(EXT_CO2_PIN, HIGH); CO2 = true; }else{ digitalWrite(EXT_CO2_PIN, LOW); CO2 = false; } break; case 5: //LED // 8 бит 1 восход 0 закат остальные кол мин LED_sunrise = b4; LED_cur_pos = 0; break; // case 6: // UDO // udo_tim = (byte)(b4&B00111111); // digitalWrite(EXT_POWER_ON_PIN, HIGH); // delay(100); //Время на выход в режим БП // switch((byte)((b4>>6)&B00000011)){ // case 0: // digitalWrite(EXT_UDO_MICRO_PIN, HIGH); // delay(udo_tim*4.2); // digitalWrite(EXT_UDO_MICRO_PIN, LOW); // break; // case 1: // digitalWrite(EXT_UDO_MACRO_PIN, HIGH); // delay(udo_tim*4.2); // digitalWrite(EXT_UDO_MACRO_PIN, LOW); // break; // case 2: // digitalWrite(EXT_UDO_Fe_PIN, HIGH); // delay(udo_tim*4.2); // digitalWrite(EXT_UDO_Fe_PIN, LOW); // break; // case 3: // // break; // } // digitalWrite(EXT_POWER_ON_PIN, LOW); // break; case 7: break; } } } } } } } //------------------------------------------------------------------------------------ if((idle_key > max_idle_key)&&(cur_menu != 0)){ cur_menu = 0; cur_item = 0; cur_item_edit = false; } switch(cur_menu){ case 0: // Time { analogWrite(LED_LIGHT_PIN,DispLight_min); myGLCD.setFont(BigNumbers); myGLCD.clrScr(); myGLCD.printNumI(time.hour,7,2,2,'0'); myGLCD.drawCircle(42,9,3); myGLCD.drawCircle(42,19,3); if(secc < 2){ myGLCD.drawCircle(42,9,2); myGLCD.drawCircle(42,19,2); myGLCD.drawRect(41,8,43,10); myGLCD.drawRect(41,18,43,20); myGLCD.setPixel(42,9); myGLCD.setPixel(42,19); } myGLCD.printNumI(time.min,49,2,2,'0'); myGLCD.setFont(SmallFont); if(cur_temp < 1){ myGLCD.print("T: Error",3,38); }else{ myGLCD.print("T:",3,38); myGLCD.printNumF(cur_temp,2,15,38); } myGLCD.update(); if(key > 0) cur_menu = 1; cur_item = 0; cur_item_edit = false; // Включаем подсветку LED // analogWrite(LED_LIGHT_PIN,ledLight); break; } case 1: // Main ----------------------------------------------------------------- { analogWrite(LED_LIGHT_PIN,ledLight); String ll; if(light1||light2){ ll = "On"; }else ll ="Off"; String aa; if(air){ aa = "On"; }else aa ="Off"; if(cur_item_edit&&(cur_item == 1)) ll = "["+ll+"]"; if(cur_item_edit&&(cur_item == 2)) aa = "["+aa+"]"; String lk = ""; if(kormMin > 0){ lk = " ("+(String)kormMin+")"; } drawMenu("Main","Light "+ll,"Air "+aa,"Kormlenie"+lk,"Settings"); naviKey(4); switch(key){ case BUTTON_OK: switch(cur_item){ case 1: light1 = !light1; light2 = light1; if(light1){ digitalWrite(EXT_LIGHT_1_PIN, HIGH); // включает LED }else digitalWrite(EXT_LIGHT_1_PIN, LOW); // выключает LED if(light2){ digitalWrite(EXT_LIGHT_2_PIN, HIGH); // включает lightTUBE }else digitalWrite(EXT_LIGHT_2_PIN, LOW); // выключает lightTUBE break; case 2: air = !air; if(air){ digitalWrite(EXT_AIR_PIN, HIGH); // включает }else digitalWrite(EXT_AIR_PIN, LOW); // выключает break; case 3: kormMin = 20; digitalWrite(EXT_FILTER_PIN, LOW); // выключает Фильтр break; case 4: cur_menu = 13; cur_item = 0; break; } break; case BUTTON_CANCEL: cur_item_edit = false; cur_menu = 0; cur_item = 0; break; } break; } case 13: // Settings ----------------------------------------------------------------- { drawMenu("Settings", "System","Termostat","Tasker","Tasker"); naviKey(4); switch(key){ case BUTTON_OK: switch(cur_item){ case 1: cur_menu = 131; cur_item = 0; break; case 2: cur_menu = 132; cur_item = 0; break; case 3: cur_menu = 130; cur_item = 1; break; case 4: cur_menu = 130; // 134 UDO cur_item = 0; break; } break; case BUTTON_CANCEL: cur_menu = 1; cur_item = 3; break; } break; } // case 134: // UDO ----------------------------------------------------------------- // { String uu; // if (CO2){ // uu = "On"; // }else{ // uu = "Off"; // } // drawMenu("UDO", "CO2", "UDO","CO2 "+uu,""); // naviKey(3); // switch(key){ // case BUTTON_OK: // switch(cur_item){ // case 1: // cur_menu = 133; // cur_item = 1; // menu_off = 1; // menu_item_count = 25; // curLoad = 4; // break; // case 2: // cur_menu = 133; // cur_item = 1; // menu_off = 1; // menu_item_count = 25; // curLoad = 6; // break; // case 3: // CO2 = !CO2; // if (CO2){ // digitalWrite(EXT_CO2_PIN, HIGH); // }else{ // digitalWrite(EXT_CO2_PIN, LOW); // } // break; // case 4: //// cur_menu = 130; //// cur_item = 1; // break; // } // break; // case BUTTON_CANCEL: // cur_menu = 13; // cur_item = 4; // break; // } // break; // } case 130: // Tasker ----------------------------------------------------------------- { drawMenu("Tasker","Light 1","Light 2","LED","Air"); naviKey(4); switch(key){ case BUTTON_OK: switch(cur_item){ case 1: cur_menu = 133; cur_item = 1; menu_off = 1; menu_item_count = 25; curLoad = 1; break; case 2: cur_menu = 133; cur_item = 1; menu_off = 1; menu_item_count = 25; curLoad = 2; break; case 3: cur_menu = 133; cur_item = 1; menu_off = 1; menu_item_count = 25; curLoad = 5; break; case 4: cur_menu = 133; cur_item = 1; menu_off = 1; menu_item_count = 25; curLoad = 3; break; } break; case BUTTON_CANCEL: cur_menu = 13; cur_item = 3; break; } break; } case 133: // Tasker Menu List ----------------------------------------------------------------- { myGLCD.setFont(SmallFont); myGLCD.clrScr(); int offf; switch(curLoad){ case 0: myGLCD.print("CoolTime",1,0); offf = 400; break; case 1: myGLCD.print("Light 1",1,0); offf = 100; break; case 2: myGLCD.print("Light 2",1,0); offf = 200; break; case 3: myGLCD.print("Air",1,0); offf = 300; break; case 4: myGLCD.print("CO2",1,0); offf = 500; break; case 5: myGLCD.print("LED",1,0); offf = 600; break; case 6: myGLCD.print("UDO",1,0); offf = 700; break; } myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0); myGLCD.drawLine(0,8,83,8); myGLCD.drawLine(0,9,83,9); String tt; byte vy; for(byte j = menu_off; j <= min(menu_off+3,menu_item_count); j++){ vy = 3+9*(j-menu_off+1); alertAdr = offf+(j-1)*4; bt = EEPROM.read(alertAdr+1)&B00011111; tt = (String)(j) + " "; if(bt < 10){ tt = tt + "0"; } tt = tt + (String)bt + ":"; bt = EEPROM.read(alertAdr+2)&B00111111; if(bt < 10){ tt = tt + "0"; } tt = tt + (String)bt + " "; byte bt = EEPROM.read(alertAdr+3); switch(curLoad){ case 5: // "TimerLED" if (bt&B10000000){ tt = tt + "On"; }else{ tt = tt + "Off"; } break; case 6: // "TimerUDO" switch((byte)((bt>>6)&B00000011)){ case 0: // Micro tt = tt + "Micro"; break; case 1: // Macro tt = tt + "Macro"; break; case 2: // Fe+ tt = tt + "Fe+"; break; case 3: // Ka tt = tt + "Ka"; break; } break; default: if(bt > 0){ tt = tt + "On"; }else{ tt = tt + "Off"; } break; } // tt = "Time "+(String)(j); // if(EEPROM.read(offf+(j-1)*4)&B10000000){ // tt = tt+" Active"; // } if(cur_item == j){ myGLCD.print(tt,3,vy); myGLCD.drawRoundRect(0,vy-1,83,vy+8); }else myGLCD.print(tt,0,vy); // перечеркиваем не активные таймера if(!(EEPROM.read(offf+(j-1)*4)&B10000000)){ myGLCD.drawLine(0,vy+5,83,vy+5); } } switch(key){ case BUTTON_UP: if(cur_item == 1){ cur_item = menu_item_count; menu_off = menu_item_count - 3; }else{ cur_item--; if(cur_item < menu_off){ menu_off = cur_item; } } break; case BUTTON_DOWN: if(cur_item == menu_item_count){ cur_item = 1; menu_off = 1; }else{ cur_item++; if(cur_item > menu_off+3){ menu_off = cur_item-3; } } break; case BUTTON_OK: alertAdr = offf+(cur_item-1)*4; cur_menu = 1330; cur_item = 1; cur_item_edit = false; break; case BUTTON_CANCEL: switch(curLoad){ case 0: //"CoolTime" cur_menu = 132; cur_item = 2; break; case 1: //"Light1", cur_menu = 130; cur_item = 1; break; case 2: //"Light2" cur_menu = 130; cur_item = 2; break; case 3: //"Air" cur_menu = 130; cur_item = 4; break; case 4: //"CO2" cur_menu = 134; cur_item = 1; break; case 5: //"LED" cur_menu = 130; cur_item = 3; break; case 6: //"UDO" cur_menu = 134; cur_item = 2; break; } cur_item_edit = false; break; } myGLCD.update(); break; } case 1330: // Tasker Menu ----------------------------------------------------------------- { myGLCD.setFont(SmallFont); myGLCD.clrScr(); switch(curLoad){ case 0: myGLCD.print("CoolTime",1,0); break; case 1: myGLCD.print("Light1",1,0); break; case 2: myGLCD.print("Light2",1,0); break; case 3: myGLCD.print("Air",1,0); break; case 4: myGLCD.print("CO2",1,0); break; case 5: myGLCD.print("LED",1,0); break; case 6: myGLCD.print("UDO",1,0); break; } myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0); myGLCD.drawLine(0,8,83,8); myGLCD.drawLine(0,9,83,9); byte b1 = EEPROM.read(alertAdr); bt = b1; myGLCD.print("MoTuWeThFrSaSu",0,11); for(int j = 1; j < 8; j++){ // if((cur_item == j)&cur_item_edit){ if(cur_item == j){ myGLCD.drawRect(j*12-10,20,j*12-2,28); } myGLCD.drawCircle(j*12-6,24,3); if(bt&B00000001){ myGLCD.drawCircle(j*12-6,24,2); myGLCD.drawCircle(j*12-6,24,1); } bt = bt >> 1; } String stat = ""; if(cur_item == 8){ stat = stat + "["; } if(EEPROM.read(alertAdr)&B10000000){ stat = stat + "Act"; }else stat = stat + "Pas"; if(cur_item == 8){ stat = stat + "]"; } stat = stat + "."; if(cur_item == 9){ stat = stat + "["; } byte tmpb = EEPROM.read(alertAdr+3); switch(curLoad){ case 5: // "TimerLED" if (tmpb&B10000000){ stat = stat + "On"; }else{ stat = stat + "Off"; } stat = stat + " " + (tmpb&B01111111)+"min"; break; case 6: // "TimerUDO" switch((byte)((tmpb>>6)&B00000011)){ case 0: // Micro stat = stat + "Micro"; break; case 1: // Macro stat = stat + "Macro"; break; case 2: // Fe+ stat = stat + "Fe+"; break; case 3: // Ka stat = stat + "Ka"; break; } stat = stat + (tmpb&B00111111)+"mil"; break; default: if(tmpb > 0){ stat = stat + "On"; }else{ stat = stat + "Off"; } break; } if(cur_item == 9){ stat = stat + "]"; } myGLCD.print(stat,0,29); stat = "Time: "; if(cur_item == 10){ stat = stat + "["; } bt = EEPROM.read(alertAdr+1)&B00011111; if(bt < 10){ stat = stat + "0"; } stat = stat + (String)bt; if(cur_item == 10){ stat = stat + "]"; } stat = stat + ":"; if(cur_item == 11){ stat = stat + "["; } bt = EEPROM.read(alertAdr+2)&B00111111; if(bt < 10){ stat = stat + "0"; } stat = stat + (String)bt; if(cur_item == 11){ stat = stat + "]"; } myGLCD.print(stat,0,39); switch(key){ case BUTTON_UP: if(cur_item_edit){ if((cur_item == 9)&&(curLoad > 4)){ bt = EEPROM.read(alertAdr+3); //if(bt == 255){ // bt = 0; //}else bt++; EEPROM.write(alertAdr+3,bt); } if(cur_item == 10){ bt = (EEPROM.read(alertAdr+1)&B00011111); if(bt == 23){ bt = 0; }else bt++; EEPROM.write(alertAdr+1,bt^(curLoad<<5)); } if(cur_item == 11){ bt = EEPROM.read(alertAdr+2)&B00111111; if(bt == 59){ bt = 0; }else bt++; EEPROM.write(alertAdr+2,bt); } }else if(cur_item == 1){ cur_item = 11; }else cur_item--; break; case BUTTON_DOWN: if(cur_item_edit){ if((cur_item == 9)&&(curLoad > 4)){ bt = EEPROM.read(alertAdr+3); //if(bt == 0){ // bt = 255; //}else bt--; EEPROM.write(alertAdr+3,bt); } if(cur_item == 10){ bt = EEPROM.read(alertAdr+1)&B00011111; if(bt == 0){ bt = 23; }else bt--; EEPROM.write(alertAdr+1,bt^(curLoad<<5)); } if(cur_item == 11){ bt = EEPROM.read(alertAdr+2)&B00111111; if(bt == 0){ bt = 59; }else bt--; EEPROM.write(alertAdr+2,bt); } }else if(cur_item == 11){ cur_item = 1; }else cur_item++; break; case BUTTON_OK: EEPROM.write(alertAdr+1,((EEPROM.read(alertAdr+1)&B00011111)^(curLoad<<5))); // сохраняем номер нагрузки switch(cur_item){ case 8: EEPROM.write(alertAdr,(EEPROM.read(alertAdr)^B10000000)); break; case 9: if(curLoad < 5){ //EEPROM.write(alertAdr+3,(EEPROM.read(alertAdr+3)^B00000001)); EEPROM.write(alertAdr+3,((EEPROM.read(alertAdr+3)&B00000001)^B00000001)); }else{ cur_item_edit = !cur_item_edit; } break; case 10: cur_item_edit = !cur_item_edit; break; case 11: cur_item_edit = !cur_item_edit; break; default: EEPROM.write(alertAdr,(EEPROM.read(alertAdr)^(1<<(cur_item-1)))); break; } break; case BUTTON_CANCEL: switch(curLoad){ case 0: //CoolTime cur_menu = 132; cur_item = 2; break; case 1: //"Light1", cur_menu = 130; cur_item = 1; break; case 2: //"Light2" cur_menu = 130; cur_item = 2; break; case 3: //"Air" cur_menu = 130; cur_item = 4; break; case 4: //"CO2" cur_menu = 134; cur_item = 1; break; case 5: //"LED" cur_menu = 130; cur_item = 3; break; case 6: //"UDO" cur_menu = 134; cur_item = 2; break; } cur_item_edit = false; break; } myGLCD.update(); break; } case 132: // Termostat ----------------------------------------------------------------- { drawMenu("Termostat", "Aqua T ["+(String)aquaT+"]","CoolTime","minCool","maxCool"); naviKey(4); switch(key){ case BUTTON_OK: switch(cur_item){ case 1: cur_menu = 1321; cur_item = 0; break; case 2: //CoolTime cur_menu = 133; cur_item = 1; menu_off = 1; menu_item_count = 8; curLoad = 0; break; case 3: //minCool // минимальные обороты кулера для вентиляции крышки и охлаждения ламп cur_menu = 1323; break; case 4: //maxCool // максимальные обороты для охлаждения воды cur_menu = 1324; break; } break; case BUTTON_CANCEL: cur_menu = 13; cur_item = 2; cur_item_edit = false; break; } break; } case 1321: // Aqua Temperature ----------------------------------------------------------------- { drawIntMenu("Aqua Temperat",18,35,aquaT); switch(key){ case BUTTON_UP: aquaT++; aquaT = min(aquaT, 35); break; case BUTTON_DOWN: aquaT--; aquaT = max(aquaT, 18); break; case BUTTON_OK: EEPROM.write(2,aquaT); // Требуемая температура воды cur_menu = 132; cur_item = 1; break; case BUTTON_CANCEL: aquaT = EEPROM.read(2); // Требуемая температура воды cur_menu = 132; cur_item = 1; break; } break; } case 1323: // minCool // минимальные обороты кулера для вентиляции крышки и охлаждения ламп ------------------------------------------ { drawIntMenu("minCool",0,maxCool,minCool); switch(key){ case BUTTON_UP: minCool++; minCool = min(minCool, maxCool); analogWrite(EXT_COOLING_PIN, minCool); break; case BUTTON_DOWN: minCool--; minCool = max(minCool, 0); analogWrite(EXT_COOLING_PIN, minCool); break; case BUTTON_OK: EEPROM.write(3,minCool); // минимальные обороты кулера для вентиляции крышки и охлаждения ламп cur_menu = 132; cur_item = 3; break; case BUTTON_CANCEL: minCool = EEPROM.read(3); // минимальные обороты кулера для вентиляции крышки и охлаждения ламп cur_menu = 132; cur_item = 3; break; } break; } case 1324: // maxCool // максимальные обороты для охлаждения воды ------------------------------------------ { drawIntMenu("maxCool",0,255,maxCool); switch(key){ case BUTTON_UP: maxCool++; maxCool = min(maxCool, 255); analogWrite(EXT_COOLING_PIN, maxCool); break; case BUTTON_DOWN: maxCool--; maxCool = max(maxCool, minCool); analogWrite(EXT_COOLING_PIN, maxCool); break; case BUTTON_OK: EEPROM.write(4,maxCool); // максимальные обороты для охлаждения воды cur_menu = 132; cur_item = 4; break; case BUTTON_CANCEL: maxCool = EEPROM.read(4); // максимальные обороты для охлаждения воды cur_menu = 132; cur_item = 4; break; } break; } case 131: // System ----------------------------------------------------------------- { drawMenu("System", "Time","Date","LED Contrast","LED Light"); naviKey(4); switch(key){ case BUTTON_OK: switch(cur_item){ case 1: cur_menu = 1311; cur_item = 0; menu_hh = time.hour; menu_mi = time.min; break; case 2: cur_menu = 1312; cur_item = 0; menu_dd = time.date; menu_mm = time.mon; menu_yyyy = time.year; menu_dow = time.dow; break; case 3: cur_menu = 1313; cur_item = 0; break; case 4: cur_menu = 1314; cur_item = 0; break; } break; case BUTTON_CANCEL: cur_menu = 0; cur_item = 0; break; } break; } case 1311: // Time ----------------------------------------------------------------- { myGLCD.setFont(SmallFont); myGLCD.clrScr(); myGLCD.print("Time",1,0); myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0); myGLCD.drawLine(0,8,83,8); myGLCD.drawLine(0,9,83,9); if((cur_item == 1)&&cur_item_edit) myGLCD.invertText(true); myGLCD.printNumI(menu_hh,26,20,2,'0'); myGLCD.invertText(false); myGLCD.print(":",39,20); if((cur_item == 2)&&cur_item_edit) myGLCD.invertText(true); myGLCD.printNumI(menu_mi,46,20,2,'0'); myGLCD.invertText(false); if(cur_item == 1) myGLCD.drawRoundRect(25,18,39,28); if(cur_item == 2) myGLCD.drawRoundRect(45,18,59,28); switch(key){ case BUTTON_UP: if(!cur_item_edit){ cur_item--; if(cur_item < 1) cur_item = 2; }else{ if(cur_item == 1){ menu_hh++; if(menu_hh == 24) menu_hh = 0; } if(cur_item == 2){ menu_mi++; if(menu_mi == 60) menu_mi = 0; } } break; case BUTTON_DOWN: if(!cur_item_edit){ cur_item++; if(cur_item > 2) cur_item = 1; }else{ if(cur_item == 1){ if(menu_hh == 0) menu_hh = 23; else menu_hh--; } if(cur_item == 2){ if(menu_mi == 0) menu_mi = 59; else menu_mi--; } } break; case BUTTON_OK: if(cur_item_edit){ switch(cur_item){ case 1: rtc.setTime(menu_hh, time.min, 0); // Set the time to 12:00:00 (24hr format) break; case 2: rtc.setTime(time.hour, menu_mi, 0); // Set the time to 12:00:00 (24hr format) break; } cur_item_edit = false; }else cur_item_edit = true; break; case BUTTON_CANCEL: cur_item_edit = false; cur_menu = 131; cur_item = 1; break; } myGLCD.update(); break; } case 1312: // Date ----------------------------------------------------------------- { myGLCD.setFont(SmallFont); myGLCD.clrScr(); myGLCD.print("Date",1,0); myGLCD.print(rtc.getTimeStr(FORMAT_SHORT),RIGHT,0); myGLCD.drawLine(0,8,83,8); myGLCD.drawLine(0,9,83,9); if((cur_item == 1)&&cur_item_edit) myGLCD.invertText(true); myGLCD.printNumI(menu_dd,12,20,2,'0'); myGLCD.invertText(false); myGLCD.print(".",24,20); if((cur_item == 2)&&cur_item_edit) myGLCD.invertText(true); myGLCD.printNumI(menu_mm,30,20,2,'0'); myGLCD.invertText(false); myGLCD.print(".",42,20); if((cur_item == 3)&&cur_item_edit) myGLCD.invertText(true); myGLCD.printNumI(menu_yyyy,48,20,4,'0'); myGLCD.invertText(false); myGLCD.print("Day of week",0,32); if((cur_item == 4)&&cur_item_edit) myGLCD.invertText(true); myGLCD.printNumI(menu_dow,68,32); myGLCD.invertText(false); switch(cur_item){ case 1: myGLCD.drawRoundRect(11,18,25,28); break; case 2: myGLCD.drawRoundRect(29,18,44,28); break; case 3: myGLCD.drawRoundRect(47,18,73,28); break; case 4: myGLCD.drawRoundRect(67,30,75,40); break; } switch(key){ case BUTTON_UP: if(!cur_item_edit){ cur_item--; if(cur_item < 1) cur_item = 4; }else{ if(cur_item == 1){ menu_dd++; if(menu_dd > 31) menu_dd = 1; } if(cur_item == 2){ menu_mm++; if(menu_mm > 12) menu_mm = 1; } if(cur_item == 3){ menu_yyyy++; } if(cur_item == 4){ menu_dow++; if(menu_dow > 7) menu_dow = 1; } } break; case BUTTON_DOWN: if(!cur_item_edit){ cur_item++; if(cur_item > 4) cur_item = 1; }else{ if(cur_item == 1){ menu_dd--; if(menu_dd < 1) menu_dd = 31; } if(cur_item == 2){ menu_mm--; if(menu_mm < 1) menu_mm = 12; } if(cur_item == 3){ menu_yyyy--; menu_yyyy = max(menu_yyyy,2013); } if(cur_item == 4){ menu_dow--; if(menu_dow < 1) menu_dow = 7; } } break; case BUTTON_OK: if(cur_item_edit){ switch(cur_item){ case 1: rtc.setDate(menu_dd, time.mon, time.year); // Set the date break; case 2: rtc.setDate(time.date, menu_mm, time.year); // Set the date break; case 3: rtc.setDate(time.date, time.mon, menu_yyyy); // Set the date break; case 4: rtc.setDOW(menu_dow); // Set Day-of-Week break; } cur_item_edit = false; }else cur_item_edit = true; break; case BUTTON_CANCEL: cur_item_edit = false; cur_menu = 131; cur_item = 2; break; } myGLCD.update(); break; } case 1313: // LED Contrast ----------------------------------------------------------------- { drawIntMenu("LED Contrast",45,80,ledContrast); switch(key){ case BUTTON_UP: ledContrast++; ledContrast = min(ledContrast, 80); break; case BUTTON_DOWN: ledContrast--; ledContrast = max(ledContrast, 45); break; case BUTTON_OK: EEPROM.write(0,ledContrast); cur_menu = 131; cur_item = 3; break; case BUTTON_CANCEL: ledContrast = EEPROM.read(0); cur_menu = 131; cur_item = 3; break; } myGLCD.setContrast(ledContrast); break; } case 1314: // LED Light ----------------------------------------------------------------- { drawIntMenu("LED Light",0,255,ledLight); switch(key){ case BUTTON_UP: ledLight++; ledLight = min(ledLight, 255); break; case BUTTON_DOWN: ledLight--; ledLight = max(ledLight, 0); break; case BUTTON_OK: EEPROM.write(1,ledLight); cur_menu = 131; cur_item = 4; break; case BUTTON_CANCEL: ledLight = EEPROM.read(1); cur_menu = 131; cur_item = 4; break; } analogWrite(LED_LIGHT_PIN,ledLight); break; } default: cur_menu = 0; cur_item = 0; } loopTime = currentTime; } }
by Matthew Adams
Matthew is a freelancer who has produced a variety of articles on various topics related to technology. His main focus is the Windows OS and all the things… read more
Updated on January 18, 2023
- Seeing the Error compiling for board Arduino/Genuino Uno message is not nice, but this guide should prove helpful.
- To start the resolution of this issue, ensure that you selected the right board, and follow the next indications.
- For more useful guides on this topic, don’t hesitate to visit our Developer Tools section.
- To always be on top of any Arduino error message, bookmark our Arduino Errors Hub.
XINSTALL BY CLICKING THE DOWNLOAD FILE
This software will keep your drivers up and running, thus keeping you safe from common computer errors and hardware failure. Check all your drivers now in 3 easy steps:
- Download DriverFix (verified download file).
- Click Start Scan to find all problematic drivers.
- Click Update Drivers to get new versions and avoid system malfunctionings.
- DriverFix has been downloaded by 0 readers this month.
The Arduboy is a small, portable game console with a similar design to the Nintendo Game Boy. It is a game console based on the Arduino board designs, which include Arduino/Genuino Uno.
Users can connect their Arduboys with Windows PCs to upload games to them with the Arduino IDE (Integrated Developer Environment) software.
However, some users have posted on the Arduboy support forum about an Error compiling for board Arduino/Genuino Uno issue.
That error arises when users try to upload a game (otherwise sketch) to the Arduboy with the Arduino IDE software. Consequently, users can’t upload games to their Arduboy when that error arises.
What can I do about the compiling for board Arduino/Genuino Uno error?
1. Make sure you’ve selected the right Arduino board
- The Error compiling for board Arduino/Genuino Uno issue can arise when users haven’t selected the right board design within Arduino IDE. To select the correct board, click the Tools menu in the Arduino IDE software.
- Then select Board to open the menu shown directly below.
- Select Arduino/Genuino Uno if that’s not currently selected.
2. Install missing Arduboy libraries
- The Error compiling for board Arduino/Genuino Uno error is often due to missing Arduboy libraries needed by the games. To install missing Arduboy libraries, click the Sketch menu.
- Then select Include Library to open the menu in the snapshot directly below.
- Click Manage Libraries to open the window shown directly below.
- To search for Arduboy libraries, enter the keyword Arduboy in the search box.
- Make sure all the Arduboy libraries listed below are installed:
Arduboy
ArduboyTones
Arduboy2
AdruboyPlaytune
ArdVoice 469
ArdBitmap
ATMlib
FixedPointsArduino
Arduboy-TinyFont
U8GLIB - You can install selected libraries by clicking the More info links and Install buttons for them. Select the latest versions of the libraries on their drop-down menus.
- Click the Close button when you’ve installed all missing Arduboy libraries.
3. Reinstall the Adruino IDE software
- Some users might need to reinstall the Adruino IDE software to resolve the compiling for board Arduino/Genuino Uno error. First, open File Explorer in Windows.
- If you’re utilizing Arduino IDE 1.6.6 or later, open this path in Explorer:
C:/Users(username)/AppData/Local /Arduino15.
- Users with Arduino IDE 1.6.5r5 or previous should open this folder:
C:/Users (username)/AppData/Roaming/Arduino15.
- Select the Adruino15 folder, and press the Delete button.
- Next, open Run’s window by pressing the Windows key + R hotkey.
- Enter appwiz.cpl in the Open box, and click the OK button.
- Select Arduino in the Programs and Features window.
- Click the Uninstall option.
- If an uninstall prompt opens, click the Yes button on it.
- Restart Windows before you reinstall Arduino.
- Click the Windows app on the Arduino website. Then click the Just Download option.
- Thereafter, reinstall the Arduino IDE software. Note that you’ll also need reinstall boards with the Board Manager.
Those are three ways users can fix Error compiling for board Arduino/Genuino Uno error. With that issue fixed, you can then play Arduboy games.
СОДЕРЖАНИЕ ►
- Произошла ошибка при загрузке скетча в Ардуино
- programmer is not responding
- a function-definition is not allowed arduino ошибка
- expected initializer before ‘}’ token arduino ошибка
- ‘что-то’ was not declared in this scope arduino ошибка
- No such file or directory arduino ошибка
- Compilation error: Missing FQBN (Fully Qualified Board Name)
Ошибки компиляции Arduino IDE возникают при проверке или загрузке скетча в плату, если код программы содержит ошибки, компилятор не может найти библиотеки или переменные. На самом деле, сообщение об ошибке при загрузке скетча связано с невнимательностью самого программиста. Рассмотрим в этой статье все возможные ошибки компиляции для платы Ардуино UNO R3, NANO, MEGA и пути их решения.
Произошла ошибка при загрузке скетча Ардуино
Самые простые ошибки возникают у новичков, кто только начинает разбираться с языком программирования Ардуино и делает первые попытки загрузить скетч. Если вы не нашли решение своей проблемы в статье, то напишите свой вопрос в комментариях к этой записи и мы поможем решить вашу проблему с загрузкой (бесплатно!).
avrdude: stk500_recv(): programmer is not responding
Что делать в этом случае? Первым делом обратите внимание какую плату вы используете и к какому порту она подключена (смотри на скриншоте в правом нижнем углу). Необходимо сообщить Arduino IDE, какая плата используется и к какому порту она подключена. Если вы загружаете скетч в Ардуино Nano V3, но при этом в настройках указана плата Uno или Mega 2560, то вы увидите ошибку, как на скриншоте ниже.
Такая же ошибка будет возникать, если вы не укажите порт к которому подключена плата (это может быть любой COM-порт, кроме COM1). В обоих случаях вы получите сообщение — плата не отвечает (programmer is not responding). Для исправления ошибки надо на панели инструментов Arduino IDE в меню «Сервис» выбрать нужную плату и там же, через «Сервис» → «Последовательный порт» выбрать порт «COM7».
a function-definition is not allowed here before ‘{‘ token
Это значит, что в скетче вы забыли где-то закрыть фигурную скобку. Синтаксические ошибки IDE тоже распространены и связаны они просто с невнимательностью. Такие проблемы легко решаются, так как Arduino IDE даст вам подсказку, стараясь отметить номер строки, где обнаружена ошибка. На скриншоте видно, что строка с ошибкой подсвечена, а в нижнем левом углу приложения указан номер строки.
expected initializer before ‘}’ token / expected ‘;’ before ‘}’ token
Сообщение expected initializer before ‘}’ token говорит о том, что вы, наоборот где-то забыли открыть фигурную скобку. Arduino IDE даст вам подсказку, но если скетч довольно большой, то вам придется набраться терпения, чтобы найти неточность в коде. Ошибка при компиляции программы: expected ‘;’ before ‘}’ token говорит о том, что вы забыли поставить точку с запятой в конце командной строки.
‘что-то’ was not declared in this scope
Что за ошибка? Arduino IDE обнаружила в скетче слова, не являющиеся служебными или не были объявлены, как переменные. Например, вы забыли продекларировать переменную или задали переменную ‘DATA’, а затем по невнимательности используете ‘DAT’, которая не была продекларирована. Ошибка was not declared in this scope возникает при появлении в скетче случайных или лишних символов.
Например, на скриншоте выделено, что программист забыл продекларировать переменную ‘x’, а также неправильно написал функцию ‘analogRead’. Такая ошибка может возникнуть, если вы забудете поставить комментарий, написали функцию с ошибкой и т.д. Все ошибки также будут подсвечены, а при нескольких ошибках в скетче, сначала будет предложено исправить первую ошибку, расположенную выше.
exit status 1 ошибка компиляции для платы Arduino
Данная ошибка возникает, если вы подключаете в скетче библиотеку, которую не установили в папку libraries. Например, не установлена библиотека ИК приемника Ардуино: fatal error: IRremote.h: No such file or directory. Как исправить ошибку? Скачайте нужную библиотеку и распакуйте архив в папку C:Program FilesArduinolibraries. Если библиотека установлена, то попробуйте скачать и заменить библиотеку на новую.
Довольно часто у новичков выходит exit status 1 ошибка компиляции для платы arduino uno /genuino uno. Причин данного сообщения при загрузке скетча в плату Arduino Mega или Uno может быть огромное множество. Но все их легко исправить, достаточно внимательно перепроверить код программы. Если в этом обзоре вы не нашли решение своей проблемы, то напишите свой вопрос в комментариях к этой статье.
missing fqbn (fully qualified board name)
Ошибка возникает, если не была выбрана плата. Обратите внимание, что тип платы необходимо выбрать, даже если вы не загружаете, а, например, делаете компиляцию скетча. В Arduino IDE 2 вы можете использовать меню выбора:
— список плат, которые подключены и были идентифицированы Arduino IDE.
— или выбрать плату и порт вручную, без подключения микроконтроллера.
13-12-2020, 16:31
6 комментариев
Даже опытные программисты-«ардуинщики» могут столкнуться с ошибками компиляции. Исправить их не сложно, а вот найти порой не так просто. Мы решили рассказать сегодня в деталях, какие системные ошибки чаще возникают на различных платах Ардуино, как их исправить и по возможности избежать.
Для начала рассмотрим базовые, так называемые синтаксические ошибки. Они встречаются чаще всего у новичков, но и опытные электронщики с ними точно знакомы не понаслышке. Искать их обычно супер-просто – в Arduino IDE некорректный синтаксис выделяется построчно (таким образом значительно легче отыскать неточность в кодах). Обычно это: отсутствие скобки в конце команды, пропуск этой самой служебной команды или слова, нехватка важных функций, неправильное их написание и т.д.
Для быстрого поиска ошибки советуем рассмотреть строку-подсказку. Ничего не помогло? Тогда для вас наша подборка наиболее распространенных синтаксических ошибок:
С синтаксисом все понятно – вставляем пропущенные символы, убираем лишние знаки, возвращаем функции по умолчанию.
Напомним, в среде разработки Ардуино IDE можно заливать скетчи для различных микроконтроллеров. По умолчанию обычно указана плата Genuino Uno. Если вы работаете с Mega, следует выбрать именно эту платформу (меню «Сервис»), иначе вас ожидает неприятное предупреждение: “programmer is not responding”.
Ошибка компиляции для платы Arduino Uno чаще всего возникает из-за проблем, связанных с библиотеками, например, неправильно подключили, не то ПО инсталлировали. В этом случае вы увидите напоминание “fatal error: … No such file or directory” (библиотека не перенесена в папку libraries) или “redefinition of void setup”.
Обозначенная на скриншоте ERROR означает, что программирование завершилось некорректно (расшифровываем: внутренние проблемы с компилятором, не обновили версию IDE, сбой в библиотеке, неправильный выбор разрядности операционной системы и др.).
Важно! Не забывайте использовать подсказки приложения – они очень помогают. Включаем тут: Файл -> Настройки -> «Показать подробный вывод во время компиляции».
Что делать, если произошла ошибка при загрузке скетча Arduino Nano. Тут могут быть те же причины, что мы описали выше. Особых отличий в компиляции плат нет, главное, их правильный выбор первоначально. Однако часто пользователи настраивают не те показатели скорости порта: 9600 вместо необходимых 57600 либо не имеют соответствующих драйверов на устройствах – все это нужно проверить и исправить!
Содержание
- Синтаксические ошибки
- Ошибки компиляции плат Arduino uno
- Для чего нужна функция void setup()
- Ошибка exit status 1 при компиляции для плат uno, mega и nano
- Синтаксис void setup()
- Ошибки библиотек
- Ошибки компилятора Ардуино
- Примеры void setup()
- Основные ошибки
- Ошибка: «avrdude: stk500_recv(): programmer is not responding»
- Ошибка: «No such file or directory / exit status 1»
Синтаксические ошибки
Arduino — одна из самых удобных сред для начинающих инженеров, особенно программистов, потому что им не нужно проектировать свои системы управления и выполнять множество других действий.
Сразу после покупки они получают готовый набор библиотек на C99 и возможность при необходимости извлекать необходимые модули в открытых источниках.
Но и здесь не избежать многих проблем, которые знает каждый программист, и одна из самых неприятных — это ошибка компиляции платы Arduino nano, с которой вам придется столкнуться не один раз. Что означает эта линия, каковы причины ее появления, а главное, как быстро решить эту проблему?
Для начала стоит немного погрузиться в теорию, чтобы понять причину появления этой строчки с текстом и не грешить лишний раз, что Arduino uno не видит компьютер.
Как вы понимаете, компиляция означает преобразование кода C в машинный (двоичный) формат и преобразование нескольких функций в простые операции, чтобы их можно было выполнять через операнды встроенного процессора. Все это звучит достаточно просто, но сам процесс сборки намного сложнее, и поэтому во время этого процесса может возникнуть ошибка по десяткам причин.
Все мы привыкли, что код никогда не запускается с первого раза, и когда мы пытаемся запустить его в интерпретаторе, выскакивает десяток ошибок, которые нужно оперативно исправлять. Компилятор работает аналогично, за исключением того, что не всегда указываются причины ошибок. Поэтому рекомендуется сначала протестировать код в среде разработки, а уже потом начинать компилировать его в исполняемые файлы под Arduino.
Мы выяснили, к чему приводит этот процесс, давайте выясним, как это происходит:
- Первое, что делает компилятор, это загружает все включенные файлы, а также изменяет определенные определения на указанное для них значение. Следовательно, это необходимо, чтобы синтаксический синтаксический анализатор не проходил через один и тот же код несколько раз. Кроме того, в зависимости от среды компилятор может заменять функции вместо их объявления или делать это после передачи синтаксическим анализатором. В случае с C99 используется второй вариант реализации, но это не так важно.
- Затем проверьте основной синтаксис. Этот процесс выполняется в исходном скомпилированном файле, и какой-то парсер проверяет, были ли указанные функции описаны выше, подключены ли необходимые библиотеки и так далее. Он также проверяет, приводятся ли типы данных к определенным значениям для правильности. Не забывайте, что C99 использует строгую явную типизацию, и вы не можете помещать какие-либо буквальные значения в объявленную целочисленную строку. Если это замечено, сразу отобразится ошибка.
- В зависимости от среды разработки иногда можно протестировать код, который теперь будет скомпилирован в последний раз, запустив интерпретатор соответствующим образом.
- Последний представляет собой стек различных операций по преобразованию функций, базовых операндов и прочего в двоичный код, что может занять некоторое время. Кроме того, вся файловая структура переносится в исполняемый файл exe-шники и на этом компиляция завершается.
Как видите, процесс не так прост, как задумано, и в любой момент может возникнуть какая-то ошибка, которая прервет компиляцию. Проблема в том, что, в отличие от первых трех этапов, ошибки на последнем часто неявны, но все же не связаны с алгоритмом и логикой программы. В результате на их ремонт и очистку уходит гораздо больше времени.
Но синтаксические ошибки являются наиболее частой причиной возникновения ошибки компиляции платы Arduino nano в состоянии выхода 1. В этом случае процесс отладки часто бывает чрезвычайно простым.
Вам будет показана ошибка и строка, а также подсказка от оператора EXCEPTION, который не понравился синтаксическому анализатору. Будь то запятая или незамкнутые функциональные скобки, проблема загрузки в плату Arduino все равно возникнет.
Решение предельно простое и логичное: найти и исправить синтаксис, который не нравится машине. Часто эти сообщения появляются группами, как при тестировании, так и при компиляции, поэтому можно «заблокировать» разработку более одного раза.
Не бойтесь этого — это нормальный процесс. Все претензии отображаются на английском языке, например, часто можно увидеть следующее: не было заявлено в этой области. Что это за ошибка ардуино — на самом деле ответ уже скрыт в сообщении. Функция или переменная просто не были объявлены в области видимости.
Ошибки компиляции плат Arduino uno
Еще одна распространенная ошибка пользователей, которая вызывает вопросы, например, что делать, если Arduino не видит порт, заключается в том, что вы просто забываете настроить среду разработки. IDE Arduino была создана для всех типов плат, но, как мы указали, на каждый контроллер помещается только ограниченное количество библиотек, и их содержимое может быть разным.
Следовательно, если в меню среды вы выбрали компиляцию для неправильного MK, вероятно, вызываемая функция или метод просто не найдены в постоянной памяти, что возвращает ошибку. Как правило, в настройках указывается плата Arduino uno, поэтому не забывайте ее менять. И обратная ситуация может быть причиной проблемы с загрузкой на плату на Arduino.
Для чего нужна функция void setup()
Скачивая программу, Arduino дает возможность нашему коду участвовать в инициализации системы. Для этого нам нужно сообщить микроконтроллеру команды, которые он будет выполнять при запуске, а затем забыть о них (т.е эти команды будут выполняться только один раз при запуске системы). И для этой самой цели в нашей с вами программе нам нужно выбрать блок, в котором будут храниться эти команды void setup (), а точнее пространство внутри фигурных скобок этой функции, является таким местом внутри скетча Ардуино.
Ошибка exit status 1 при компиляции для плат uno, mega и nano
И наиболее частым сообщением для пользователей, которое появляется в среде разработки, является exit 1. И это наиболее неудобно для отладки приложения, потому что здесь нужно учитывать почти ядро системы, чтобы понять, в чем заключается злополучное зрелище.
В документации указано, что это сообщение указывает на то, что Arduino ide не запускается в требуемой конфигурации, но на самом деле существует еще дюжина случаев, когда вы увидите это сообщение. Однако на самом деле не забудьте проверить системный бит, IDE и посмотреть, какие библиотеки доступны для справки в данный момент.
Синтаксис void setup()
В этом примере слово setup — это имя функции. Именно так и нужно писать именно в этом регистре. Слово перед именем описывает тип возвращаемых данных. В этом случае подпрограмма не возвращает никаких данных, поэтому нам нужно указать слово void. Все команды должны быть заключены в фигурные скобки {}.
Не забудьте поставить подтяжки! Потеря хотя бы одной круглой скобки сразу сделает всю программу непонятной для arduino. Но даже не ставьте лишние скобки — это тоже приведет к ошибке.
Ошибки библиотек
Если при компиляции скетча Arduino произошла ошибка, но ни одно из вышеперечисленных сообщений не отображалось, можно смело искать ошибку в библиотеках MK. Это самая неприятная задача для большинства программистов, ведь приходится залезать в чужой код, а без этого не обойтись.
Ведь банальная причина может заключаться в устаревшем синтаксисе загруженного плагина, а чтобы он заработал, его нужно переписывать практически с нуля. Это единственный выход из сложившейся ситуации. Но бывают и более приземленные ситуации, когда вы связали библиотеку, функции которой никогда не вызывались, или вы просто перепутали имя.
Ошибки компилятора Ардуино
Ранее последний стек действий упоминался при запуске кода через компилятор, а сейчас могут возникнуть самые страшные ошибки — ошибки в самой IDE. Здесь не может быть конкретного решения. Вам никто не запрещает зайти в самое сердце системы и самому там все проверить, но гораздо эффективнее будет вернуться к предыдущей версии программы или, наоборот, обновить.
Примеры void setup()
Чаще всего в пустой конфигурации указываются следующие инструкции:
- pinMode с указанием номера и типа контакта. Эта инструкция определяет режим работы выводов ардуино.
- Serial.begin с указанием скорости (чаще всего 9600). Эта инструкция инициализирует работу последовательного порта на указанной скорости.
- Инструкция по подключению и инициализации различных объектов библиотек arduino. Например, servo.atach (6) сообщит библиотеке, что мы подключили сервопривод к выводу 9, и код библиотеки будет выполнять все последующие действия только с этим портом.
- Инициализация глобальных переменных, если по какой-то причине это невозможно сделать при определении переменных в глобальной области видимости.
- Задайте другие настройки и начальные значения для переменных и объектов.
Если говорить о переопределении ошибки конфигурации вакуума, то она возникает, если мы подключаем модуль или скетч, в котором уже есть эта функция. Вот что вызывает ошибку
Основные ошибки
Ошибка: «avrdude: stk500_recv(): programmer is not responding»
Посмотрим, что у нас за карта? Какой порт мы используем? Сообщите arduino о правильной карте и порте. Возможно, вы используете Nano, и указано Mega. Возможно, вы указали неправильный порт. Все это приводит к сообщению: «программист не отвечает».
Решение:
В Arduino IDE в меню «Сервис» выберите плату. В меню «Сервис → Последовательный порт» выберите порт.
Ошибка: «No such file or directory / exit status 1»
Включенной библиотеки нет в папке библиотек.
Решение:
Скачайте нужную библиотеку и скопируйте ее в папку с программой — например, C: Program Files Arduino libraries. Если есть библиотека, замените файлы в папке.