Arduino UNO Atmega 328P зависает
- Войдите на сайт для отправки комментариев
Чт, 08/02/2018 - 22:32
Моя ардуинка получает данные с пк, парсит массив и выводит на экран 128x64 px. Она может работать около часа без нареканий, но потом значения повисают. У ардуинки может что то копиться в кеше или по каким причинам она может повисать? После ребута продолжает работать штатно.
щас все достанут хрустальные шары и будут изучать ваш код...
Я думал может есть какая то общая проблема(
#include <IRremote.h> #include <U8glib.h> #include <TimerOne.h> //display U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI char inData[82]; // массив входных значений (СИМВОЛЫ) int PCdata[20]; // массив численных значений показаний с компьютера int reciverPin = 2; // пин, к котрому подключен ИК-приемник IRrecv irrecv(reciverPin); decode_results results; /* * 16753245 CH- * 16736925 CH * 16769565 CH+ */ byte index = 0; String string_convert; unsigned long timeout, uptime_timer, plot_timer; boolean updateDisplay_flag, updateTemp_flag, timeOut_flag = 1; //byte plotLines[] = {0, 1, 4, 5, 6, 7}; /* * PC data * 0-CPU temp * 1-GPU temp * 4-CPU load * 5-GPU load * 6-RAM load * 7-GPU memory */ uint8_t draw_state = 0; void draw(void){ // graphic commands u8g.setFont(u8g_font_unifont); //u8g.setFont(u8g_font_6x10); //u8g.setFont(u8g_font_osb21); u8g.drawStr( 0, 14, "CPU"); u8g.setPrintPos(60, 14); u8g.print(PCdata[4]); u8g.drawStr( 80, 14, "%"); u8g.setPrintPos(100, 14); u8g.print(PCdata[0]); u8g.drawStr( 120, 14, "C"); u8g.drawStr( 0, 30, "RAM"); u8g.setPrintPos(100, 30); u8g.print(PCdata[6]); u8g.drawStr( 120, 30, "%"); u8g.drawRFrame(40, 20, 50, 10, 0); int ramBar; if(PCdata[6] >= 4) {ramBar = PCdata[6] / 2; u8g.drawRBox(40, 20, ramBar, 10, 0);} u8g.drawStr( 0, 46, "GPU"); u8g.setPrintPos(60, 46); u8g.print(PCdata[5]); u8g.drawStr( 80, 46, "%"); u8g.setPrintPos(100, 46); u8g.print(PCdata[1]); u8g.drawStr( 120, 46, "C"); u8g.drawStr( 0, 62, "GRAM"); u8g.setPrintPos(100, 62); u8g.print(PCdata[7]); u8g.drawStr( 120, 62, "%"); u8g.drawRFrame(40, 52, 50, 10, 0); int gramBar; if(PCdata[7] >= 4) {gramBar = PCdata[7] / 2; u8g.drawRBox(40, 52, gramBar, 10, 0);} } //All Data from PCdata[] void drawData (void) {u8g.setFont(u8g_font_unifont); int i = 0; for(int y = 14; y <= 64; y = y +16) { for(int x = 0; x <=120; x = x + 25) { u8g.setPrintPos(x,y); u8g.print(PCdata[i]); i++; } } //u8g.drawStr(PCdata[i]) } void setup() { results.value = 16753245; Serial.begin(9600); Timer1.initialize(40); irrecv.enableIRIn(); // запуск приемника if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } } void loop() { // постоянно считываем данные с приемника if (irrecv.decode(&results)) { // выводим в консольку, что получили, число в 16-ричном виде Serial.println(results.value); irrecv.resume(); // готовы принимать следующий сигнал } u8g.firstPage(); do { parsing(); if(results.value == 16769565) {drawData();} else {draw();} } while( u8g.nextPage() ); // rebuild the picture after some delay //delay(50); } void parsing() { while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; updateDisplay_flag = 1; updateTemp_flag = 1; } timeout = millis(); timeOut_flag = 1; } }Я думал может есть какая то общая проблема(
Есть такая - выход за границы массива.
У вас, например, в функции parsing() - переменная index инкрементируется без всякой проверки того, что index не вышел за границу массива inData[] . Я не говорю, что дело именно в этом - но вероятность есть. Проверку выхода индекса за пределы нужно предусматривать всегда, такой "беззаботный" код не допустим.
Строго говоря, в документации к U8Glib недвусмысленно сказано - НИКАКИХ долгих действий внутри цикла отрисовки. А у вас там вызывается parsing() зачем-то.
К тому же перерисовывать экран с такой дикой частотой - зачем? У вас там данные, меняющиеся с космической скоростью? Перерисовывать экран (это медленная операция) надо только тогда, когда что-то для отображения на активном экране изменилось.