Я в Украине, у меня почти 11 вечера, суббота. От вал2 предлагаю избавится, она не нужно ты записываешь и сразу считываешь значение из еепром
Конечно не так осведомлён именно на Arduino... но применял вот это: Код (C++): void serialEvent() { MRTU_rWORK(); //моя функция приёма по сериал } и Задержку ставил в цикле loop - хоть ка мне говорили идея "delay" не очень.
Вот так сделал, ввожу любое число, а в сериал 0 падает... По задержке потом гляну, как правильно делать) Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> int val; char input; int val2; int PinLed = 13; int PinIn = 8; int buttonState = 0; // переменная для хранения состояния кнопки void setup(){ Serial.begin(9600); pinMode(PinLed, OUTPUT); // устанавливает режим работы - выход pinMode(PinIn,INPUT); //Устанавливает режим работы - вход } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 input = Serial.read();//прочитали число val = atoi(input); EEPROM.write(0, val);//записали в первую ячейку (0) //val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно Serial.println (val); } buttonState = digitalRead(PinIn); // считываем значения с входа кнопки if (buttonState == HIGH) { digitalWrite(PinLed, HIGH); // включаем delay(val * 1000); digitalWrite(PinLed, LOW); } }
что-то тут не то вот с этим: Код (C++): val = atoi(input); Должен быть указатель на строку символов... типа этого: Код (C++): char intut[4]; memset(&input[0],0,4); ... //тут где-то заполняем строку приёмом .... val = atoi(&input[0]); //получаем значение
Вот так прокатило) в ЕЕПРОМ ПИШЕТСЯ, теперь пробую допилить код, чтоб если ни чего нет по ком порту, то он брал данные из еепром Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> int val; char input; int val2; int PinLed = 13; int PinIn = 8; int buttonState = 0; // переменная для хранения состояния кнопки void setup(){ Serial.begin(9600); pinMode(PinLed, OUTPUT); // устанавливает режим работы - выход pinMode(PinIn,INPUT); //Устанавливает режим работы - вход } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 input = Serial.parseInt();//прочитали число val = byte(input); EEPROM.write(0, val);//записали в первую ячейку (0) val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно Serial.println (val2); } buttonState = digitalRead(PinIn); // считываем значения с входа кнопки if (buttonState == HIGH) { digitalWrite(PinLed, HIGH); // включаем delay(val * 1000); digitalWrite(PinLed, LOW); } }
Да, конечно прокатит прокатит ведь вы взяли байт, а не число из принятой строки... (насколько я понял Вы вообще на это забили) Замените delay(val * 1000) на delay(val2 * 1000), а val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно поставьте вне условии приёма по сериал порту. ну пусть будет допустим перед buttonState = digitalRead(PinIn); // считываем значения с входа кнопки и параметр будет прочитан в независимости от приёма данных.
Да байт меня вполне устраивает) делей да согласен исправлю) По val2, понял, спасибо! А вот, подскажите пожалуйста, как бы сделать, чтоб не дожидаться числа по ком порту, а сразу его получить из еепром?
Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> int val; char input; int val2; int PinLed = 13; int PinIn = 8; int buttonState = 0; // переменная для хранения состояния кнопки void setup(){ Serial.begin(9600); pinMode(PinLed, OUTPUT); // устанавливает режим работы - выход pinMode(PinIn,INPUT); //Устанавливает режим работы - вход } void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 input = Serial.parseInt();//прочитали число val = byte(input); EEPROM.write(0, val);//записали в первую ячейку (0) Serial.println (EEPROM.read(0)); if (val2 != 0 || val2 != 255){ }}else{ val == val2; } val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно buttonState = digitalRead(PinIn); // считываем значения с входа кнопки if (buttonState == HIGH) { digitalWrite(PinLed, HIGH); // включаем delay(val2 * 1000); digitalWrite(PinLed, LOW); } } Опа, и мозг включился) Как то так получилось!
А теперь с вашего позволения, продолжу глупые вопросы: Хочу до 100 в одну ячейку писать, после 100 в другую, ну и соответственно выдавать в порт разные надписи) А Ардуинка не хочет слушаться моих команд странных, где ошибся? Код (C++): void loop(){ if (Serial.available() > 0) { //если число передали то значение больше 0 input = Serial.parseInt();//прочитали число val = byte(input); if (val > 0 && val < 100) { EEPROM.write(0, val); //записали в нолевую ячейку (0) Serial.print ("Время работы "); Serial.print ( EEPROM.read(1)); Serial.println (" Сек."); if (val > 100 && val < 102) { EEPROM.write(1, val); //записали в первую ячейку (0) Serial.print ("режим работы "); Serial.print ( EEPROM.read(1)); Serial.println (" Сек."); //if (val2 != 0 || val2 != 255){ } } }
Условия..... Только что пришел с олимпиады по программированию. Так там были такие задачи.... Там приходилось даже такое вложенные условия делать аж 3 степени. if в if, а в нем ещё один if
Я не понял, как вы собираетесь записывать числа больше 9 в ячейки? Вот кодировка ASCII: Каждый символ, который вы отправите в порт - это отдельный байт. Например, текст "255" будет длиной в три байта, да ещё и символ перевода строки, который отправляет Arduino IDE, в сумме четыре. Получается, что последовательность будет такой: 1. Arduino приняла 2 (код 50) 2. Arduino записала (50 - 48 = 2) в ячейку 0 3. Arduino приняла 5 (код 53) 4. Arduino записала (50 - 48 = 5) в ячейку 0 5. Arduino приняла 5 (код 53) 6. Arduino записала (50 - 48 = 5) в ячейку 0 7. Arduino приняла NL (код 10) 8. Arduino записала (10 - 48 = -38, но у нас ячейка типа uint8_t, так что 255 - 38 = 217) в ячейку 0 В итоге после всего этого в ячейке должно оказаться 217. Вот код, который считывает число до NL и записывает его. Число может быть 0-65535. Код (C++): //... Serial.setTimeout(1); uint16_t val = (uint16_t)Serial.parseInt(); Serial.flush(); EEPROM.write(0, (uint8_t)(val << 8)); //записываем старший байт EEPROM.write(1, (uint8_t)val); //записываем младший байт. Особенность такова, что при приведении 16-б. числа к 8-б, старший байт отрубается //...
Крутяк! Эх почему я в молодости не занимался программированием... Сейчас всё дается на порядок сложнее(