Проект Ангельских глазок на основe SK6812 RGBW
- Войдите на сайт для отправки комментариев
Пнд, 24/04/2017 - 09:29
Вообщем задача состояла в ледующем, заставить 4 кольца 2 из них 48 светодиодов 2 36светодиодов, гореть как мне нужно.
#include <DallasTemperature.h> // подключаем библиотек для светодиодов #include <Adafruit_NeoPixel.h> // подключаем библиотек для светодиодов #include <avr/power.h> #include <OneWire.h> // подключаем библиотек для датчиков температуры #include <DallasTemperature.h> // подключаем библиотек для датчиков температуры #define PIN0 2 // Управление правым, малым кругом #define PIN1 3 // Управление правым, большим кругом #define PIN2 4 // Управление левым, большим кругом #define PIN3 5 // Управление левым, малым кругом #define PIN4 6 // Датчик температуры ds18b20, для правой фары #define PIN5 7 // Датчик температуры ds18b20, для левой фары OneWire oneWireP(PIN4); //скажем библиотеке, датчик где у нас температуры ds18b20, для правой фары OneWire oneWireL(PIN5); //скажем библиотеке, где у нас датчик температуры ds18b20, для левой фары DallasTemperature sensorsP(&oneWireP); //скажем библиотеке где у нас градусник для правой фары DallasTemperature sensorsL(&oneWireL); //скажем библиотеке где у нас градусник для левой фары #define NUMPIXELS0 36 //Число светодиодов правый малый круг #define NUMPIXELS1 48 //Число светодиодов правый большим круг #define NUMPIXELS2 48 //Число светодиодов левым большим круг #define NUMPIXELS3 36 //Число светодиодов левым малый круг Adafruit_NeoPixel strip0 = Adafruit_NeoPixel(NUMPIXELS0, PIN0, NEO_RGBW + NEO_KHZ800); Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUMPIXELS1, PIN1, NEO_RGBW + NEO_KHZ800); Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUMPIXELS2, PIN2, NEO_RGBW + NEO_KHZ800); Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(NUMPIXELS3, PIN3, NEO_RGBW + NEO_KHZ800); // задаем константы const int buttonPin0 = A0; // +5В Габариты const int buttonPin1 = A1; // +5В Ближний свет const int buttonPin2 = A2; // +5В Vtec const int buttonPin3 = A3; // +5В Левый поворотник const int buttonPin4 = A4; // +5В Правый поворотник // переменные int buttonState0 = 0; // переменная для хранения состояния Габаритов int buttonState1 = 0; // переменная для хранения состояния Ближнего света int buttonState2 = 0; // переменная для хранения состояния Vtec int buttonState3 = 0; // переменная для хранения состояния Левый поворотник int buttonState4 = 0; // переменная для хранения состояния Правый поворотнк int CtempP; // Объявляем переменную для датчика температуры правой фары int CtempL; // Объявляем переменную для датчика температуры левой фары int CtempPL; // Объявляем переменную для средней температуры в фарах void setup() { Serial.begin(9600); strip0.begin(); // Выключаем все светодиодные кольца. strip0.show(); strip1.begin(); strip1.show(); strip2.begin(); strip2.show(); strip3.begin(); strip3.show(); pinMode(buttonPin0, INPUT); // инициализируем пин, подключенный к Габаритам, как вход pinMode(buttonPin1, INPUT); // инициализируем пин, подключенный к Ближнему свету, как вход pinMode(buttonPin2, INPUT); // инициализируем пин, подключенный к Vtec, как вход pinMode(buttonPin3, INPUT); // инициализируем пин, подключенный к Левому поворотнику, как вход pinMode(buttonPin4, INPUT); // инициализируем пин, подключенный к Правому поворотнику, как вход } void loop(){ //считываем значения с входа кнопки buttonState0 = digitalRead(buttonPin0); buttonState1 = digitalRead(buttonPin1); buttonState2 = digitalRead(buttonPin2); buttonState3 = digitalRead(buttonPin3); buttonState4 = digitalRead(buttonPin4); //Вывод температуры в консоль Serial.println(CtempP); Serial.println(CtempL); Serial.println(CtempPL); // Условия при которых включается соответствующий режим if (CtempPL >= -30 && CtempPL <= 80) // Если температура находиться в пределах от -30°С до +80°С, (значение по паспорту -40°С~+85°С), то выполняются нижеперечисленные условия { if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 0 ) {off();}// всё выключено if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 0 ) {vtec();}// Vtec поворотник if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 0 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 0 ) {off();}// всё выключено if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 0 ) {vtec();}// Vtec поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 0 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 0 ) {gabarit();}//Габариты if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 0 ) {vtec();}// Vtec поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 1 && buttonState1 == 0 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 0 ) {off();}// всё выключено if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 0 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 0 ) {vtec();}// Vtec поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 0 && buttonState4 == 1 ) {pravpow();}// правый поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 0 ) {levpow();}// Левый поворотник if (buttonState0 == 1 && buttonState1 == 1 && buttonState2 == 1 && buttonState3 == 1 && buttonState4 == 1 ) {avaria();}// Аварийка поворотник } else {off();} //иначе все светодиоды не включаются. } //Режим "Всё выключено" void off(){ for(int i=0; i<NUMPIXELS0; i++) { strip0.setPixelColor(i, strip0.Color(0, 0, 0, 0)); strip0.show(); } for(int i=0; i<NUMPIXELS1; i++) { strip1.setPixelColor(i, strip1.Color(0, 0, 0, 0)); strip1.show(); } for(int i=0; i<NUMPIXELS2; i++) { strip2.setPixelColor(i, strip2.Color(0, 0, 0, 0)); strip2.show(); } for(int i=0; i<NUMPIXELS3; i++) { strip3.setPixelColor(i, strip3.Color(0, 0, 0, 0)); strip3.show(); } } //Режим "Габариты", включены все кольца белым цветом void gabarit(){ for(int i=0; i<NUMPIXELS0; i++) { strip0.setPixelColor(i, strip0.Color(0, 0, 0, 255)); strip0.show(); } for(int i=0; i<NUMPIXELS1; i++) { strip1.setPixelColor(i, strip1.Color(0, 0, 0, 255)); strip1.show(); } for(int i=0; i<NUMPIXELS2; i++) { strip2.setPixelColor(i, strip2.Color(0, 0, 0, 255)); strip2.show(); } for(int i=0; i<NUMPIXELS3; i++) { strip3.setPixelColor(i, strip3.Color(0, 0, 0, 255)); strip3.show(); } } //Режим "Vtec", включены все кольца красным цветом void vtec(){ for(int i=0; i<NUMPIXELS0; i++) { strip0.setPixelColor(i, strip0.Color(255, 0, 0, 0)); strip0.show(); } for(int i=0; i<NUMPIXELS1; i++) { strip1.setPixelColor(i, strip1.Color(255, 0, 0, 0)); strip1.show(); } for(int i=0; i<NUMPIXELS2; i++) { strip2.setPixelColor(i, strip2.Color(255, 0, 0, 0)); strip2.show(); } for(int i=0; i<NUMPIXELS3; i++) { strip3.setPixelColor(i, strip3.Color(255, 0, 0, 0)); strip3.show(); } } //Режим "Правый поворотник", включениы правые кольца оранжевым цветом, левые белым void pravpow(){ for(int i=0; i<NUMPIXELS0; i++) { strip0.setPixelColor(i, strip0.Color(255, 40, 0, 0)); strip0.show(); } for(int i=0; i<NUMPIXELS1; i++) { strip1.setPixelColor(i, strip1.Color(255, 40, 0, 0)); strip1.show(); } for(int i=0; i<NUMPIXELS2; i++) { strip2.setPixelColor(i, strip2.Color(0, 0, 0, 255)); strip2.show(); } for(int i=0; i<NUMPIXELS3; i++) { strip3.setPixelColor(i, strip3.Color(0, 0, 0, 255)); strip3.show(); } } //Режим "Левый поворотник" включены левые кольца оранжевым цветом, правые белым void levpow(){ for(int i=0; i<NUMPIXELS0; i++) { strip0.setPixelColor(i, strip0.Color(0, 0, 0, 255)); strip0.show(); } for(int i=0; i<NUMPIXELS1; i++) { strip1.setPixelColor(i, strip1.Color(0, 0, 0, 255)); strip1.show(); } for(int i=0; i<NUMPIXELS2; i++) { strip2.setPixelColor(i, strip2.Color(255, 40, 0, 0)); strip2.show(); } for(int i=0; i<NUMPIXELS3; i++) { strip3.setPixelColor(i, strip3.Color(255, 40, 0, 0)); strip3.show(); } } //Режим "Аварийка", включены все кольца оранжевым цветам void avaria(){ for(int i=0; i<NUMPIXELS0; i++) { strip0.setPixelColor(i, strip0.Color(255, 40, 0, 0)); strip0.show(); } for(int i=0; i<NUMPIXELS1; i++) { strip1.setPixelColor(i, strip1.Color(255, 40, 0, 0)); strip1.show(); } for(int i=0; i<NUMPIXELS2; i++) { strip2.setPixelColor(i, strip2.Color(255, 40, 0, 0)); strip2.show(); } for(int i=0; i<NUMPIXELS3; i++) { strip3.setPixelColor(i, strip3.Color(255, 40, 0, 0)); strip3.show(); } } //Считываем температуру с датчиков void TempTOvalue() { sensorsP.requestTemperatures();//Опрашиваем датчик температуры ds18b20 правой фары CtempP=sensorsP.getTempCByIndex(0);//присваиваем температуру правой фары переменной sensorsL.requestTemperatures();//Опрашиваем датчик температуры ds18b20 левой фары CtempL=sensorsL.getTempCByIndex(0);//присваиваем температуру левой фары переменной CtempPL=(CtempP+CtempL)/2; }
В каждой фаре по датчику температуры, пределы от -30 до 80 градусов.
Заметил какую то задержку включения. Т.е. не все сразу загораются, а поочереди только очень быстро.
Гуру посмотрите код, что в нем дает такую задержку.
проект на ардуине мега.
Насколько я понял, команда strip.show() обновляет все светодиоды, соответственно не нужно выполнять её каждый виток цикла, а нужно вынести её наружу. А лучше бы все stripN.show() поместить в отдельную процедуру и вызывать её после циклов.
Ну и для одинакового количества numpixels можно применить один цикл. Т.е. NUMPIXELS0 и NUMPIXELS3 имеют значение 36, так зачем два цикла выполнять? Аналогично и для NUMPIXELS1 и NUMPIXELS2.
Ну и конвертацию strip.color(0,0,0,0) зачем столько раз делать?
Есть варианты -
setPixelColor(n, R, G, B) т.е. сразу в RGB
или
setPixelColor(n, color), где color - 32битный тип, объединяющий в себе RGB-составляющие.
uint32_t magenta = strip.color(255, 0, 255);
(В коде, что ниже, strip.color стырена в отдельную ф-ю RGB2Color)
Для WRGB используется перегруженный вариант strip.color(...) (см. исходник библы)
Ну вроде перепилил, если я тебя правельно понял :)
Единственное не получиться обьеденить в поворотниках, т.к. они разбиваются на левый и правый.
>>не получиться обьеденить в поворотниках, т.к. они разбиваются на левый и правый
Можно так:
а можно и в одном цикле -
А почему TempTOvalue() нигде не используется?
Ну я с TempTOvalue() переменный выдергиваю. датчик ещё не подключал но в serial нули пишет, условие выполняется. Я что то делаю не так?
Кстати только что загнал код, всё получилось, задержки убрались, всё включается за доли секунды
Не критикуй за тупые вопросы, это мой первый код в жизни :)
OlegK, есть ещё 2 момента, которые я незнаю как осуществить.
1. Поворотники, хочеться сделать постепенное заполнение оранжевым светом за определенный промежуток времени, т.е. При включении поворота,2 кольца 36 и 48, одинаково заполняются.
Где то видел что добавляют
delay(x); как я понимаю эта задержка, т.е.
что бы например за секунду заполнить 36 , требуется 27,77мс, а для 48 20,83мс
delay(27.77);
delay(20.83);
Непонятно куда в цикл из запихать.
2. При переменном сигнале поворотника, точнее его отсутствии, по условию будет загораться обратно белый, как и где сделать условие, что бы при прерывании сигнала с поворотника, прога ждала повторный сигнал, и не включала белый свет. а то получается какая то светомузыка :)
Эта процедура присваивает значения глобальным переменным, которые вы выводите в порт, но учитывая, что
она нигде не вызывается, то и значения этих переменных всегда будут нулевыми. Значит, нужно вызывать этот кусок кода в loop(), но периодически, с интервалом не менее секунды, а лучше более (специфика этих термодатчиков) и без delay.
Внутри тела цикла, первой или последней строкой.
Значения должны быть целочисленными.
по п2. я не понял, что требуется. Если есть некое условие, то при нужном состоянии можно выполнить принудительный выход из цикла, не дожидаясь его окончания. Командой break.
Если delay ставить в начале, действия выполняются последовательно, как сделать парралельное включение обеих колец?
Вот, что получается
https://www.youtube.com/watch?v=akn3c_1hV8I
Ну и собственно у каждого кольца, должна быть своя задержка.
Для чего у вас задержка в секунду в начале процедуры?
Для чего вызов show() помещён то в цикле, то снаружи?
>>как сделать парралельное включение обеих колец?
В сообщении 5 уже я показывал, как поместить включение обеих колец в один цикл. И даже всех четырёх.
А если хотите, что бы всё вообще раздельно работало, с индивидуальными задержками и ничего не блокировалось, ковыряйте в сторону "blink без delay", опроса кнопок через PCINT и смены принципа работы программы...
задержка для тестирования.
а show() я просто эксперементировал
Голова кипит уже.
Подскажите как в коде
заменить delay(20) на milis()
Ну, как и всегда, вычислить разницу между текущей и старой миллис, если больше или равна заданному интервалу, выполнить код, приравнять старую миллис к текущей и вернуться в основное тело.
Столько уже всего пречитал. Но все равно немогу догнать, как конкретно в моем коде приминить millis () можете помочь?
Лана, начал писать, понял что неправ. В форе такой номер не пройдет, а если и сделать, то ничем не будет отличаться от делая (из фора можно выйти по окончанию цикла или принудительно). Лично мое видение - делаем аналог фора на ифах и уже там отсчитываем задержки.
Как я понят получается, что то типо того:
примерно так, i надо тоже сделать static или глобальной и по окончании if-а принудительно ее обнулить. Как сейчас, она у вас всегда будет равна 0.
тоже жду такую ленту, смотрел видяхи про них( в даташите глубоко не разбирался) у всех светодиоды по очереди загарабтся, первый светодиод принимает свои биты, загорается, и передает биты дальше второму, второй третьему. вот и результат
Здравствуйте, Magra!
Сможете ли написать на почту morev.d.s@gmail.com У меня похожий проект, но на начальной стадии. Нужен Ваш совет (скорее всего не один).
разместите заказ в платном разделе - вам напишут код.
А тут, когда вы в скетче ничего не понимаете и даже не можете правильно вставить код в сообщение - вряд ли кто-то станет вас учить с нуля.
спасибо большое конечно вам. но знать бы еще куда и где писать мне?
но знать бы еще куда и где писать мне?
А я разве непонятно обьяснил?
Если хотите результат без особого труда - в раздел платной помощи Ищу исполнителя
Если хотите разобраться сами - начните с изучения правил форума вот тут: Песочница