Добрый день. Только начал учиться в написании скетчей, собрал скетч из того что нашел в интеренете это пульт светмузыки, все работает но при переключении страниц он не запоминает значение каналов. Как сделать буфер в памяти, чтобы все значения записывались и хранились в буфере а менялись только те каналы что трогаешь ручки
Вариант 1. Этот пульт не единственное что вы планируете сделать, а точнее вы и дальше планирует развиваться в этом направлении - программировании. Тогда вам нужно не просить помочь с буфером а попросить ссылку на достойную книгу по Си для начинающих, после чего купить или скачать ее и начать читать. Учится писать скетчи и не нужно, нужно учится писать на Си а потом и на С++. Так как нет языка ардуина, нет языка скетчей .. есть только С/С++ в данном случае, и без хотя бы достойной базы Си вам дальше будет все сложнее и сложнее. И так, если этот ваш вариант вот ссылка на достойную книгу совсем для начинающих. Через пару дней чтения этой книги вам не потребуется помощь в решении вопроса с которым вы создали эту тему Вариант 2. Вы решили разок два сделать что-либо для каких то конкретных целей и больше оно вам и не надо. Тогда просто выложите ваш скетч сюда и вам подскажут какие строчки вставить чтобы было то что вам нужно.
Мучился я долго многое понял) но с буфером беда( вот текст скетча #include <DMXSerial.h> // Подключаем библиотеку DMX #include <LiquidCrystal.h> // Подключаем библиотеку экрана LCD #define UPPIN 7 // Указываем пины кнопки вверх #define DOWNPIN 8 // Указываем пины кнопки вниз #define KEYSPEED 15 // Устанавливаем скорость опроса кнопок LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты int dmxbase=127; // Задаем стартовый адрес boolean btn_up=true, // buttons state btn_down=true; unsigned long last_btn=millis(); // buttons press timestamp byte dmxdata[6], // Данные dmxlast[6], // Предыдушие данные цикла btn_ticks=0, // movement buttons handled actions deltadmx=6; // Смешение адреса DMX void processmovestep(){ btn_ticks++; if(btn_ticks>1) deltadmx=6; // Увеличение шага if(btn_ticks>2) deltadmx=6; if(btn_ticks>3){ // Сброс шага deltadmx=6; btn_ticks=0; } lcd.setCursor(5,0); LeadZeroLCD(dmxbase); } void LeadZeroLCD(int data){ if(data<100) lcd.print("0"); if(data<10) lcd.print("0"); lcd.print(data,DEC); } void setup(){ // красивая "загрузка" программы при старте lcd.begin(16, 2); //lcd.print("AlexLight Show"); //lcd.setCursor(0, 1); //lcd.print("+7(926)026-80-20"); //delay(1000); //lcd.clear(); //lcd.print("DMX Tester V 1.0"); //lcd.setCursor(0, 1); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(100); // ждем 0.1 секунды //lcd.print("."); //delay(1000); // ждем 1 секунду //lcd.clear(); //lcd.print("Ready to Work"); // delay(1000); //lcd.clear(); //очистка экрана byte i; DMXSerial.init(DMXController); lcd.begin(16,2); lcd.clear(); lcd.setCursor(0,0); lcd.print("Base: "); processmovestep(); pinMode(UPPIN,INPUT_PULLUP); pinMode(DOWNPIN,INPUT_PULLUP); pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(A3,INPUT); pinMode(A4,INPUT); pinMode(A5,INPUT); pinMode(6, OUTPUT); for(i=0;i<5;i++){ // сбрасываем все в 0 dmxdata=0; dmxlast=0; } } void loop(){ byte i; for(i=0;i<=5;i++) DMXSerial.write(dmxbase+i,dmxdata); // Записываем значения dmx (канал значение) if(btn_up && btn_down){ // Читаем кнопки из режима ожидания btn_up=digitalRead(UPPIN); btn_down=digitalRead(DOWNPIN); last_btn=millis(); btn_ticks=0; deltadmx=6; if(!btn_up && !btn_down) btn_down=true; digitalWrite(6, HIGH); // зажигаем светодиод delay(7); // ждем секунду digitalWrite(6, LOW); // выключаем светодиод delay(7); // ждем секунду } if(!btn_up) btn_up=digitalRead(UPPIN); // read movement keys from moving mode if(!btn_down) btn_down=digitalRead(DOWNPIN); if(!btn_up && millis()-last_btn>=KEYSPEED){ // move DMX up last_btn=millis(); dmxbase+=deltadmx; if(dmxbase>496) dmxbase=1; processmovestep(); } if(!btn_down && millis()-last_btn>=KEYSPEED){ // move DMX down last_btn=millis(); dmxbase-=deltadmx; if(dmxbase<1) dmxbase=496; processmovestep(); } for(i=0;i<=5;i++){ dmxlast=dmxdata; dmxdata=analogRead(A0+i)/4; delay(15); } for(i=0;i<=5;i++){ if(abs(dmxlast-dmxdata)>=2){ lcd.setCursor(9,0); lcd.print("Fader#"); lcd.setCursor(15,0); lcd.print(i+1,DEC); lcd.setCursor(0,1); lcd.print("Channel "); LeadZeroLCD(dmxbase+i); lcd.print(": "); LeadZeroLCD(dmxdata); } } }
Как сделать так чтобы были переменные на 512 каналов, и все данные писались в переменные а читались тоже с них а не напрямую. Так же нужно чтобы данные с аналоговых входов перезаписывались в буфере только при изменении. Помогити с меня коньяк)
Протестил он запоминает значения при переходе страницы, Проблема в том что когда возвращаешся на нужную он сразу пересчитывает значение по резисторам в данный момент, а нужно только если меняеш значение резистора.