Сегодня я посетил радио лавку, взял резисторов, чтобы поднять яркость куба, и набросал небольшой код первого эффекта. Позже я вылажу схему управляющей электроники.
И так начнем со скетча. Я пока решил сильно не заморачиваться с первым эффектом и отдался магии случайных чисел, а именно из генератора случайных чисел я буду брать 3 координаты и по этим координатам буду инвертировать состояние того или иного диода.
И так начнем со скетча. Я пока решил сильно не заморачиваться с первым эффектом и отдался магии случайных чисел, а именно из генератора случайных чисел я буду брать 3 координаты и по этим координатам буду инвертировать состояние того или иного диода.
Сам скетч:
#define clock 3 //Тактовый контакт(SH)
#define latch 4 //Контакт защелки (ST)
#define data 2 //Контакт данных (DS)
boolean matrix[8][8][8]; // массив который является внутренним
//представлением куба
byte i,j,k,x,y,z; // переменные для циклов
void setup() // функция установки начальных праметров
{
//переводим все контакты в режим вывода
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
pinMode(data, OUTPUT);
// на всякий случай я заполняю виртуальный
// массив ложными значениями
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
for(k = 0; k < 8; k++){
matrix[i][k][j] = false;
}
}
}
//Здесь стоит отметить что ложь значит, что диод
//не горит, а правда значит что горит
}
void loop() // основная вызываемая функция
{
// генерирую случайные координаты
x = random(0,8);
y = random(0,8);
z = random(0,8);
#define clock 3 //Тактовый контакт(SH)
#define latch 4 //Контакт защелки (ST)
#define data 2 //Контакт данных (DS)
boolean matrix[8][8][8]; // массив который является внутренним
//представлением куба
byte i,j,k,x,y,z; // переменные для циклов
void setup() // функция установки начальных праметров
{
//переводим все контакты в режим вывода
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
pinMode(data, OUTPUT);
// на всякий случай я заполняю виртуальный
// массив ложными значениями
for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
for(k = 0; k < 8; k++){
matrix[i][k][j] = false;
}
}
}
//Здесь стоит отметить что ложь значит, что диод
//не горит, а правда значит что горит
}
void loop() // основная вызываемая функция
{
// генерирую случайные координаты
x = random(0,8);
y = random(0,8);
z = random(0,8);
// инвертирую значение по координатам
matrix[x][y][z] = !matrix[x][y][z];
writeMatrix(); // отображаю куб
}
void writeMatrix(){ // функция которая отображает внутренний массив на кубе
digitalWrite(clock, LOW);
for(i = 0; i < 8; i++){ // цикл по этажам координата Z
digitalWrite(latch, LOW);
//записываю 64 бита о одном из рядов
for(j = 0; j < 8; j++){ //цикл по этажу(координата Y)
for(k = 0; k < 8; k++){ // цикл по этажу(координата X)
// сбрасываю сигнал на выходе данных
digitalWrite(data, LOW);
//проверка на истину
if(matrix[i][k][j] == true){
// если истина то даю логическую 1 на выход DS
digitalWrite(data, HIGH);
}
// даем тактовый контакт и
matrix[x][y][z] = !matrix[x][y][z];
writeMatrix(); // отображаю куб
}
void writeMatrix(){ // функция которая отображает внутренний массив на кубе
digitalWrite(clock, LOW);
for(i = 0; i < 8; i++){ // цикл по этажам координата Z
digitalWrite(latch, LOW);
//записываю 64 бита о одном из рядов
for(j = 0; j < 8; j++){ //цикл по этажу(координата Y)
for(k = 0; k < 8; k++){ // цикл по этажу(координата X)
// сбрасываю сигнал на выходе данных
digitalWrite(data, LOW);
//проверка на истину
if(matrix[i][k][j] == true){
// если истина то даю логическую 1 на выход DS
digitalWrite(data, HIGH);
}
// даем тактовый контакт и
// проталкиваем бит в регистры
digitalWrite(clock, HIGH);
digitalWrite(clock, LOW);
}
}
// последние 8 бит информация о том,
digitalWrite(clock, HIGH);
digitalWrite(clock, LOW);
}
}
// последние 8 бит информация о том,
// какой из рядов зажигать
for(j = 0; j < 8; j++ ){
digitalWrite(data, LOW);
if(i == j){
digitalWrite(data, HIGH);
}
// даем тактовый контакт и
for(j = 0; j < 8; j++ ){
digitalWrite(data, LOW);
if(i == j){
digitalWrite(data, HIGH);
}
// даем тактовый контакт и
// проталкиваем бит в регистры
digitalWrite(clock, HIGH);
digitalWrite(clock, LOW);
}
// подаю сигнал на защелку тем самым фиксируя
// внутренние данные в регистры на его выходы
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
}
}
digitalWrite(clock, HIGH);
digitalWrite(clock, LOW);
}
// подаю сигнал на защелку тем самым фиксируя
// внутренние данные в регистры на его выходы
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
}
}
В итоге получается что за один цикл случайным образом один из диодов гаснет если горел или наоборот.
Вот собственно и все для первого эффекта, прилагаю видео того как это выглядит в реальности.
Комментариев нет:
Отправить комментарий