Как сохранить последнее значение

Тема в разделе "Arduino & Shields", создана пользователем stikoff, 2 июн 2015.

  1. stikoff

    stikoff Нерд

    имеется код
    Код (Text):
    //pins for the LEDs:
    const int redPin = 3;
    const int greenPin = 5;
    const int bluePin = 6;

    const int redPin2 = 9;
    const int greenPin2 = 10;
    const int bluePin2 = 11;

    #define REDPIN 3
    #define GREENPIN 5
    #define BLUEPIN 6

    #define FADESPEED 5

    void setup() {
    // initialize serial:
    Serial.begin(9600);

    // make the pins outputs:
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    pinMode(redPin2, OUTPUT);
    pinMode(greenPin2, OUTPUT);
    pinMode(bluePin2, OUTPUT);

    Serial.print("Arduino control RGB LEDs Connected OK ( Sent From Arduinno Board )");
    Serial.print('\n');
    }

    void loop() {

    // if there's any serial available, read it:
    while (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    int red2 = Serial.parseInt();
    // do it again:
    int green2 = Serial.parseInt();
    // do it again:
    int blue2 = Serial.parseInt();

    // look for the newline. That's the end of your
    // sentence:
    if (Serial.read() == '\n') {
             
      // constrain the values to 0 - 255 and invert
      // if you're using a common-cathode LED, just use "constrain(color, 0, 255);"
     
      // This is for COMMON ANODE
      //red = 255 - constrain(red, 0, 255);
      //green = 255 - constrain(green, 0, 255);
      //blue = 255 - constrain(blue, 0, 255);
     
      red = constrain(red, 0, 255);
      green = constrain(green, 0, 255);
      blue = constrain(blue, 0, 255);
     
      red2 = constrain(red2, 0, 255);
      green2 = constrain(green2, 0, 255);
      blue2 = constrain(blue2, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);
     
      analogWrite(redPin2, red2);
      analogWrite(greenPin2, green2);
      analogWrite(bluePin2, blue2);

      // print the three numbers in one string as hexadecimal:
        Serial.print("Data Response : ");
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
    }

    }
     
    подключаю ардуино к смартфону по ЮСБ выбираю цвет РГБ светодиода. После отключения смартфона все сбивается. Возможно в коде можно что-то дописать чтобы значение сохранялось в памяти ардуино после отключения от смарта ?
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Сохраните данные в EEPROM.
     
  3. stikoff

    stikoff Нерд

    извините а можно более подробно ?
     
  4. geher

    geher Гуру

    В начало скетча
    #include <EEPROM.h>
    В setup() после задания режима пинов

    red = EEPROM.read(1);
    analogWrite(redPin, red);

    Поскольку значение 0-255 хватит и одной ячейки EEPROM для каждого цвета.
    Для других цветов аналогично, только указать в качестве номера ячейки не 1, а что-то другое.

    В loop() после строки if (Serial.read() == '\n') {
    т.е. когда ввод уже завершен.

    EEPROM.write(1, red);

    Для других цветов аналогично, только указать в качестве номера ячейки не 1, а что-то другое.

    С этим (с записью) надо осторожнее, чтобы не случилось непрерывной записи, а то быстро ресурс EEPROM уйдет в никуда (количество записей ограничено).

    Есть альтернатива, только, мягко говоря, несколько избыточная в данном конкретном случае - запись в конфигурационный файл на SD карту.
     
    ToxaRU нравится это.
  5. stikoff

    stikoff Нерд

    Код (Text):
    #include <EEPROM.h>
    //pins for the LEDs:
    const int redPin = 3;
    const int greenPin = 5;
    const int bluePin = 6;

    const int redPin2 = 9;
    const int greenPin2 = 10;
    const int bluePin2 = 11;

    #define REDPIN 3
    #define GREENPIN 5
    #define BLUEPIN 6

    #define FADESPEED 5

    void setup() {
    // initialize serial:
    Serial.begin(9600);

    // make the pins outputs:
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    redPin = EEPROM.read(1);
    analogWrite(redPin, red)
    greenPin = EEPROM.read(2);
    analogWrite(greenPin, green)
    bluePin = EEPROM.read(3);
    analogWrite(bluePin, blue)


    pinMode(redPin2, OUTPUT);
    pinMode(greenPin2, OUTPUT);
    pinMode(bluePin2, OUTPUT);



    Serial.print("Arduino control RGB LEDs Connected OK ( Sent From Arduinno Board )");
    Serial.print('\n');
    }

    void loop() {

    // if there's any serial available, read it:
    while (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    int red2 = Serial.parseInt();
    // do it again:
    int green2 = Serial.parseInt();
    // do it again:
    int blue2 = Serial.parseInt();

    // look for the newline. That's the end of your
    // sentence:
    if (Serial.read() == '\n')
    EEPROM.write(1, red);
    EEPROM.write(2, green);
    EEPROM.write(3, blue);{
         
      // constrain the values to 0 - 255 and invert
      // if you're using a common-cathode LED, just use "constrain(color, 0, 255);"
      // This is for COMMON ANODE
      //red = 255 - constrain(red, 0, 255);
      //green = 255 - constrain(green, 0, 255);
      //blue = 255 - constrain(blue, 0, 255);
      red = constrain(red, 0, 255);
      green = constrain(green, 0, 255);
      blue = constrain(blue, 0, 255);
      red2 = constrain(red2, 0, 255);
      green2 = constrain(green2, 0, 255);
      blue2 = constrain(blue2, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);
      analogWrite(redPin2, red2);
      analogWrite(greenPin2, green2);
      analogWrite(bluePin2, blue2);

      // print the three numbers in one string as hexadecimal:
        Serial.print("Data Response : ");
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
    }

    }
    Так Должно получится ? выдает ошибку
    Код (Text):
    Arduino: 1.6.2 (Windows 7), Плата"Arduino Uno"

    sketch_jun04a.ino: In function 'void setup()':

    sketch_jun04a.ino:23:8: error: assignment of read-only variable 'redPin'

    sketch_jun04a.ino:24:21: error: 'red' was not declared in this scope

    sketch_jun04a.ino:26:1: error: expected ';' before 'pinMode'

    sketch_jun04a.ino:30:10: error: assignment of read-only variable 'greenPin'

    sketch_jun04a.ino:31:23: error: 'green' was not declared in this scope

    sketch_jun04a.ino:32:1: error: expected ';' before 'bluePin'

    sketch_jun04a.ino:33:22: error: 'blue' was not declared in this scope

    sketch_jun04a.ino:36:1: error: expected ';' before 'pinMode'

     
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    assignment of read-only variable 'redPin' - нельзя присвоить значение константной переменной.
    'red' was not declared in this scope - переменная red не объявлена.
    expected ';' before 'pinMode' - пропущена ; перед 'pinMode'.

    Напишите комментарии к своему коду и разберитесь, что в какой переменной должно лежать и при каких условиях можно считывать новые переменные из порта. А еще лучше нарисуйте алгоритм работы своей программы и перепишите код в соответствии с ним.
     
  7. geher

    geher Гуру

    redPin = EEPROM.read(1); - это неправильно.
    Во-первых redPin объявлена как const, т.е. не может меняться.
    Во-вторых, по смыслу это совсем другая переменная (номер пина, а не переменная для уровня цвета).

    Выводы:
    Первое, надо объявления переменных вынести перед loop
    int red;
    и т.д.
    Второе, результат вызова EEPROM.read(...); присваивать не номерам пинов, а этим самым переменным.
    Естественно, также придется убрать int перед переменной red внутри loop(), чтобы использовать ранее объявленное, а не объявлять в этом месте новое.
     
  8. stikoff

    stikoff Нерд

    Ребята вы меня ваще запутали. Если не сложно напишите как оно должно получится в итоге.