Помигаем светодиодиками. Мой первый завершенный проект на ардуне
- Войдите на сайт для отправки комментариев
Ср, 21/09/2016 - 10:10
Добрый день!
Доделал один проект, из того много, что успел начать с момента моего первого знакомства с arduino.
Управляю яркостью 5 rgb светодиодов с помощью PCA9685
Видео в работе можно глянуть тут -> https://youtu.be/6gazs2t-DwU
Сам код:
//https://github.com/MrBoBo4kA/RGB_led_PCA9685 #include <Wire.h> #include <EEPROM.h> #define UP 0 #define SHIFT 100 #define DOWN 200 int x=0; byte n=0; unsigned long lm=0; unsigned long cm; bool dir=0; // direction word br=2047; // brightness 0-4095 byte s=15; // speed byte k[201]; // 0-100-0 int kn = 0; word rgb[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //current color byte sc=0; //start color 0-R 1-G 2-B byte scp[]={0,0,0}; //color shift void setup() { //Serial.begin(57600); for debug and tilt angle adjustment Wire.begin(); Wire.setClock(400000); Wire.beginTransmission(0x40); Wire.write(0x00); //mode 0 set Wire.write(B10100000); //reset, AI on Wire.endTransmission(); Wire.beginTransmission(0x40); Wire.write(0x01); //mode 1 set Wire.write(0x10); //no external driver used, OE input Wire.endTransmission(); Wire.beginTransmission(0x40); Wire.write(0xFA); //all set off Wire.write(0x00); Wire.write(0x00); Wire.write(0x00); Wire.write(0x00); Wire.endTransmission(); for(x=0;x<=100;x++) //point value chart 0-100 [0-100] (% of max brightness) {k[x]=x;} for(x=101;x<=200;x++) //point value chart 100-0 [101-200] (% of max brightness) {k[x]=k[x-1]-1;} pinMode(4, INPUT_PULLUP); //s++ pinMode(5, INPUT_PULLUP); //br++ pinMode(6, INPUT_PULLUP); //br-- pinMode(7, INPUT_PULLUP); //s-- if(EEPROM.read(0)==235) { br=word(EEPROM.read(3),EEPROM.read(2)); s=EEPROM.read(1); } else { EEPROM.write(3,highByte(br)); EEPROM.write(2,lowByte(br)); EEPROM.write(1,s); EEPROM.write(0,235); } } void loop() { sc++; //change the color of the starting if(sc>2){sc=0;} switch (sc) { case 0: scp[0]=0; scp[1]=5; scp[2]=10; break; case 1: scp[0]=5; scp[1]=10; scp[2]=0; break; case 2: scp[0]=10; scp[1]=0; scp[2]=5; break; } for(x=0;x<101;x++) { calc(scp[0],UP); check(); out(); delay(s); } for(x=0;x<101;x++) { calc(scp[0],SHIFT); calc(scp[1],UP); check(); out(); delay(s); } for(x=0;x<101;x++) { calc(scp[0],DOWN); calc(scp[1],SHIFT); calc(scp[2],UP); check(); out(); delay(s); } for(x=0;x<101;x++) { calc(scp[0],UP); calc(scp[1],DOWN); calc(scp[2],SHIFT); check(); out(); delay(s); } for(x=0;x<101;x++) { calc(scp[0],SHIFT); calc(scp[2],DOWN); check(); out(); delay(s); } for(x=0;x<101;x++) { calc(scp[0],DOWN); check(); out(); delay(s); } delay(100); dir=!dir; if(digitalRead(4)&&digitalRead(5)&&digitalRead(6)&&digitalRead(7)==HIGH) { EEPROM.update(3,highByte(br)); EEPROM.update(2,lowByte(br)); EEPROM.update(1,s); EEPROM.update(0,235); /* Serial.println("EEPROM"); Serial.println(EEPROM.read(3)); Serial.println(EEPROM.read(2)); Serial.println(EEPROM.read(1)); Serial.println(EEPROM.read(0)); Serial.println("END"); */ } } void calc(byte z, int y) //z-color, y-shift { if(dir==1) { for(n=0;n<5;n++) { kn=x-n*25+y; kn=constrain(kn, 0, 200); rgb[n+z]=map(k[kn],0,100,0,br); } } else { for(n=0;n<5;n++) { kn=x-n*25+y; kn=constrain(kn, 0, 200); rgb[4-n+z]=map(k[kn],0,100,0,br); } } } void check() { cm=millis(); if(cm-lm>400) { if(digitalRead(5)==LOW) //br++ {br*=1.1; if(br>4095){br=4095;} //Serial.println(br); } if(digitalRead(6)==LOW) //br-- {br*=0.9; if(br<127){br=127;} //Serial.println(br); } if(digitalRead(4)==LOW) //s++ {s++; if(s>31){s=31;} //Serial.println(s); } if(digitalRead(7)==LOW) //s-- {s--; if(s<1){s=1;} //Serial.println(s); } lm=cm; } } void out() { for(n=0;n<5;n++) { Wire.beginTransmission(0x40); Wire.write(0x06+n*0x0C); Wire.write(0x00); //outR Wire.write(0x00); Wire.write(lowByte(rgb[0+n])); Wire.write(highByte(rgb[0+n])); Wire.write(0x00); //outG Wire.write(0x00); Wire.write(lowByte(rgb[5+n])); Wire.write(highByte(rgb[5+n])); Wire.write(0x00); //outB Wire.write(0x00); Wire.write(lowByte(rgb[10+n])); Wire.write(highByte(rgb[10+n])); Wire.endTransmission(); } }
схему бы посмотреть как все это дело дружит
глянул стоимость данной приблуды и немного остыл)
Схема проста до безобразия и описана на гитхабе, если нужен рисунок, могу сделать.
Стоимость:
Ардуна - 150р; пвм модуль - 100р; светодиоды 20шт - 250р; датчик наклона 10шт - 60р; цены с али.
Корпус - на своё усмотрение, я клеил сам из оргстекла )
Схема проста до безобразия и описана на гитхабе, если нужен рисунок, могу сделать.
Стоимость:
Ардуна - 150р; пвм модуль - 100р; светодиоды 20шт - 250р; датчик наклона 10шт - 60р; цены с али.
Корпус - на своё усмотрение, я клеил сам из оргстекла )
может я не там смотрел но там он(пвм модуль) стоил 1000+
https://www.aliexpress.com/item/Free-Shipping-16-Channel-12-bit-PWM-Serv...
с запаянными ногами чуть подороже
https://www.aliexpress.com/item/1pc-PCA9685-16-Channel-12-bit-PWM-Servo-...
я использовал как раз второй, судя по фото, они отличаются немного, в первом есть доп. стабилизатор* (3х ногий элемент рядом с конденсатором).
Датчики наклона https://www.aliexpress.com/item/Free-shipping-10PCS-sensitive-SW-520D-do...
Светодиоды на свой вкус )
https://www.aliexpress.com/item/Free-Shipping-16-Channel-12-bit-PWM-Serv...
с запаянными ногами чуть подороже
https://www.aliexpress.com/item/1pc-PCA9685-16-Channel-12-bit-PWM-Servo-...
я использовал как раз второй, судя по фото, они отличаются немного, в первом есть доп. стабилизатор* (3х ногий элемент рядом с конденсатором).
Датчики наклона https://www.aliexpress.com/item/Free-shipping-10PCS-sensitive-SW-520D-do...
Светодиоды на свой вкус )
хорошо спасибо попробую может как нибудь)))) скоро новый год)))) может елочку сделаю на рабочий стол)))
Доброго времени суток!
Ну подсветку на 5 ступеней лестницы уже сделал - поздравляю!
Я же обзадумался на 16 ступеней замутить, для эксперементов обзавёлся одной РСА и всё никак не мог найти код для этой приблуды на LSD. Теперь буду ковырять код.
Вариант лестницы - https://www.youtube.com/watch?v=A6cYmr3RBnI
Большое спасибо!