Внимание! Две функции в одном цикле.
- Войдите на сайт для отправки комментариев
Пнд, 29/01/2018 - 20:29
Не правильно работает функция "void Battery()" в главном цикле "void loop()".
Или может работать не стабильно.
Когда отключить (закоментиравать) "mainScreen()" то "void Battery()" работает отлично!
Помогите подружить две функции.
#include <Wire.h> #include <Adafruit_BMP085.h> #include <OLED_I2C.h> Adafruit_BMP085 bmp; OLED myOLED(SDA, SCL, 8); extern uint8_t MediumNumbers[]; extern uint8_t batteryh0_16[]; extern uint8_t batteryh1_16[]; extern uint8_t batteryh2_16[]; extern uint8_t batteryh3_16[]; extern uint8_t batteryh4_16[]; uint8_t i=0; float P; void setup(){ myOLED.begin(); bmp.begin(); } void loop(){ //Одно из двух! Если одновременно то "Battery();" работать не хочет! mainScreen(); Battery(); } void Battery(){ while(millis()%500==0){ i++; if(i>4){i=0;} switch(i){ case 0: myOLED.drawBitmap(110, 0, batteryh0_16, 16, 16); break; case 1: myOLED.drawBitmap(110, 0, batteryh1_16, 16, 16); break; case 2: myOLED.drawBitmap(110, 0, batteryh2_16, 16, 16); break; case 3: myOLED.drawBitmap(110, 0, batteryh3_16, 16, 16); break; case 4: myOLED.drawBitmap(110, 0, batteryh4_16, 16, 16); break; } myOLED.update(); } } void mainScreen(){ myOLED.setFont(MediumNumbers); myOLED.print(String(bmp.readTemperature() , 1), 15, 15); P=bmp.readPressure(); P=(float)0.0075*P; myOLED.print(String(P , 1), 15, 40); myOLED.update(); }
Это дополнительный файл с расширением "с" поместить в папку скодом.
#if defined(__AVR__) #include <avr/pgmspace.h> #define imagedatatype const uint8_t #endif imagedatatype batteryh0_16[] PROGMEM={ 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0xC0, // 0x0010 (16) pixels 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x03, // 0x0020 (32) pixels }; imagedatatype batteryh1_16[] PROGMEM={ 0xF0, 0x10, 0xD0, 0xD0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0xC0, // 0x0010 (16) pixels 0x0F, 0x08, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x03, // 0x0020 (32) pixels }; imagedatatype batteryh2_16[] PROGMEM={ 0xF0, 0x10, 0xD0, 0xD0, 0x10, 0xD0, 0xD0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xF0, 0xC0, // 0x0010 (16) pixels 0x0F, 0x08, 0x0B, 0x0B, 0x08, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x03, // 0x0020 (32) pixels }; imagedatatype batteryh3_16[] PROGMEM={ 0xF0, 0x10, 0xD0, 0xD0, 0x10, 0xD0, 0xD0, 0x10, 0xD0, 0xD0, 0x10, 0x10, 0x10, 0x10, 0xF0, 0xC0, // 0x0010 (16) pixels 0x0F, 0x08, 0x0B, 0x0B, 0x08, 0x0B, 0x0B, 0x08, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x03, // 0x0020 (32) pixels }; imagedatatype batteryh4_16[] PROGMEM={ 0xF0, 0x10, 0xD0, 0xD0, 0x10, 0xD0, 0xD0, 0x10, 0xD0, 0xD0, 0x10, 0xD0, 0xD0, 0x10, 0xF0, 0xC0, // 0x0010 (16) pixels 0x0F, 0x08, 0x0B, 0x0B, 0x08, 0x0B, 0x0B, 0x08, 0x0B, 0x0B, 0x08, 0x0B, 0x0B, 0x08, 0x0F, 0x03, // 0x0020 (32) pixels };
ошибка в строке 24.
При отсчете временных интервалов НИКОГДА не используйте строгое равенство. Как только вы добавляете MainScreen() -моменты повторных вызовов Battery() перестают точно попадать на 500миллисекунд - и функция перестает запускаться или запускается через раз.
Не правильно работает функция "void Battery()" в главном цикле "void loop()".
Так она просто "не правильно" написана. А так как написана - работает вполне правильно.
Вы можете объснить словами, что у Вас написано в строке 24?
Как только до Вас дойдёт что там на самом деле написано, Вы всё исправите.
ошибка в строке 24.
При отсчете временных интервалов НИКОГДА не используйте строгое равенство. Как только вы добавляете MainScreen() -моменты повторных вызовов Battery() перестают точно попадать на 500миллисекунд - и функция перестает запускаться или запускается через раз.
Пожалуйста, посоветуйте тогда как правильно оформить цикл для функции "Battery()".
Не правильно работает функция "void Battery()" в главном цикле "void loop()".
Так она просто "не правильно" написана. А так как написана - работает вполне правильно.
Вы можете объснить словами, что у Вас написано в строке 24?
Как только до Вас дойдёт что там на самом деле написано, Вы всё исправите.
Выполняем код в теле оператора while через каждые 300 мс.
Но другого решения явтоматического цикла без "delay()" найти не могу.
Может Вы подскажите!
Выполняем код в теле оператора while через каждые 300 мс.
В коде не 300, а 500 вроде. Следующий наводящий вопрос - что будет, если выполнение кода функции MainScreen() займет, например, 501 мс?
Я не уверен, но как вариант
Я не уверен, но как вариант
не, это не нужно, у него i - глобальная
Я не уверен, но как вариант
Тоже само.
значит замени вывод с экрана на вывод в serial.
значит замени вывод с экрана на вывод в serial.
Зачем мне serial?
Что бы убедится что у вас ошибка в структуре программы или в организации вывода. Разделяй и властвуй это эфективный прием на 4 этапе- заливка скетча и поиск ошибок в нем.