имеется код Код (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); } } } подключаю ардуино к смартфону по ЮСБ выбираю цвет РГБ светодиода. После отключения смартфона все сбивается. Возможно в коде можно что-то дописать чтобы значение сохранялось в памяти ардуино после отключения от смарта ?
В начало скетча #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 карту.
Код (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'
assignment of read-only variable 'redPin' - нельзя присвоить значение константной переменной. 'red' was not declared in this scope - переменная red не объявлена. expected ';' before 'pinMode' - пропущена ; перед 'pinMode'. Напишите комментарии к своему коду и разберитесь, что в какой переменной должно лежать и при каких условиях можно считывать новые переменные из порта. А еще лучше нарисуйте алгоритм работы своей программы и перепишите код в соответствии с ним.
redPin = EEPROM.read(1); - это неправильно. Во-первых redPin объявлена как const, т.е. не может меняться. Во-вторых, по смыслу это совсем другая переменная (номер пина, а не переменная для уровня цвета). Выводы: Первое, надо объявления переменных вынести перед loop int red; и т.д. Второе, результат вызова EEPROM.read(...); присваивать не номерам пинов, а этим самым переменным. Естественно, также придется убрать int перед переменной red внутри loop(), чтобы использовать ранее объявленное, а не объявлять в этом месте новое.