ОК. Тогда давайте показывать пустоту будем тоже с помощью этой же функции и научим ее это делать.
Проще всего условиться, что пустоту будет обозначать какое-то число, которое мы не используем для показа номеров каналов. Т.е. любое, которое больше 16. А еще лучше, если этим числом будет 255 (максимально возможное для типа byte).
Пробуйте доделать функцию, чтобы она очищала обе матрицы (которые мы используем для вывода чисел), если в качестве параметра поступило число 255.
upd. Можно, конечно, и ноль передавать, ведь его тоже не планируется отображать, если будем выводить только 1-16, но тогда можно запутаться в коде - внутренние номера каналов у нас заведены как 0-15. Поэтому предпочтительней 255 - видим его в коде в качестве параметра функции и понимаем, что это точно не номер канала.
void showNumber(byte number)
{
if (number == 255)
LC.clearDisplay(2);
LC.clearDisplay(3);
byte edinicy = number % 10;
for (byte i = 0; i < 8; i ++)
{
LC.setRow(2, i, CountDigits[edinicy][i]);
}
if (number < 10 ) LC.clearDisplay(3);
else
{
byte desyatki = number / 10;
for (byte i = 0; i < 8; i ++)
LC.setRow(3, i, CountDigits[desyatki][i]);
}
}
я решил вот так поступить но что то не получаетьс мерцающая цифра
Неправильно. Сейчас у вас оно работает так:
1) Если number == 255, то очищаем матрицу 2.
2) Очищаем матрицу 3 (в любом случае).
3) Не зависимо от того, какое число пришло, пытаемся показать его на экране (даже если это 255).
к сожалению мультиплексоры с китая еще не пришли , у меня есть 8 входной, но показывает он по два столбика тоесть дублирует 0ю и 1ю матрицу для эсперемта можно я думаю подойдет
С цифрами мы практически закончили, теперь надо немного вернуться и подкорректировать вывод столбцов: слева - направо. Я просто думал, как бы проще определить, с какой стороны матрицы у вас отображается первый канал, а с какой последний.
В нашем предыдущем скетче, в том, что выводит столбики, в строке if(channel == 16) channel = 0; вместо 16 временно поставьте 15, и посмотрите какой столбик не будет показываться на матрице - крайний справа, слева или вообще какой-то другой?
upd. Если что, то мультиплексоры для этого подключать не надо. Ардуина просто будет считывать тот хаос в виде наводок на входном пине (А0 в нашем случае). Или для гарантии А0 подключить к +5В.
ОК, понятно. Странное, вообще-то, как для меня, подключение матриц. Получается столбцы в матрицах считаются слева направо, а сами матрицы расположены справа - налево. Ну да ладно.
Если его скомпилировать и залить в ардуину, то должны видеть на самой первой слева матрице мигающую единицу, дальше очень быстро меняющиеся цифры и на двух последних матрицах столбцы.
В смысле "на разных местах обоих матриц"? На самой первой матрице должно выводиться: то единица (в одном и том же месте), то пусто. Эта единица по матрицах прыгать не должна. На следующей матрице очень очень быстро должны меняться цифры. Они тоже должны быть на одном и том же месте. Вы скетч тот, что я только-что выложил заливали?
наводки довал мультик a0 я притянул к земле , хаотичное скакание еденичы пропало и остались только быстро бегущие цифры в солбиках не горит и не мрогает ни один из пикселей
Странно, добавьте пожалуйста, например, перед строкой channel++; строку delay(1000);
На первых двух матрицах должны по-очереди меняться числа от 0 до 15 и далее по-кругу.
Попробуйте на несколько секунд A0 притягивать к земле, потом к +5V и оставлять висеть свободным. Это не должно сказываться на выводе цифр, только на столбиках. Результат сообщите.
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
Поехали дальше. Я для себя уже выстроил сценарий. Но мне интересны ваши мысли. Для начала, как вы себе представляете должны показываться активные номера каналов? Т.е., как оно все должно выглядеть визуально?
Направление мыслей верное. Но вы говорили, что активным может быть не только один канал. Как предлагаете разглядеть числа, если активными будут одновременно каналов 5, 10, а то и все 16? Вы же видели, что творилось на экране, когда числа выводились все по-очереди (до введения задержки).
Не совсем. Во-первых. Строки 68-69: если n > 16, то n = 0. Т.е., n будет принимать значения от 0 до 16, итого 17 значений. ??? Но у нас ведь только 16 каналов, да и массив объявлен на 16 элементов. А во-вторых, зачем нам n, если у нас уже есть переменная channel, которая работает абсолютно точно так же (ну, если учесть замечание) - постоянно меняет свое значение от 0 до 15 при каждом проходе лупа? Зачем нам еще одна точно такая же переменная (только с другим именем)? Используйте channel.
И в-третьих. В строке 66 вы пишете byte LevelStolbik[n] = val; Похоже, вы не понимаете разницы между объявлением переменной и ее использованием. Проще говоря, зачем снова писать byte перед переменной, если вы уже это делали в 13-й строке? Я уже ранее писал, что делая так в разных блоках, вы объявляете новую (еще одну) переменную с таким же именем. Ну и эта конструкция вообще не будет компилироваться, поскольку массивы объявляются несколько иначе (с точки зрения компилятора тут вы как раз попытались объявить массив, а не присвоить его какому-то элементу значение).
[code]
LevelStolbik[channel] = val; //записать в значениние channel
channel++; // прибавить channel
if (channel > 15) { // если больше 16 сбросить channel
channel = 0;
}
[/code] я просто считал что каждая переменная предназначена для определенного действия , так правильно?
Если я больше ничего не проглядел, то так уже правильно.
Ну, как-бы, да - переменные предназначены для хранения данных (если быть точнее, меняющихся данных). Но ведь никто не запрещает нам хранящиеся в них данные использовать в разных местах. Вот, например, эту же переменную chanel мы сначала использовали чтобы задать адрес для мультиплексора (строки 55-59) - "вытягивали" из нее биты, а потом в 64-й строке использовали ее уже для расчета номеров матрицы и столбца при выводе столбиков.
Мало того, одну и ту же переменную можем использовать для хранения однотипных данных, логически никак не связанных. Например, в одно время хранить в ней значение температуры, а потом, когда температура нам больше не нужна, записать туда расстояние до объекта. Но это уже моветон и лучше так не делать, сами же можем и запутаться. Это как грузовиком, что возит навоз, возить еще и персики.
Пока все понятно? Если да, то давайте эту функцию немного доработаем и подгоним ее поближе к нашим реалиям.
да мне все понятно , спасибо вы хорошо обьясняете
Вопрос, как вы планируете выводить номера каналов на табло: от 0 до 15 или от 1 до 16?
1- 16
Тогда, следующий вопрос, что хотите видеть на экране, если ни на одном канале сигнала нет? Пусто или 0?
пустоту
ОК. Тогда давайте показывать пустоту будем тоже с помощью этой же функции и научим ее это делать.
Проще всего условиться, что пустоту будет обозначать какое-то число, которое мы не используем для показа номеров каналов. Т.е. любое, которое больше 16. А еще лучше, если этим числом будет 255 (максимально возможное для типа byte).
Пробуйте доделать функцию, чтобы она очищала обе матрицы (которые мы используем для вывода чисел), если в качестве параметра поступило число 255.
upd. Можно, конечно, и ноль передавать, ведь его тоже не планируется отображать, если будем выводить только 1-16, но тогда можно запутаться в коде - внутренние номера каналов у нас заведены как 0-15. Поэтому предпочтительней 255 - видим его в коде в качестве параметра функции и понимаем, что это точно не номер канала.
Неправильно. Сейчас у вас оно работает так:
1) Если number == 255, то очищаем матрицу 2.
2) Очищаем матрицу 3 (в любом случае).
3) Не зависимо от того, какое число пришло, пытаемся показать его на экране (даже если это 255).
Исправляйте.
все тупик, у меня решения нет
Да ладно! о_О Смотрите то вы в ту сторону, что надо, но не до конца доделываете. Осталось расставить несколько скобок и дописать в нужном месте else.
Проверяем число на 255, если да, то очищаем матрицы 2 и 3, иначе показываем цифры.
Вы бы не брезговали в if фигурными скобками, как в строке 12, то глядишь бы все и стало на своим места.
В 12-й строке их, конечно, можно опустить, но привыкните и будете их опускать, где надо и не надо.
я то думал что возможно какоето решение другое было , это не походило , я мало же еще знаком с синтаксисом ,и вот все исправил
Вы мультиплексоры уже подключали к ардуине или у вас пока, кроме матрицы, ничего не подключено?
к сожалению мультиплексоры с китая еще не пришли , у меня есть 8 входной, но показывает он по два столбика тоесть дублирует 0ю и 1ю матрицу для эсперемта можно я думаю подойдет
С цифрами мы практически закончили, теперь надо немного вернуться и подкорректировать вывод столбцов: слева - направо. Я просто думал, как бы проще определить, с какой стороны матрицы у вас отображается первый канал, а с какой последний.
В нашем предыдущем скетче, в том, что выводит столбики, в строке if(channel == 16) channel = 0; вместо 16 временно поставьте 15, и посмотрите какой столбик не будет показываться на матрице - крайний справа, слева или вообще какой-то другой?
upd. Если что, то мультиплексоры для этого подключать не надо. Ардуина просто будет считывать тот хаос в виде наводок на входном пине (А0 в нашем случае). Или для гарантии А0 подключить к +5В.
на 0й слева на прова 1й столбик
Меняли 16 на 15?
if(channel == 15) channel = 0;
а так если то на 1й матрице с лево на право последний столбик
Т.е. вот так? Где точки - пусто
00000000 00000000 0000000. 00000000
00000000 00000000 0000000. 00000000
........
да
да
ОК. Поменяйте строку
на такую:
И снова посмотрите, должен быть погашен самый правый столбик.
! инверсия?
Да. Меняем местами 1-ю и 0-ю матрицы.
Так какой сейчас не горит, последний?
if(channel == 15) channel = 0;
00000000 00000000 00000000 0000000.
00000000 00000000 00000000 0000000.
.......
ОК, понятно. Странное, вообще-то, как для меня, подключение матриц. Получается столбцы в матрицах считаются слева направо, а сами матрицы расположены справа - налево. Ну да ладно.
Меняйте обратно 15 на 16 и продолжим.
Должен пока-что получиться вот такой скетч:
Если его скомпилировать и залить в ардуину, то должны видеть на самой первой слева матрице мигающую единицу, дальше очень быстро меняющиеся цифры и на двух последних матрицах столбцы.
цыфры меняться быстро , а вот еденица моргает на разных местах обоих матриц
В смысле "на разных местах обоих матриц"? На самой первой матрице должно выводиться: то единица (в одном и том же месте), то пусто. Эта единица по матрицах прыгать не должна. На следующей матрице очень очень быстро должны меняться цифры. Они тоже должны быть на одном и том же месте. Вы скетч тот, что я только-что выложил заливали?
наводки довал мультик a0 я притянул к земле , хаотичное скакание еденичы пропало и остались только быстро бегущие цифры в солбиках не горит и не мрогает ни один из пикселей
Странно, добавьте пожалуйста, например, перед строкой channel++; строку delay(1000);
На первых двух матрицах должны по-очереди меняться числа от 0 до 15 и далее по-кругу.
Попробуйте на несколько секунд A0 притягивать к земле, потом к +5V и оставлять висеть свободным. Это не должно сказываться на выводе цифр, только на столбиках. Результат сообщите.
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
когда притянул , к +5 а0 то цифры начали идти по порядку вместе со столбиками , о когда притянул к земле солбики поочередно исчезли , а когда пин без нечего начинаться наводки и сотлбики разной длинны
Ну все правильно. Главное, что все на своих местах.
да все на своих местах
Поехали дальше. Я для себя уже выстроил сценарий. Но мне интересны ваши мысли. Для начала, как вы себе представляете должны показываться активные номера каналов? Т.е., как оно все должно выглядеть визуально?
к каждому сотлбику ныжно привязать цифру и выводить когда значения будут больше ноля
тут массив наверно пондобиться чтобы значения со столбиков складывать а потом вызывать цифры
Направление мыслей верное. Но вы говорили, что активным может быть не только один канал. Как предлагаете разглядеть числа, если активными будут одновременно каналов 5, 10, а то и все 16? Вы же видели, что творилось на экране, когда числа выводились все по-очереди (до введения задержки).
записывать в массив текущее состояние и выводить по очереди в секунду а если массив с пустыми значениями сразу же вывести 255,
ОК. Тогда приступайте к реализации. А с проблемами будем разбираться по мере их возникновения.
Не совсем. Во-первых. Строки 68-69: если n > 16, то n = 0. Т.е., n будет принимать значения от 0 до 16, итого 17 значений. ??? Но у нас ведь только 16 каналов, да и массив объявлен на 16 элементов. А во-вторых, зачем нам n, если у нас уже есть переменная channel, которая работает абсолютно точно так же (ну, если учесть замечание) - постоянно меняет свое значение от 0 до 15 при каждом проходе лупа? Зачем нам еще одна точно такая же переменная (только с другим именем)? Используйте channel.
И в-третьих. В строке 66 вы пишете byte LevelStolbik[n] = val; Похоже, вы не понимаете разницы между объявлением переменной и ее использованием. Проще говоря, зачем снова писать byte перед переменной, если вы уже это делали в 13-й строке? Я уже ранее писал, что делая так в разных блоках, вы объявляете новую (еще одну) переменную с таким же именем. Ну и эта конструкция вообще не будет компилироваться, поскольку массивы объявляются несколько иначе (с точки зрения компилятора тут вы как раз попытались объявить массив, а не присвоить его какому-то элементу значение).
Если я больше ничего не проглядел, то так уже правильно.
Ну, как-бы, да - переменные предназначены для хранения данных (если быть точнее, меняющихся данных). Но ведь никто не запрещает нам хранящиеся в них данные использовать в разных местах. Вот, например, эту же переменную chanel мы сначала использовали чтобы задать адрес для мультиплексора (строки 55-59) - "вытягивали" из нее биты, а потом в 64-й строке использовали ее уже для расчета номеров матрицы и столбца при выводе столбиков.
Мало того, одну и ту же переменную можем использовать для хранения однотипных данных, логически никак не связанных. Например, в одно время хранить в ней значение температуры, а потом, когда температура нам больше не нужна, записать туда расстояние до объекта. Но это уже моветон и лучше так не делать, сами же можем и запутаться. Это как грузовиком, что возит навоз, возить еще и персики.