Народ помогите! Виснет железо. I2C on Arduino Nano or Mega. Truble!!!
- Войдите на сайт для отправки комментариев
Пт, 04/04/2014 - 18:08
Все привет. Вот этот скетч заливаю на Мегу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++;
}
}
верный признак нехватки памяти......
Много текстокой избыточной инфы, для начала сократите неиспользуемые пункты меню до одного символа. А если не поможет, и вовсе сократите количество строчных переменных.
лучше хранить данные во флеше, так как они не меняются, вот только как загнать. думаю может текст записать кодами ascii и считывать их из массива. оперативку точно освободит
Спасибо народ! Направили на верный путь. Я и забыл про то что нужно контролировать память. Загнал масивы во Flash и всё работает как часы. "В чём сила брат?. В народе сила!" ))))) Спасибо ещё раз.
Кстати новый релиз IDE 1.5.6 умеет контролить оперативку для глоб переменных