EEPROM и Serial

Тема в разделе "Arduino & Shields", создана пользователем Slav4ik.ru, 9 дек 2017.

Метки:
  1. Суббота или воскресенье?
     
  2. Slav4ik.ru

    Slav4ik.ru Нерд

    в val2 пишется 0, а почему?
     
  3. Slav4ik.ru

    Slav4ik.ru Нерд

    Да я в Сургуте, у нас +2 часа от Москвы)
     
  4. Я в Украине, у меня почти 11 вечера, суббота.
    От вал2 предлагаю избавится, она не нужно ты записываешь и сразу считываешь значение из еепром
     
  5. Igor68

    Igor68 Гуру

    Конечно не так осведомлён именно на Arduino... но применял вот это:
    Код (C++):
    void serialEvent()
    {
         MRTU_rWORK(); //моя функция приёма по сериал
    }
     
    и Задержку ставил в цикле loop - хоть ка мне говорили идея "delay" не очень.
     
  6. Slav4ik.ru

    Slav4ik.ru Нерд

    Вот так сделал, ввожу любое число, а в сериал 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);
    }
    }
     
  7. Igor68

    Igor68 Гуру

    что-то тут не то вот с этим:
    Код (C++):
    val = atoi(input);
    Должен быть указатель на строку символов... типа этого:
    Код (C++):
    char intut[4];
    memset(&input[0],0,4);
    ...
    //тут  где-то заполняем строку приёмом
    ....
    val = atoi(&input[0]); //получаем значение
     
     
  8. Slav4ik.ru

    Slav4ik.ru Нерд

    Вот так прокатило)
    в ЕЕПРОМ ПИШЕТСЯ, теперь пробую допилить код, чтоб если ни чего нет по ком порту, то он брал данные из еепром
    Код (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);
    }
    }
     
    Последнее редактирование: 10 дек 2017
    Igor68 нравится это.
  9. Igor68

    Igor68 Гуру

    Да, конечно прокатит прокатит ведь вы взяли байт, а не число из принятой строки...
    (насколько я понял Вы вообще на это забили)
    Замените delay(val * 1000) на delay(val2 * 1000), а
    val2 = EEPROM.read(0);//прочитали из нее записанное и можем делать что угодно
    поставьте вне условии приёма по сериал порту. ну пусть будет допустим перед
    buttonState = digitalRead(PinIn); // считываем значения с входа кнопки
    и параметр будет прочитан в независимости от приёма данных.
     
  10. Slav4ik.ru

    Slav4ik.ru Нерд

    Да байт меня вполне устраивает) делей да согласен исправлю) По val2, понял, спасибо!
    А вот, подскажите пожалуйста, как бы сделать, чтоб не дожидаться числа по ком порту, а сразу его получить из еепром?
     
  11. Slav4ik.ru

    Slav4ik.ru Нерд

    Код (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);
    }
    }
    Опа, и мозг включился) Как то так получилось!
     
    Igor68 нравится это.
  12. Slav4ik.ru

    Slav4ik.ru Нерд

    А теперь с вашего позволения, продолжу глупые вопросы:
    Хочу до 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){
        }
        }
      }
     
  13. ostrov

    ostrov Гуру

    Потому что это два вложенных друг в друга условия.

    И используйте put и get. Сэкономите ресурс.
     
  14. Slav4ik.ru

    Slav4ik.ru Нерд

    Ой, условия и не заметил... Про put и get буду читать, и вникать! Спасибо!
     
  15. Условия..... Только что пришел с олимпиады по программированию. Так там были такие задачи.... Там приходилось даже такое вложенные условия делать аж 3 степени. if в if, а в нем ещё один if
     
  16. Arduiner001

    Arduiner001 Гик

    Я не понял, как вы собираетесь записывать числа больше 9 в ячейки? Вот кодировка ASCII:
    [​IMG]
    Каждый символ, который вы отправите в порт - это отдельный байт. Например, текст "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-б, старший байт отрубается
    //...
     
  17. Slav4ik.ru

    Slav4ik.ru Нерд

    Крутяк! Эх почему я в молодости не занимался программированием... Сейчас всё дается на порядок сложнее(
     
  18. Slav4ik.ru

    Slav4ik.ru Нерд

    Спасибо! Но пока числа второстепенная стадия обучения)
     
  19. Slav4ik.ru

    Slav4ik.ru Нерд

    Господа, и возможно дамы, а есть ли опыт с onewire.h? Или лучше отдельный пост создать?
     
    Последнее редактирование: 10 дек 2017
  20. А что это?