Индикация работы с массивом на экране

Elf_Dealer

✩✩✩✩✩✩✩
26 Янв 2020
3
0
г. Москва
Здравствуйте, меня зовут Марк, я новичок в ардуино, поэтому многие мои решения могут показаться вам нерациональными, и я прошу помощи в написании скетча для платы arduino mega с дисплеем, на который будет выводиться массив с его значениями.

Мой проект разрабатывается для: управляющей панели умного дома, управляемых матриц, и всего где потребуется индикация большого количества пинов, к которым подключены свет, музыка, питание и все то что вам нужно.

Панель будет иметь функционал :
1) Отображать массивы на экране в виде строк из квадратов/ячеек (т.е. 1 строка - первый массив, вторая строка - второй)
2) Возможность выбрать элемент массива с помощью кнопок (5 кнопок: вверх-вниз, вправо-влево, активировать), и изменить его значение с 0 на 1.
3) Отображение наличия на пинах «нагрузки» в виде зелёных и красных квадратов/ячеек (зелёный - включено, красный - выключено, т.е. High и Low)

Алгоритм работы :
N-количество линейных массивов с N-количеством ячеек отображаются на дисплее(количество зависит от ваших нужд), вы, с помощью кнопок выбираете в этих строчках ячейку нужную вам и нажимаете кнопку «активировать», значение в массиве меняется на 1, после чего массив отправляется через радио модуль nrf24 на одну из arduino, к которой подключены реле.

Интерфейс и настройка :
Вот желаемая визуализация массива, по вертикали расположены массивы, по горизонтали - элементы массивов.
vcb.jpg

Реализация :
Для управляющей панели я хочу использовать плату Arduino Mega2560 16U2.
Для дисплея выбрал экран 3.5 inch TFT LCD module 480x320 (https://aliexpress.ru/item/32924988336.html).
Передача пакетов с массивами будет осуществляться через радио модули nrf24.

Правда я столкнулся с проблемой что радио радио модуль и экран оба требуют подключения к 50-53 пинам на меге, но вроде как можно просто дисплей не подключать к ним потому что эти пины нужны для SD карты прикрепленной к дисплею.
1580993549366.png1580993896680.png
1580993931491.png

Теперь давайте обсудим код :
Все мои наработки основываются на уроках Алекса.
Но вот в инете я не нашел ничего похожего на работу с массивом и индикация этой работы на дисплее. А без этой части код составляет пару строчек, т.е. настройка передатчика, задание массивов и пары переменных.
Поэтому если кто-то сможет подсказать статьи чтобы разобраться в это теме, буду очень признателен.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,410
976
58
Марий-Эл
Здравствуйте, меня зовут Вася. Я хочу построить космический корабль. Но я новичок. Посоветуйте, что мне делать.

Совет очень прост.
1. Изучить алгоритмизацию и какой нибудь язык программирования;
2. Изучить схемотехнику и электронику;
3. Нарисовать схему;
4. Написать программу;
5. Прошить выбранный контроллер.
6. Купить/выпаять необходимые компоненты
7. Собрать согласно схеме

Из литературы. Datashits на все модули, которые собираетесь использовать.
Описание всех протоколов физического и логического уровня, которые собираетесь использовать.
Книгу по внутренностям микроконтроллера, который собираетесь использовать.
Книгу по программированию на C++.
Книгу по основам схемотехники.
Если нужно, можно залить всё в облако. Но у меня лимит на размер. Всё целиком займёт гигов 50.
 

Elf_Dealer

✩✩✩✩✩✩✩
26 Янв 2020
3
0
г. Москва
@Эдуард Анисимов, ты просто гений, как без тебя мир обходился.
Может блеснёшь тогда своими знаниями и дашь пример кода для работы с дисплеем и управлением массивом через кнопки?
 

Elf_Dealer

✩✩✩✩✩✩✩
26 Янв 2020
3
0
г. Москва
Кто-нибудь может подсказать программы для упрощённой работы с дисплеями?
И где можно найти хорошие примеры работы с ними. Потому все что я находил это вывод статичных изображений с карты памяти и пару вариантов работы с древовидным меню.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,410
976
58
Марий-Эл
Может блеснёшь тогда своими знаниями и дашь пример кода для работы с дисплеем и управлением массивом через кнопки?
Блеснуть можно. А зачем, что бы что то доказать?
Люди, с которыми я работаю, знают чего я стою. А убеждать посторонних, да ну нафиг.

Сейчас пишу подобную, но полностью графическую. Правда на ардуине она не пойдёт. Пишу под STM.

Могу кинуть код, если нужно.

И почему я иронизирую. Потому что в задании много логических неточностей, из за которых не сразу доходит что человек хотел сказать.

Вот желаемая визуализация массива, по вертикали расположены массивы, по горизонтали - элементы массивов.
Хотя бы вот это. Я понимаю так, что в каждой ячейке расположено отображение какого то массива. Тогда не ясно какой размерности массив 2х мерный, трёхмерный, десятимерный. По какому алгоритму засвечивается та или иная ячейка.

Потом я подумал может человек хочет сказать так:
"Имеем двумерный массив размерностью X на Y.
Вот желаемая визуализация массива, по вертикали расположены координаты (позиция) по X в строке массива, по горизонтали - координаты (позиция) по Y (т.е строки )."

Или всётаки массив пятимерен?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
@Elf_Dealer,
Не совсем понятно, что для тебя "упрощенная работа"
Пример пожалуйста, вот для ЭТОГО дисплея и СД-карты. Там же подключение. Экран с тачскрином конечно. Картинки для карты прицеплю отдельно .
Собственно программа рисует красную "кнопку" в произвольном месте, если нажимаешь на нее, то она зеленеет и пропадает. Появляется в новом месте.
Может чем поможет.
C++:
#include   "SPI.h"
#include   "SdFat.h"
#include   "UTFT.h"
#include   "UTFT_SdRaw.h"
#define    SD_CHIP_SELECT SS
#include "TouchScreen.h"

const uint8_t YP   = A0;
const uint8_t XM   = A1;
const uint8_t YM   = A2;
const uint8_t XP   = A3;



UTFT       myGLCD(TFT01_24SP, 8, 7, 6, 5, 4);
SdFat      mySD;
UTFT_SdRaw myFiles(&myGLCD);
TouchScreen ts     = TouchScreen(XP, YP, XM, YM, 600);


const int mipPress = 100;
const int maxPress = 900;
const int tsMinX   = 100;
const int tsMinY   = 120;
const int tsMaxX   = 950;
const int tsMaxY   = 915;

int CX;
int CY;



void setup() {
  myGLCD.InitLCD();
  myGLCD.fillScr(VGA_WHITE);
  while (!mySD.begin(SD_CHIP_SELECT)) {}
  randomSeed(A6);
  CX=random(0,9);
  CY=random(0,8);
  myFiles.load(CX*30, CY*30, 30, 30, "red_m.raw");
}

void loop() {

  TSPoint p = ts.getPoint();
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > mipPress && p.z < maxPress)
  if ((p.x>tsMinX)&&(p.x<tsMaxX)&&(p.y>tsMinY)&&(p.y<tsMaxY))
  {
    int x=map(p.x, tsMinX, tsMaxX, 0,10);
    int y=map(p.y, tsMinY, tsMaxY, 0,8);
    if ((x==CX)&&(y==CY))
    {
      myFiles.load(CX*30, CY*30, 30, 30, "green_m.raw");
      delay(1000);
      myGLCD.setColor(VGA_WHITE);                        
      myGLCD.fillRect(CX*30, CY*30,CX*30+29, CY*30+29);
      CX=random(0,9);
      CY=random(0,8);
      myFiles.load(CX*30, CY*30, 30, 30, "red_m.raw");
    }
   
  };
};
 

Вложения

  • 1.4 KB Просмотры: 0

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
Вот желаемая визуализация массива, по вертикали расположены массивы, по горизонтали - элементы массивов.
нихера непонятно
что ты нарисовал называется матрица
она организуется 2х мерным массивом, правда это не очень эффективно с точки зрения расходования озу и если бы по горизонтали у тебя было бы 8 квадратиков, то это влезло бы в 1 байт и можно было бы сделать одну большую переменную и указателем по ней бегать и выставлять биты
но это довольно сложный алгоритм и проще сделать 2х мерный массив типа байт и туда тупо записывать 1 или 0
у тебя будут координаты х,у

про массивы тут есть урок

графический индикатор требует шрифты и ты должен нарисовать свои квадратики
хотя в библиотеке под такие индикаторы скорей всего будет функция отрисовки квадрата и функция заливки цветом
я не работал с индикаторами такими. но видел код

чтобы нарисовать такой квадрат там надо указать координаты 2х точек и цвет заливки

это для начала осиль
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,410
976
58
Марий-Эл
@Elf_Dealer,
Давай так.
Если ты хочешь построить "космический корабль" не зная ничего и не желая учиться тогда разговора не будет.
Если хочешь этому посвятить жизнь и научиться, тогда добро пожаловать.
Напиши в личку, обсудим.

P.S. Для себя сейчас разрабатываю автомат поливки огорода и теплицы.
 
  • Лойс +1
Реакции: te238s