Народ помогите! Виснет железо. I2C on Arduino Nano or Mega. Truble!!!

kozusev
Offline
Зарегистрирован: 30.10.2012

Все привет. Вот этот скетч заливаю на Мегу2560 и на Нано 328р. На меге работает без проблем, а вот на Нано через 2-3 клика виснет и в сериал в процессе ничего не шлёт. И там и там по I2C клава и LCD одни и теже адреса...

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <i2ckeypad.h>
#include <SPI.h>

// 0123456789012345

char* menu_1_rom[100] = {
  // 0123456789012345
  "SYSTEM MODE     ",//0
  "PAUSE TURN ON   ",//1
  "PREPARATION     ",//2
  "PAUSE CLOSED    ",//3
  "PAUSE TURN OFF  ",//4
  "SLEEP MODE ON   ",//5
  "BEPER           ",//6
  "AUTOMATIC       ",//7  
  "SPECIFIC GRAVITY",//8
  "V(sm/q)FLOWMETER",//9    
  "Turns/Min MOTOR ",//10   
  "CORECTION       ",//11 
  "SPECIFIC GRAVITY",//12  
  "V(sm/q)FLOWMETER",//13
  "Turns/Min MOTOR ",//14 
  "CORECTION       ",//15 
  "SOOTNOSHENIE    ",//16 
  "DLITELNOST      ",//17
  "MASS POLYOL     ",//18 
  "MASS ISOCYANAT  ",//19
  "   AUTOMATIC    ",//20  
  "PROGRAM    PR-01",//21
  "PROGRAM    PR-02",//22
  "PROGRAM    PR-03",//23
  "PROGRAM    PR-04",//24
  "PROGRAM    PR-05",//25
  "PROGRAM    PR-06",//26
  "PROGRAM    PR-07",//27
  "PROGRAM    PR-08",//28
  "PROGRAM    PR-09",//29
  "PROGRAM    PR-10",//30
  "PROGRAM    PR-11",//31
  "PROGRAM    PR-12",//32
  "PROGRAM    PR-13",//34
  "PROGRAM    PR-14",//35
  "PROGRAM    PR-15",//36
  "PROGRAM    PR-16",//37
  "PROGRAM    PR-17",//38
  "PROGRAM    PR-18",//39
  "PROGRAM    PR-19",//40
  "PROGRAM    PR-20",//41
  "PROGRAM    PR-21",//42
  "PROGRAM    PR-22",//43
  "PROGRAM    PR-23",//44
  "PROGRAM    PR-24",//45
  "PROGRAM    PR-25",//46
  "PROGRAM    PR-26",//47
  "PROGRAM    PR-27",//48
  "PROGRAM    PR-28",//49
  "PROGRAM    PR-29",//50
  "PROGRAM    PR-30" //51  
};

char* menu_2_rom[100] = {
  "SYSTEM",         //0
  "high pressure   ",//1
  "components      ",//2
  "big pisston     ",//3
  "high pressure   ",//4
  "system          ",//5
  "finish injection",//6  
  "auto pump load  ",//7  
  "POLYOL ",         //8
  "POLYOL ",         //9
  "POLYOL in 50Hz",//10     
  "pump POLYOL   ",  //11 
  "ISOCYANAT ",      //12
  "ISOCYANAT ",      //13
  "ISOCYNAT in 50Hz",//14       
  "pump ISOCYANAT",//15   
  "component. A:100",//16 
  "colibration",     //17
  "before colibration", //18
  "before colibration", //19
  "   PROGRAMMS    ",//20 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g.",//21 
  "weight detail g." //51 
};

LiquidCrystal_I2C lcd(0x3f,16,4);
i2ckeypad kpd = i2ckeypad(0x3b, 4, 4);

char my_key;
long boud = 115200;

int i;

uint8_t data_spi_1;

int pinIN_FREQ_R[2] = {
  2,3}; // INT0, INT1
int pinOUT_ANALOG_L[2] = {
  5,6};
char pinIN_ANALOG[6] = {
  A0,A1,A2,A3,A6,A7};

int ss_ETH = 10;
int ss_USB = 4;
int ss_SPI_IN = 8;
int ss_SPI_OUT = 9;
int rs485_RTS = 7; // serial
int SDA_SCL; // A4 A5
int pin_STATUS = 53;
int pin_LED = 13;

void pin_init(){
  for (int i=0; i <= 2; i++){
    pinMode(pinIN_FREQ_R[i],OUTPUT);
    digitalWrite(pinIN_FREQ_R[i], LOW);
  } 
  pinMode(ss_ETH,OUTPUT);
  digitalWrite(ss_ETH, LOW);

  pinMode(ss_USB,OUTPUT);
  digitalWrite(ss_USB, LOW);

  pinMode(ss_SPI_IN,OUTPUT);
  digitalWrite(ss_SPI_IN, LOW);

  pinMode(ss_SPI_OUT,OUTPUT);
  digitalWrite(ss_SPI_OUT, LOW);

  pinMode(rs485_RTS,OUTPUT);
  digitalWrite(rs485_RTS, LOW);
}

void setup() {
  pin_init();
  Wire.begin();

  Serial.begin(boud);

  lcd.init();
  kpd.init();

  Serial.println("Init compleate");
  lcd.print("Init compleate");
}

int ii;

void loop() {

  my_key = kpd.get_key();
  if (my_key != '\0') {
    lcd.clear();
    lcd.print(my_key);
    lcd.print(menu_1_rom[ii]);
    lcd.print(menu_2_rom[ii]);
    Serial.print(my_key);    
    Serial.print(menu_1_rom[ii]);
    ii++;
  }
}

 

Looka
Offline
Зарегистрирован: 24.04.2012

верный признак нехватки памяти...... 

ourlive
Offline
Зарегистрирован: 26.05.2012

Много текстокой избыточной инфы, для начала сократите неиспользуемые пункты меню до одного символа. А если не поможет, и вовсе сократите количество строчных переменных.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

лучше хранить данные во флеше, так как они не меняются, вот только как загнать. думаю может текст записать кодами ascii и считывать их из массива. оперативку точно освободит

#include <avr/pgmspace.h>

 

kozusev
Offline
Зарегистрирован: 30.10.2012

Спасибо народ! Направили на верный путь. Я и забыл про то что нужно контролировать память. Загнал масивы во Flash и всё работает как часы. "В чём сила брат?. В народе сила!" ))))) Спасибо ещё раз.

ales2k
Offline
Зарегистрирован: 25.02.2013

Кстати новый релиз IDE 1.5.6 умеет контролить оперативку для глоб переменных