Привет всем подскажите пожалуйста как мне написать алгоритм работы нажатых кнопак
В данный момент код работает так нажимаешь на первую кнопку скважность 200, нажимаешь на вторую кнопку не отпуская первую скважность прыгает 200 до 190, или с кажем нажимаешь 3 и 6 вместе скважность начинает прыгать с 180 до 150.
Подскажите как сделать чтобы скважность читалась только по верхней кнопке не зависимо в каком порядке они были нажаты
Пример нажимаю 1.2.5 вместе не зависимо в каком порядке кнопку скважность читается только по 5, нажимаешь 4.5.6 скважность читается только по 6. или 1.3 скважность только по 3.
int ledPin = 9; // выход сигнала
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
boolean val[9] = {0,0,0,0,0,0,0,0};
void setup()
{
pinMode(ledPin, OUTPUT); пин 9 на выход
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
for(int i=1; i<8; i++){ // читаем 8 входов 165
digitalWrite(clockPin, 0); // время лог 0
val[i] = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 1
}
if (val[1]== 1){
int fadeValue = 200 ; // скважность 200
analogWrite(ledPin, fadeValue); // выводим на выход
}
if (val[2]== 1){
int fadeValue = 190 ; // скважность 190
analogWrite(ledPin, fadeValue); // выводи на выход
}
if (val[3]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
}
if (val[4]== 1){
int fadeValue = 170 ;
analogWrite(ledPin, fadeValue);
}
}
if (val[1,2,3]== 1){ // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках //
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
И так тоже
else if (val[1,2,3]== 1){ // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках//
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
int ledPin = 9;
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
boolean val[9] = {0,0,0,0,0,0,0,0};
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
for(int i=1; i<9; i++){ // читаем 8 входов 165
digitalWrite(clockPin, 0); // время лог 0
val[i] = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 1
}
if (val[1]== 1){ // если приходит 1 то выполняем команду в фигурных скобках//
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
}
if (val[1,2,3]== 1){ // если приходит 1,2,3 то выполняем команду в фигурных скобках//
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
if (val[2]== 1){ // если приходит 2 то выполняем команду в фигурных скобках//
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
}
if (val[3]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
}
if (val[4]== 1){
int fadeValue = 170 ;
analogWrite(ledPin, fadeValue);
}
if (val[1]== 1){
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
if (val[2]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[3]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue);
if (val[4]== 1){
int fadeValue = 170 ;
analogWrite(ledPin, fadeValue);
if (val[15]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[17]== 1){
int fadeValue = 180 ;
analogWrite(ledPin, fadeValue
if (val[1,0,0,0,0,0,0,0]== 1){
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
if (val[0,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[1,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
Максим подскажи пожалуйста как биты с регистра сдвиг анне посредственно привязать
if (val[1,0,0,0,0,0,0,0]== 1){
int fadeValue = 200 ;
analogWrite(ledPin, fadeValue);
if (val[0,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
if (val[1,1,0,0,0,0,0,0]== 1){
int fadeValue = 190 ;
analogWrite(ledPin, fadeValue);
Я вот смотрю и не могу понять вы чего хотите добиться от своего код??? откоментируйте строки, что бы было ясно чего вы хотите от той или иной строки и опишите что вообще пытаетесь сделать - алгоритм работы.
берем сохранённые данныё с дата ( с регистра сдвига)
и делим на 8 частей и присваиваем каждой цифру по возрастанию
Нажимаем первую кнопку
if (val[2]== 1){ // если есть принятый символ 2 //
int fadeValue = 190 ; // то выполняем действие //
analogWrite(ledPin, fadeValue); // отправляем на пин 9//
Нажимаем две кнопки одновременно 1 и 2
if (val[1]== 1 && val[2]==1){ // если есть принятый символ 1-2 //
int fadeValue = 190 ; // то выполняем действие //
но когда нажимаешь две кнопки одновременно скважность прыгает от 200 до 190
вот я и спрашиваю как мне сделать что бы можно было вставлять все восемь бит как мне привязать код к ним я думаю так скачков не будит
как их все проверять в одном
if (val[1,0,0,0,0,0,0,0]== 1){
// принятые биты с регистра сдвига ( 1,0,0,0,0,0,0,0,0) нажата первая кнопка//
int fadeValue = 200 ; // скважность 200 //
analogWrite(ledPin, fadeValue); // отправляем на пин 9//
if (val[0,1,0,0,0,0,0,0]== 1){
// принятые биты с регистра сдвига ( 0,1,0,0,0,0,0,0,0) нажата вторая кнопка//
int fadeValue = 190 ; // скважность 190 //
analogWrite(ledPin, fadeValue); // отправляем на пи 9//
if (val[1,1,0,0,0,0,0,0]== 1){
// принятые биты с регистра сдвига ( 1,1,0,0,0,0,0,0,0) // нажаты первая и вторая кнопка вместе //
int fadeValue = 190 ; // скважность 190 //
analogWrite(ledPin, fadeValue); //отправляем на пин 9//
Извини Максим за столь наверно для тебя глупые вопросы, Я в течения дня по мучаюсь по мучаюсь так по делаю и так и патом снова на форум за советом ,когда не чего не получается.
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, MSBFIRST);
if (val == B10000000) fadeValue = 50 ;
// читаем 8 бит и если на 1 бите высокий уровень то отправляем скважность 50 на пин 9
if (val == B01000000) fadeValue = 190 ;
if (val == B00100000) fadeValue = 180 ;
if (val == B00010000) fadeValue = 170 ;
if (val == B00001000) fadeValue = 160 ;
if (val == B00001100) fadeValue = 150 ;
// читаем 8 бит и если на 5 и 6 бите высокий уровень то отправляем скважность 150 на пин 9
if (val == B00000010) fadeValue = 140 ;
if (val == B00000001) fadeValue = 10 ;
analogWrite(ledPin, fadeValue);
}
Всё работает практически идеально НО первый бит теряется точнее не первый а 8 ну в зависимости от LSBFIRST или MSBFIRST , первая кнопка или восьмая не какой реакции как будто биты сдвинуты
Цепляем последовательно два регистра сдвига
if (val == B00000000 || val == B10000000) fadeValue = 190 ;
и потерянный 8 бит у нас появляется в втором
|| val == B10000000
на остальные кнопки после 8 бита не какой реакции Подскажи пожалуйста как сделать чтобы два регистра работали в месте в чём причина что не хватает
Так и так уже пробовал и кучу других способ
if (val == B00000000 && val == B10000000) //ошибка
if (val == B00000000 .B10000000) // ошибка
if val { B00000000 , B10000000) // ошибка
if (val[0,0,0,0,0,0,0,0] || val[0,0,0,1,0,0,0,0 ) //ошибка
Ну что же Вы? ShiftIn - восьмибитная штука, а у Вас 16 кнопок! Вам нужно что-то в стиле:
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, MSBFIRST);
val=(val<<8)+ shiftIn(dataPin, clockPin, MSBFIRST); //сдвигаем на 8 бит влево, в младшие биты вписываем второй байт с регистров
if (val == B1000000000000000) fadeValue = 50 ;
// читаем 16 бит и если на 1 бите высокий уровень то отправляем скважность 50 на пин 9
Тип переменной val должен быть WORD или unsigned int или uint16_t соответственно
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
byte val = 0, prev_val = 0;
void setup(){
Serial.begin(9600);
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop(){
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
if(val != prev_val){
Serial.println(val, BIN);
prev_val = val;
delay(200);
}
}
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
void loop(){
digitalWrite(inloadPin, 0);
digitalWrite(inloadPin, 1);
for(int i=0; i<=7; i++){ // читаем биты с 0 по 7 соответственно если пишем с 0 по 15 это 2 регистра параллельно
digitalWrite(inclockPin, 0);
temp = digitalRead(indataPin);
digitalWrite(inclockPin, 1);
Serial.print (temp);
}
Serial.println ("");
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
byte val = 0, prev_val = 0;
void setup(){
Serial.begin(9600);
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop(){
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
if(val != prev_val){
Serial.println(val, BIN);
prev_val = val;
delay(200);
}
}
запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
void loop(){
digitalWrite(inloadPin, 0);
digitalWrite(inloadPin, 1);
for(int i=0; i<=7; i++){ // читаем биты с 0 по 7 соответственно если пишем с 0 по 15 это 2 регистра параллельно
digitalWrite(inclockPin, 0);
temp = digitalRead(indataPin);
digitalWrite(inclockPin, 1);
Serial.print (temp);
}
Serial.println ("");
Вот вы почему такой упертый??? можете сделать как я вам написал и показать что у вас в сериал монитор выводится?
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Могу предположить, что 74yc165 отдает бит по заднему фронту импульсов линии тактирования, а функция shiftIn читает по переднему фронту и первый бит теряется, но могу и ошибаться. Самое протое решение это отказаться от shiftIn и воспользоваться тем, что работает.
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Тогда поопределять константы:
#define MB1000000000000000 (1<<15)
Можно тогда даже не константы объвлять, а прям в условиях двигать биты
Ну с другой стороны пускай он улетает один бит лишь бы он не влиял на остальную последовательность я понимаю что хвост будит первого регистра в начале второго
все работает как мне надо. Но есть одно но...
при нажатии первой загорается последний лед , а при нажатии последней кнопки - первый лед на ардуино
то есть кнопки считываются в обратном порядке.
Ребят, я конечно дико извиняюсь, что влажу со своими 2 копейками, но у меня просто порвался шаблон.....
Я так понимаю есть 8 лампочек и 8 выключателей к этим лампочкам... причем выключатели нормально замкнутые, когда нажимаеш на выключатель то цепь разрывается и лампочка гаснет, отпускаеш выключатель, цепь замыкается и лампочка загорается...
Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..
Привет всем подскажите пожалуйста как мне написать алгоритм работы нажатых кнопак
В данный момент код работает так нажимаешь на первую кнопку скважность 200, нажимаешь на вторую кнопку не отпуская первую скважность прыгает 200 до 190, или с кажем нажимаешь 3 и 6 вместе скважность начинает прыгать с 180 до 150.
Подскажите как сделать чтобы скважность читалась только по верхней кнопке не зависимо в каком порядке они были нажаты
Пример нажимаю 1.2.5 вместе не зависимо в каком порядке кнопку скважность читается только по 5, нажимаешь 4.5.6 скважность читается только по 6. или 1.3 скважность только по 3.
int ledPin = 9; // выход сигнала int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 boolean val[9] = {0,0,0,0,0,0,0,0}; void setup() { pinMode(ledPin, OUTPUT); пин 9 на выход pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop() { digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=1; i<8; i++){ // читаем 8 входов 165 digitalWrite(clockPin, 0); // время лог 0 val[i] = digitalRead(dataPin); // читаем состояние 165 digitalWrite(clockPin, 1); // время лог 1 } if (val[1]== 1){ int fadeValue = 200 ; // скважность 200 analogWrite(ledPin, fadeValue); // выводим на выход } if (val[2]== 1){ int fadeValue = 190 ; // скважность 190 analogWrite(ledPin, fadeValue); // выводи на выход } if (val[3]== 1){ int fadeValue = 180 ; analogWrite(ledPin, fadeValue); } if (val[4]== 1){ int fadeValue = 170 ; analogWrite(ledPin, fadeValue); } }else if
не понимаю чего тут не хватает или ошибка в коде
Так не какой реакции
if (val[1,2,3]== 1){ // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках // int fadeValue = 180 ; analogWrite(ledPin, fadeValue);И так тоже
else if (val[1,2,3]== 1){ // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках// int fadeValue = 180 ; analogWrite(ledPin, fadeValue);int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 boolean val[9] = {0,0,0,0,0,0,0,0}; void setup() { pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop() { digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=1; i<9; i++){ // читаем 8 входов 165 digitalWrite(clockPin, 0); // время лог 0 val[i] = digitalRead(dataPin); // читаем состояние 165 digitalWrite(clockPin, 1); // время лог 1 } if (val[1]== 1){ // если приходит 1 то выполняем команду в фигурных скобках// int fadeValue = 200 ; analogWrite(ledPin, fadeValue); } if (val[1,2,3]== 1){ // если приходит 1,2,3 то выполняем команду в фигурных скобках// int fadeValue = 180 ; analogWrite(ledPin, fadeValue); if (val[2]== 1){ // если приходит 2 то выполняем команду в фигурных скобках// int fadeValue = 190 ; analogWrite(ledPin, fadeValue); } if (val[3]== 1){ int fadeValue = 180 ; analogWrite(ledPin, fadeValue); } if (val[4]== 1){ int fadeValue = 170 ; analogWrite(ledPin, fadeValue); }val[1,2,3] это что??? Массивы
if(val[1]== 1 || val[2]== 1 || val[3]== 1) или if(val[1]== 1 && val[2]== 1 && val[3]== 1)
Вынесите строчку analogWrite(ledPin, fadeValue); из условий после всех условий, что бы не плодить эту строку в каждом условии.
И нажмите Ctrl+T в Ардуино.
Спасибо
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 boolean val[9] = { 0,0,0,0,0,0,0,0}; void setup() { pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop() { digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=1; i<9; i++){ // читаем 8 входов 165 digitalWrite(clockPin, 0); // время лог 0 val[i] = digitalRead(dataPin); // читаем состояние 165 digitalWrite(clockPin, 1); // время лог 1 } if (val[1]== 1){ // если условия 1 то выполняем команду в фигурных скопках// int fadeValue = 200 ; } if (val[2]== 1){ int fadeValue = 190 ; } analogWrite(ledPin, fadeValue); }Вот так совершенно не реагирует на заданные кнопки if(val[1]== 1 || val[2]== 1 || val[3]== 1)
А вот так скважность меняется но всё равно не стабильно if(val[1]== 1 && val[2]== 1 && val[3]== 1)
int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 boolean val[9] = { 0,0,0,0,0,0,0,0}; void setup() { pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop() { digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=1; i<9; i++){ // читаем 8 входов 165 digitalWrite(clockPin, 0); // время лог 0 val[i] = digitalRead(dataPin); // читаем состояние 165 digitalWrite(clockPin, 1); // время лог 1 } if (val[1]== 1){ // если условия 1 то выполняем команду в фигурных скопках// int fadeValue = 200 ; analogWrite(ledPin, fadeValue); } if (val[2]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue); } if (val[3]== 1){ int fadeValue = 180 ; analogWrite(ledPin, fadeValue); } if (val[4]== 1){ int fadeValue = 170 ; analogWrite(ledPin, fadeValue); } if (val[2]== 1 && val[3] == 1){ int fadeValue = 50 ; analogWrite(ledPin, fadeValue); } }прыгает скважность когда нажимаешь две кнопки одновременно
А когда одну то всё нормально, и как добиться такой стабильности при нажатие двух кнопка
Может это как то так сделать. Я образно магу мысль обрисовать и то не всегда.
Кнопка нажимаем по отдельность
1 - A - if (val[A]== 1 int fadeValue = 200 ;
2 - B - if (val[A]== 1 int fadeValue = 190 ;
3 - C - if (val[A]== 1 int fadeValue = 180 ;
4 - D - if (val[A]== 1 int fadeValue = 170 ;
Жмём две кнопки в месте 1-2 получаем В и от B идёт команда
1 |
| } B - if (val[A]== 1 int fadeValue = 190 ;
2 |
3 - C - if (val[A]== 1 int fadeValue = 180 ;
4 - D - if (val[A]== 1 int fadeValue = 170 ;
Или жмём три кнопки одновременно 1-2-3 получаем C и от C идёт команда
1 |
|
2 | } С - if (val[A]== 1 int fadeValue = 180 ;
|
3 |
4 - D - if (val[A]== 1 int fadeValue = 170 ;
Это наверно глупо выглядит?
Или как то так что ли привязать цифры
{1,0,0,0,0,0,0,0} - 1
{0,1,0,0,0,0,0,0} - 2
{0,0,1,0,0,0,0,0} - 3
{0,0,0,1,0,0,0,0} - 4
{1,1,0,0,0,0,0,0} – 15
{1,1,0,1,0,0,0,0} - 17
if (val[1]== 1){ int fadeValue = 200 ; analogWrite(ledPin, fadeValue); if (val[2]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue); if (val[3]== 1){ int fadeValue = 180 ; analogWrite(ledPin, fadeValue); if (val[4]== 1){ int fadeValue = 170 ; analogWrite(ledPin, fadeValue); if (val[15]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue); if (val[17]== 1){ int fadeValue = 180 ; analogWrite(ledPin, fadeValueили так
if (val[1,0,0,0,0,0,0,0]== 1){ int fadeValue = 200 ; analogWrite(ledPin, fadeValue); if (val[0,1,0,0,0,0,0,0]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue); if (val[1,1,0,0,0,0,0,0]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue);Что бы восемь бит привязывать к команде
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Объявите int fadeValue = 0; глобально, а не в каждом условии.
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Объявите int fadeValue = 0; глобально, а не в каждом условии.
Так я уже делал , не на одну кнопку не реагирует
Я еже совсем запутался
Максим подскажи пожалуйста как биты с регистра сдвиг анне посредственно привязать
if (val[1,0,0,0,0,0,0,0]== 1){ int fadeValue = 200 ; analogWrite(ledPin, fadeValue); if (val[0,1,0,0,0,0,0,0]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue); if (val[1,1,0,0,0,0,0,0]== 1){ int fadeValue = 190 ; analogWrite(ledPin, fadeValue);или так нельзя сделать
Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);
Объявите int fadeValue = 0; глобально, а не в каждом условии.
Так я уже делал , не на одну кнопку не реагирует
Не правильно делали.
Я вот смотрю и не могу понять вы чего хотите добиться от своего код??? откоментируйте строки, что бы было ясно чего вы хотите от той или иной строки и опишите что вообще пытаетесь сделать - алгоритм работы.
Максим подскажи пожалуйста как биты с регистра сдвиг анне посредственно привязать
или так нельзя сделать
У Вас 8-ми мерный массив?
Если хотите проверять отдельные биты и при этом не возиться с масками, читайте про функцию bitRead() - чтение отдельного бита.
Поясню для тех, у кого англиский - это китайский :)
// val - переменная, в которой мы проверяем биты if (bitRead(val, 7) == 1) //Проверяем седьмой бит { // делаем то, для чего 7-й бит предназначен }Извини я про сто не силён в этих делах.
мы спомащью
boolean val[9] = {0,0,0,0,0,0,0,0};берем сохранённые данныё с дата ( с регистра сдвига)
и делим на 8 частей и присваиваем каждой цифру по возрастанию
Нажимаем первую кнопку
if (val[2]== 1){ // если есть принятый символ 2 // int fadeValue = 190 ; // то выполняем действие //analogWrite(ledPin, fadeValue); // отправляем на пин 9//
Нажимаем две кнопки одновременно 1 и 2
if (val[1]== 1 && val[2]==1){ // если есть принятый символ 1-2 // int fadeValue = 190 ; // то выполняем действие //но когда нажимаешь две кнопки одновременно скважность прыгает от 200 до 190
вот я и спрашиваю как мне сделать что бы можно было вставлять все восемь бит как мне привязать код к ним я думаю так скачков не будит
как их все проверять в одном
if (val[1,0,0,0,0,0,0,0]== 1){ // принятые биты с регистра сдвига ( 1,0,0,0,0,0,0,0,0) нажата первая кнопка// int fadeValue = 200 ; // скважность 200 // analogWrite(ledPin, fadeValue); // отправляем на пин 9// if (val[0,1,0,0,0,0,0,0]== 1){ // принятые биты с регистра сдвига ( 0,1,0,0,0,0,0,0,0) нажата вторая кнопка// int fadeValue = 190 ; // скважность 190 // analogWrite(ledPin, fadeValue); // отправляем на пи 9// if (val[1,1,0,0,0,0,0,0]== 1){ // принятые биты с регистра сдвига ( 1,1,0,0,0,0,0,0,0) // нажаты первая и вторая кнопка вместе // int fadeValue = 190 ; // скважность 190 // analogWrite(ledPin, fadeValue); //отправляем на пин 9//Нажимаем втору кнопку
int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0; int fadeValue = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop() { digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165 // если условия 1 то выполняем команду в фигурных скопках// if (val == B10000000) fadeValue = 200 ; //нажата 1 кнопка if (val == B01000000) fadeValue = 190 ; //нажата 2 кнопка if (val == B00100000) fadeValue = 180 ; //нажата 3 кнопка if (val == B00010000) fadeValue = 170 ; //нажата 4 кнопка if (val == B01100000) fadeValue = 50 ; //нажата 2 и 3 кнопки analogWrite(ledPin, fadeValue); }если последовательность будет обратной то LSBFIRST нужно поменять на MSBFIRST
да для меня он точно китайский
спасибо большое за помощь я бы целую вечность разбирался бы
Извини Максим за столь наверно для тебя глупые вопросы, Я в течения дня по мучаюсь по мучаюсь так по делаю и так и патом снова на форум за советом ,когда не чего не получается.
void loop() { digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = shiftIn(dataPin, clockPin, MSBFIRST); if (val == B10000000) fadeValue = 50 ; // читаем 8 бит и если на 1 бите высокий уровень то отправляем скважность 50 на пин 9 if (val == B01000000) fadeValue = 190 ; if (val == B00100000) fadeValue = 180 ; if (val == B00010000) fadeValue = 170 ; if (val == B00001000) fadeValue = 160 ; if (val == B00001100) fadeValue = 150 ; // читаем 8 бит и если на 5 и 6 бите высокий уровень то отправляем скважность 150 на пин 9 if (val == B00000010) fadeValue = 140 ; if (val == B00000001) fadeValue = 10 ; analogWrite(ledPin, fadeValue); }Всё работает практически идеально НО первый бит теряется точнее не первый а 8 ну в зависимости от LSBFIRST или MSBFIRST , первая кнопка или восьмая не какой реакции как будто биты сдвинуты
Цепляем последовательно два регистра сдвига
на остальные кнопки после 8 бита не какой реакции Подскажи пожалуйста как сделать чтобы два регистра работали в месте в чём причина что не хватает
Так и так уже пробовал и кучу других способ
if (val == B00000000 && val == B10000000) //ошибка if (val == B00000000 .B10000000) // ошибка if val { B00000000 , B10000000) // ошибка if (val[0,0,0,0,0,0,0,0] || val[0,0,0,1,0,0,0,0 ) //ошибкаВ схеме всё нормально 100% проверил через
Serial.println все 16 бит реагируют на 16 кнопок
Вот вам тестилка для одного регистра:
int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; void setup(){ Serial.begin(9600); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165 if(val != prev_val){ Serial.println(val, BIN); prev_val = val; delay(200); } }запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
Ну что же Вы? ShiftIn - восьмибитная штука, а у Вас 16 кнопок! Вам нужно что-то в стиле:
digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = shiftIn(dataPin, clockPin, MSBFIRST); val=(val<<8)+ shiftIn(dataPin, clockPin, MSBFIRST); //сдвигаем на 8 бит влево, в младшие биты вписываем второй байт с регистров if (val == B1000000000000000) fadeValue = 50 ; // читаем 16 бит и если на 1 бите высокий уровень то отправляем скважность 50 на пин 9Тип переменной val должен быть WORD или unsigned int или uint16_t соответственно
Вот вам тестилка для одного регистра:
int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; void setup(){ Serial.begin(9600); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165 if(val != prev_val){ Serial.println(val, BIN); prev_val = val; delay(200); } }запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
void loop(){ digitalWrite(inloadPin, 0); digitalWrite(inloadPin, 1); for(int i=0; i<=7; i++){ // читаем биты с 0 по 7 соответственно если пишем с 0 по 15 это 2 регистра параллельно digitalWrite(inclockPin, 0); temp = digitalRead(indataPin); digitalWrite(inclockPin, 1); Serial.print (temp); } Serial.println ("");Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
В тесте нужно пользоваться той же функцией, что и в программе! Поэтому важно использовать именно shiftIn()!
Вот вам тестилка для одного регистра:
int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; void setup(){ Serial.begin(9600); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165 if(val != prev_val){ Serial.println(val, BIN); prev_val = val; delay(200); } }запустите сериал-монитор, пройдитесь по всем 8-ми кнопкам и покажите, что у вас выводится в сериал-монитор.
я такую же написал только немножко по другому
void loop(){ digitalWrite(inloadPin, 0); digitalWrite(inloadPin, 1); for(int i=0; i<=7; i++){ // читаем биты с 0 по 7 соответственно если пишем с 0 по 15 это 2 регистра параллельно digitalWrite(inclockPin, 0); temp = digitalRead(indataPin); digitalWrite(inclockPin, 1); Serial.print (temp); } Serial.println ("");Вот вы почему такой упертый??? можете сделать как я вам написал и показать что у вас в сериал монитор выводится?
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Тогда поопределять константы:
Извиняюсь , запустил код н ереагирует на первую кнопку а на остальные пиши 1-10-100-100 и так далии
И еще раз! покажите что у вас в мониторе, скопируйте и вставьте сюда, неужели это так сложно...
Я просто подумал что эти две программ одинаковы по смыслу
сикнал кнопка
нет ответа 1
1 2
0
10 3
0
100 4
0
1000 5
0
10000 6
0
100000 7
0
1000000 8
0
Ясно, а если так:
int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; void setup(){ Serial.begin(9600); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); delay(10); val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165 if(val != prev_val){ Serial.println(val, BIN); prev_val = val; delay(200); } }так же
В тесте нужно пользоваться той же функцией, что и в программе! Поэтому важно использовать именно shiftIn()!
ну дак я же не знал этого
Могу предположить, что 74yc165 отдает бит по заднему фронту импульсов линии тактирования, а функция shiftIn читает по переднему фронту и первый бит теряется, но могу и ошибаться. Самое протое решение это отказаться от shiftIn и воспользоваться тем, что работает.
Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит, а в 2 переменные размером в 1 байт по 8 бит.
Тогда поопределять константы:
Можно тогда даже не константы объвлять, а прям в условиях двигать биты
Будим пробовать :-)
Ну с другой стороны пускай он улетает один бит лишь бы он не влиял на остальную последовательность я понимаю что хвост будит первого регистра в начале второго
попробуйте так:
int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; void setup(){ Serial.begin(9600); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=0; i<8; i++){ // читаем биты с 0 по 7 digitalWrite(clockPin, 0); if(digitalRead(dataPin)) val |= 1<<i; else val &= ~(1<<i); digitalWrite(clockPin, 1); } if(val != prev_val){ Serial.println(val, BIN); prev_val = val; delay(200); } }попробуйте так:
int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; void setup(){ Serial.begin(9600); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=0; i<8; i++){ // читаем биты с 0 по 7 digitalWrite(clockPin, 0); if(digitalRead(dataPin)) val |= 1<<i; else val &= ~(1<<i); digitalWrite(clockPin, 1); } if(val != prev_val){ Serial.println(val, BIN); prev_val = val; delay(200); } }А так всё читает с 1 по 8
Тогда выносим рабочий код в отдельную функцию SiftIn8bit
int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, prev_val = 0; int fadeValue = 0; void setup(){ pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = SiftIn8bit(dataPin, clockPin); // читаем 8 входов 165 // если условия 1 то выполняем команду в фигурных скопках// if (val == B10000000) fadeValue = 200 ; //нажата 1 кнопка if (val == B01000000) fadeValue = 190 ; //нажата 2 кнопка if (val == B00100000) fadeValue = 180 ; //нажата 3 кнопка if (val == B00010000) fadeValue = 170 ; //нажата 4 кнопка if (val == B01100000) fadeValue = 50 ; //нажата 2 и 3 кнопки analogWrite(ledPin, fadeValue); } byte SiftIn8bit(byte dataPin, byte clockPin){ byte in8bit = 0; for(int i = 0; i < 8; i++){ // читаем биты с 0 по 7 digitalWrite(clockPin, 0); if(digitalRead(dataPin)) in8bit |= 1<<i; else in8bit &= ~(1<<i); digitalWrite(clockPin, 1); } return in8bit; }Для двух регистров есть два пути описаных выше.
1 вариант воспользоваться двумя переменными типа byte:
int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 byte val = 0, val2 = 0, prev_val = 0; int fadeValue = 0; void setup(){ pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = SiftIn8bit(dataPin, clockPin); // читаем 8 входов 165 val2 = SiftIn8bit(dataPin, clockPin); // читаем 8 входов 165 // если условия 1 то выполняем команду в фигурных скопках// if (val == B00000000 && val2 == B01000000) fadeValue = 170 ; //нажата 10 кнопка if (val == B10000000 && val2 == B00000000) fadeValue = 200 ; //нажата 1 кнопка if (val == B01000000 && val2 == B00000000) fadeValue = 190 ; //нажата 2 кнопка if (val == B00100000 && val2 == B00000000) fadeValue = 180 ; //нажата 3 кнопка if (val == B01100000 && val2 == B00000000) fadeValue = 50 ; //нажата 2 и 3 кнопки analogWrite(ledPin, fadeValue); } byte SiftIn8bit(byte dataPin, byte clockPin){ byte in8bit = 0; for(int i = 0; i < 8; i++){ // читаем биты с 0 по 7 digitalWrite(clockPin, 0); if(digitalRead(dataPin)) in8bit |= 1<<i; else in8bit &= ~(1<<i); digitalWrite(clockPin, 1); } return in8bit; }2 вариант воспользоваться одной переменной типа unsigned int:
int ledPin = 9; int dataPin = 11; // Вывод данных 165 int clockPin = 12; // Вывод время 165 int loadPin = 13; // Вывод выбора 165 unsigned int val = 0; int fadeValue = 0; void setup(){ pinMode(ledPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); val = SiftIn16bit(dataPin, clockPin); // читаем 16 входов 165 // если условия 1 то выполняем команду в фигурных скопках// if (val == 1<<6) fadeValue = 170 ; //нажата 10 кнопка if (val == 1<<15) fadeValue = 200 ; //нажата 1 кнопка if (val == 1<<14) fadeValue = 190 ; //нажата 2 кнопка if (val == 1<<13) fadeValue = 180 ; //нажата 3 кнопка if (val == B00000011<<14) fadeValue = 50 ; //нажата 2 и 3 кнопки analogWrite(ledPin, fadeValue); } unsigned int SiftIn16bit(byte dataPin, byte clockPin){ unsigned int in16bit = 0; for(int i = 0; i < 16; i++){ // читаем биты с 0 по 7 digitalWrite(clockPin, 0); if(digitalRead(dataPin)) in16bit |= 1<<i; else in16bit &= ~(1<<i); digitalWrite(clockPin, 1); } return in16bit; }Ну ты Макс профи, всё чудесно работает спасибо что помог и за то что пинка не дал)))
Вот состряпал код
int ledaPin = 3; int ledbPin = 4; int ledcPin = 5; int leddPin = 6; int ledePin = 7; int ledfPin = 8; int ledgPin = 9; int ledjPin = 10; int dataPin = 11; // Вывод данных 165-7нога int clockPin = 12; // Вывод время 165-2 нога int loadPin = 13; // Вывод выбора 165-1 нога boolean val[8] = { 0,0,0,0,0,0,0,0}; int fadeValue = 0; void setup(){ pinMode(ledaPin, OUTPUT); pinMode(ledbPin, OUTPUT); pinMode(ledcPin, OUTPUT); pinMode(leddPin, OUTPUT); pinMode(ledePin, OUTPUT); pinMode(ledfPin, OUTPUT); pinMode(ledgPin, OUTPUT); pinMode(ledjPin, OUTPUT); pinMode(dataPin, INPUT); // Ввод 165. pinMode(clockPin, OUTPUT); // Ввод время 165. pinMode(loadPin, OUTPUT); // Вывод load 165. } void loop(){ digitalWrite(loadPin, 0); digitalWrite(loadPin, 1); for(int i=0; i<8; i++){ // читаем 8 входов 165 digitalWrite(clockPin, 0); // время лог 0 val[i] = digitalRead(dataPin); // читаем состояние 165 digitalWrite(clockPin, 1); // время лог 1 } if (val[0]== 1) { digitalWrite(ledaPin, HIGH); } else { digitalWrite(ledaPin, LOW); } if (val[1]== 1) { digitalWrite(ledbPin, HIGH); } else { digitalWrite(ledbPin, LOW); } if (val[2]== 1) { digitalWrite(ledcPin, HIGH); } else { digitalWrite(ledcPin, LOW); } if (val[3]== 1) { digitalWrite(leddPin, HIGH); } else { digitalWrite(leddPin, LOW); } if (val[4]== 1) { digitalWrite(ledePin, HIGH); } else { digitalWrite(ledePin, LOW); } if (val[5]== 1) { digitalWrite(ledfPin, HIGH); } else { digitalWrite(ledfPin, LOW); } if (val[6]== 1) { digitalWrite(ledgPin, HIGH); } else { digitalWrite(ledgPin, LOW); } if (val[7]== 1) { digitalWrite(ledjPin, HIGH); } else { digitalWrite(ledjPin, LOW); } }все работает как мне надо. Но есть одно но...
при нажатии первой загорается последний лед , а при нажатии последней кнопки - первый лед на ардуино
то есть кнопки считываются в обратном порядке.
Почему?
Ребят, я конечно дико извиняюсь, что влажу со своими 2 копейками, но у меня просто порвался шаблон.....
Я так понимаю есть 8 лампочек и 8 выключателей к этим лампочкам... причем выключатели нормально замкнутые, когда нажимаеш на выключатель то цепь разрывается и лампочка гаснет, отпускаеш выключатель, цепь замыкается и лампочка загорается...
Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..
гы гы
Сейчас расскажу))