Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2022, 23:08   #1
DavyJone
Новичок
Джуниор
 
Регистрация: 11.11.2022
Сообщений: 2
По умолчанию Помогите разобраться в коде arduino

Объясните как поменять цифры, которые будут выводиться на матрицу 16x16




#include <FastLED.h>// подключаем библиотеку управления адресной лентой

#define NUM_LEDS 256 // указываем количество светодиодов на ленте
#define PIN 4 // указываем пин для подключения ленты

CRGB leds[NUM_LEDS];// обявляем масив типа данных CRGB(тип данных описанный в библиотеке FastLED.h
byte x_k=1,y_k=1,r_k=225,g_k=0,b_k=0;
void setup() {
Serial.begin(9600);
// основные настройки для адресной ленты
FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS);//.setCorrection(TypicalLEDStrip)- цветокорекция(невникаем)
//WS2812-тип ленты
//PIN- пин для подключения ленты
//GRB- порядок цветов
//leds- имя массива светодиодов
//NUM_LEDS- размер массива
FastLED.setBrightness(225);// изначальное значение яркости(далее в программе может быть изменено)
}

void loop() {
cifri(10,10,225,0,0,2);
cifri(7,10,225,0,0,1);
cifri(4,10,225,0,0,3);
/*XOY(10, 10, 0, 30, 225);//
XOY(11, 10, 0, 30, 225);//
XOY(12, 10, 0, 30, 225);//
XOY(13, 10, 0, 30, 225);//
XOY(13, 11, 0, 30, 225);//
XOY(13, 12, 0, 30, 225);//
XOY(13, 13, 0, 30, 225);//*/


}
void XOY(byte x, byte y, byte r, byte g, byte b){
//n-номер зажигаемого светодиода
int n=0;// обнуляем номер светодиода
if(x>0&&x<17&&y>0&&y<17){//проверяем входят ли вписанные координаты в размеры поля(поле 16X16 светодиодов) иначе (смотри (*))
if((y-1)>0){//данный блок устанавливает координату по оси OY
n+=15;// "заполняем" первую строку координатной оси
if((y-2)>0){// если точка по имеет координату Y > 2
n+=16*(y-2);// "заполняем" все строчки ниже y-ковой по оси Y
}
}
if((y%2)==0){//данны блок устанавливает координату по оси OX для четных строк(((y%2)==0)-сравнение остатка от деления на 2 с 0(== - должен равнятся))
n+=(17-x);
}
if((y%2)!=0){//данны блок устанавливает координату по оси OX для не четных строк(((y%2)!=0)-сравнение остатка от деления на 2 с 0(!= - не должен равнятся))
if(y==1){//если выставляем координату X на первой строчке
n+=(x-1);
}
else{//если выставляем координату X на любой другой строчке
n+=x;
}
}
leds[n] = CRGB(r, g, b);// присваеваем n-ному элементу массива цвет из трёх порамитров
FastLED.show();//отправляем в ленту изменённый массив
}
else{//(*)
Serial.println("Точки не существует");//выводми сообшение о том что точка не входит в координатную область
}
}
/*
* void XOY(byte x, byte y, byte r, byte g, byte b)- функция для по координатам
* byte x - координата по оси OX
* byte y - координата по оси OY
* byte r - интенсивность красного цвета
* byte g - интенсивность зелёного цвета
* byte b - интенсивность цвета
*
* Принцип работы функции основан на том ,что лента выложенна строчками и спаянна "змейкой".
* Нулевой светодиод ленты находится в левом нижнем углу поля и имеет координату (1;1).
* Для того чтобы поднятся на 1 по оси Y необходимо прибавить к номеру светодиода(n) количество оставшихся светодиодов в строке
*/
void cifri(byte k_X,byte k_Y,byte c_R,byte c_G,byte c_B,byte ciFra){
if(k_X>0&&k_X<15&&k_Y>2&&k_Y<15){
for(byte i=0;i<3;i++){
if(ciFra==1){
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
if(ciFra==2){
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY(k_X,(k_Y-i),c_R,c_G,c_B);
XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
}
if(ciFra==3){
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
}
if(ciFra==4){
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
if(ciFra==5){
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
}
if(ciFra==6){
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY(k_X,(k_Y-i),c_R,c_G,c_B);
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
if(ciFra==7){
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
if(ciFra==8){
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
if(ciFra==9){
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
if(ciFra==0){
XOY(k_X,(k_Y+i),c_R,c_G,c_B);
XOY((k_X+i),k_Y,c_R,c_G,c_B);
XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
}
}
}
}
DavyJone вне форума Ответить с цитированием
Старый 11.11.2022, 23:31   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от DavyJone Посмотреть сообщение
void cifri(byte k_X,byte k_Y,byte c_R,byte c_G,byte c_B,byte ciFra){
Вы же даже не пытались...
p51x вне форума Ответить с цитированием
Старый 11.11.2022, 23:52   #3
DavyJone
Новичок
Джуниор
 
Регистрация: 11.11.2022
Сообщений: 2
По умолчанию

я уже часа 2 сижу, до меня дойти не может, подскажте пожалуйста как можно изменить
DavyJone вне форума Ответить с цитированием
Старый 14.11.2022, 14:25   #4
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Тэги кода и отступы(форматирование) не надо делать в первом сообщении? Столько if-ов - может быть лучше switch применить?
Cuprum5 вне форума Ответить с цитированием
Старый 15.11.2022, 11:08   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Братаны, а как там код загружается? Допустим, я загрузил данные в 5 светодиодов, но только 24 бита, т.е. RGB-информацию. Какой загорится? Первый?
Cuprum5 вне форума Ответить с цитированием
Старый 15.11.2022, 12:38   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Автор темы, что непонятно, в комментариях все расписано.
Cuprum5 вне форума Ответить с цитированием
Старый 15.11.2022, 12:51   #7
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Вот, как надо.
Код:
#include <FastLED.h>  //подключаем библиотеку управления адресной лентой

#define NUM_LEDS 256  //указываем количество светодиодов на ленте
#define PIN 4         //указываем пин для подключения ленты

CRGB leds[NUM_LEDS];  //обявляем масив типа данных CRGB(тип данных описанный в библиотеке FastLED.h
byte x_k = 1, y_k = 1, r_k = 225, g_k = 0, b_k = 0;

void setup()
{
	Serial.begin(9600);
	//основные настройки для адресной ленты
	FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS);//.setCorrection(TypicalLEDStrip)- цветокорекция(невникаем)
	//WS2812 - тип ленты
	//PIN - пин для подключения ленты
	//GRB - порядок цветов
	//leds - имя массива светодиодов
	//NUM_LEDS - размер массива
	FastLED.setBrightness(225);//изначальное значение яркости(далее в программе может быть изменено)
}

void loop()
{
	cifri(10,10,225,0,0,2);
	cifri(7,10,225,0,0,1);
	cifri(4,10,225,0,0,3);
	/*
	XOY(10, 10, 0, 30, 225);//
	XOY(11, 10, 0, 30, 225);//
	XOY(12, 10, 0, 30, 225);//
	XOY(13, 10, 0, 30, 225);//
	XOY(13, 11, 0, 30, 225);//
	XOY(13, 12, 0, 30, 225);//
	XOY(13, 13, 0, 30, 225);//
	*/
}
void XOY(byte x, byte y, byte r, byte g, byte b)
{
	//n-номер зажигаемого светодиода
	int n = 0;  //обнуляем номер светодиода
	if(x > 0 && x < 17 && y > 0 && y < 17)  //проверяем входят ли вписанные координаты в размеры поля(поле 16X16 светодиодов) иначе (смотри (*))
	{
		if((y - 1) > 0)  //данный блок устанавливает координату по оси OY
		{   
			n += 15;  //"заполняем" первую строку координатной оси
			if((y - 2) > 0)
			{   //если точка имеет координату Y > 2
				n += 16*(y - 2);  //"заполняем" все строчки ниже y-ковой по оси Y
			}
		}
		
		//данный блок устанавливает координату по оси OX для четных строк(((y%2)==0)-сравнение остатка от деления на 2 с 0(== - должен равнятся))
		if((y%2) == 0)
		{   
			n += (17-x);
		}
		
		//данны блок устанавливает координату по оси OX для не четных строк(((y%2)!=0)-сравнение остатка от деления на 2 с 0(!= - не должен равнятся))
		if((y%2) != 0)
		{   
			if(y == 1)  //если выставляем координату X на первой строчке
				n += (x-1);
			else  //если выставляем координату X на любой другой строчке
				n += x;
		}
		leds[n] = CRGB(r, g, b);  //присваеваем n-ному элементу массива цвет из трёх параметров
		FastLED.show();  //отправляем в ленту изменённый массив
	}
	else
	{//(*)
		Serial.println("Точки не существует");  //выводим сообшение о том что точка не входит в координатную область
	}
}
/*
* void XOY(byte x, byte y, byte r, byte g, byte b) - функция для по координатам
* byte x - координата по оси OX
* byte y - координата по оси OY
* byte r - интенсивность красного цвета
* byte g - интенсивность зелёного цвета
* byte b - интенсивность синего цвета
*
* Принцип работы функции основан на том ,что лента выложенна строчками и спаянна "змейкой".
* Нулевой светодиод ленты находится в левом нижнем углу поля и имеет координату (1;1).
* Для того чтобы поднятся на 1 по оси Y необходимо прибавить к номеру светодиода(n) количество оставшихся светодиодов в строке
*/
void cifri(byte k_X, byte k_Y, byte c_R, byte c_G, byte c_B, byte ciFra)
{
	if(k_X > 0 && k_X < 15 && k_Y > 2 && k_Y < 15)
	{
		for(byte i = 0; i < 3; i++)
		{
			if(ciFra == 1)
			{
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
			if(ciFra == 2)
			{
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY(k_X,(k_Y-i),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
			}
			if(ciFra == 3)
			{
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
			}
			if(ciFra == 4)
			{
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
			if(ciFra == 5)
			{
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
			}
			if(ciFra == 6)
			{
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY(k_X,(k_Y-i),c_R,c_G,c_B);
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+i),(k_Y+2),c_R,c_G,c_B);
				XOY((k_X+i),(k_Y-2),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
			if(ciFra == 7)
			{
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
			if(ciFra == 8)
			{
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
			if(ciFra == 9)
			{
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
			if(ciFra == 0)
			{
				XOY(k_X,(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+i),k_Y,c_R,c_G,c_B);
				XOY((k_X+2),(k_Y+i),c_R,c_G,c_B);
				XOY((k_X+2),(k_Y-i),c_R,c_G,c_B);
			}
		}
	}
}
Cuprum5 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться в коде perekatipole Общие вопросы Delphi 14 23.04.2017 14:41
Помогите разобраться в коде... dimwow Паскаль, Turbo Pascal, PascalABC.NET 3 28.09.2016 08:43
Помогите разобраться в коде fate Общие вопросы по Java, Java SE, Kotlin 5 17.03.2009 22:10