Arduino UNO Atmega 328P зависает

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Моя ардуинка получает данные с пк, парсит массив и выводит на экран 128x64 px. Она может работать около часа без нареканий, но потом значения повисают. У ардуинки может что то копиться в кеше или по каким причинам она может повисать? После ребута продолжает работать штатно.

vvadim
Offline
Зарегистрирован: 23.05.2012

щас все достанут хрустальные шары и будут изучать ваш код...

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Я думал может есть какая то общая проблема(

 

#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;
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

DmitryFeniks пишет:

Я думал может есть какая то общая проблема(

Есть такая - выход за границы массива.

У вас, например, в функции parsing() - переменная index инкрементируется без всякой проверки того, что index не вышел за границу массива inData[] . Я не говорю, что дело именно в этом - но вероятность есть. Проверку выхода индекса за пределы нужно предусматривать всегда, такой "беззаботный" код не допустим.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Строго говоря, в документации к U8Glib недвусмысленно сказано - НИКАКИХ долгих действий внутри цикла отрисовки. А у вас там вызывается parsing() зачем-то.

К тому же перерисовывать экран с такой дикой частотой - зачем? У вас там данные, меняющиеся с космической скоростью? Перерисовывать экран (это медленная операция) надо только тогда, когда что-то для отображения на активном экране изменилось.