Запись чисел в массив

Egdar
Offline
Зарегистрирован: 01.12.2012

Здравствуйте!

В программе нужно записывать значения принимемые с кнопочной клавиатуры в массив, для  передачи на LCD и после обработки - на другое устройство. Не представляю как это сделать.

Просьба сильно не пинать - в программировании не силён, больше занимаюсь железом.

#include <Wire.h> //подключаем библиотеки
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);// параметры дисплея
long freqAj;
int i;//Счётчик циклов
//int j;//Счетчик циклов 2
int freqA[6]; //массив цифр для частоты А
int n=0;
word dataInput; 

#define DATA  9
#define LATCH 8
#define CLOCK 7
#define CLKUS 1

void setup() {     

  pinMode(DATA,INPUT);
  pinMode(LATCH,OUTPUT);
  pinMode(CLOCK,OUTPUT);

  freqA[0] = 1;   //начальное значение частоты
  freqA[1] = 4;  // в этот массив нужно записать значения с клавиатуры
  freqA[2] = 1;
  freqA[3] = 2;
  freqA[4] = 0;
  freqA[5] = 0;
  freqA[6] = 0;

  lcd.init();
}
void loop() {

  dataInput = 0;             // функция ввода с клавиатуры
  digitalWrite(LATCH,HIGH); // Parallel mode

  for (int i=15; i>=0; i--) {
    digitalWrite(CLOCK,HIGH); 
    delayMicroseconds(CLKUS);
    dataInput |= (digitalRead(DATA) ? (1<<i) : 0);
    digitalWrite(CLOCK,LOW);    
    delayMicroseconds(CLKUS);
    if (i==15) digitalWrite(LATCH,LOW); // Serial Mode
  }                           //Конец функции ввода с клавиатуры
  //delay(300);
  if (dataInput==0b1111111111111101)
  {
    n=1; 
  }
  else if (dataInput==0b1111111111111011)
  {
    n=2;
  }
  else if (dataInput==0b1111111111110111)
  {
    n=3;
  }
  else if (dataInput==0b1111111111101111)
  {
    n=4;
  }
  else if (dataInput==0b1111111111011111)
  {
    n=5;
  }
  else if (dataInput==0b1111111110111111)
  {
    n=6;
  }
  else if (dataInput==0b1111111101111111)
  {
    n=7;
  }
  else if (dataInput==0b1111111011111111)
  {
    n=8;
  }
  else if (dataInput==0b1111110111111111)
  {
    n=9;
  }
  else if (dataInput==0b1111111111111110)
  {
    n=0;
  }



  for(int j=0; j<7; j=j+1) // Начало функции вывода массива на LCD
  {
    lcd.backlight();
    lcd.setCursor(j,0);
    lcd.print(freqA[j]);
  }          // Конец функции вывода массива на LCD
}

 

mixail844
Offline
Зарегистрирован: 30.04.2012

если я прявильно понял из вашего сообщения и комменатариев в коде чеговы хотите- что бы значиение переменной n было записано в первую ячейку массива?

тогда вам просто нужно добавить в строчке 87 вашего кода : 



 freqA[1] = n;

 

Egdar
Offline
Зарегистрирован: 01.12.2012

Это понятно, с записью одного числа проблем нет. Нужно, что бы при нажатии второй кнопки, третьей и т.д. Числа записывались соответственно во 2-ю, 3-ю и т.д. до седьмой ячейки.

Состояние клавиатуры проверяется постоянно и если ни одна кнопка не нажата то на вывод 9 ардуины приходит 16 единиц. 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Добавляете переменную, для хранения позиции для записи цифры.

Например, после строки 9:

int pos = 1;

В строке 45:

n = -1;

В строке 87:

if(n>=0)
{
  freqA[pos] = n;
  pos++;
  if(pos>5) pos = 1;
}
Но у Вас в дальнейшем будет проблема в том, что когда все цифры будут введены (дойдете до последнего элемента в массиве), нужно понимать, что цифры нужно сдвинуть или закольцевать (у меня в примере выше именно так, закольцовано).
 
Egdar
Offline
Зарегистрирован: 01.12.2012

Спасибо большое, по Вашему примеру всё получается.

Появилась проблема - при выводе на LCD на последней позиции почему-то постоянно стоит -1 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

У Вас цикл до 6, а массив можно индексировать только до 5. Т.е.для массива индексы от 0 до 5, поскольку его размер 6. Либо увеличивайте размер массива, либо при выводе ограничьте цикл размером массива, т.е.6

Egdar
Offline
Зарегистрирован: 01.12.2012

Вот какой вид имеет код сейчас:

#include <Wire.h> //подключаем библиотеки
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);// параметры дисплея
int freqAj;
int i;//Счётчик циклов
//int j;//Счетчик циклов 2
int freqA[6]; //массив цифр для частоты А
int n;
word dataInput; 
int pos=0;
#define DATA  9
#define LATCH 8
#define CLOCK 7
#define CLKUS 1

void setup() {     //начальное значение частоты
  lcd.init();
  
  pinMode(DATA,INPUT);
  pinMode(LATCH,OUTPUT);
  pinMode(CLOCK,OUTPUT);

  freqA[0] = 1;
  freqA[1] = 4;
  freqA[2] = 1;
  freqA[3] = 2;
  freqA[4] = 0;
  freqA[5] = 0;
  freqA[6] = 0; 
}

void loop() {

  dataInput = 0;             // функция ввода с клавиатуры
  digitalWrite(LATCH,HIGH); // Parallel mode

  for (int i=15; i>=0; i--) {
    digitalWrite(CLOCK,HIGH); 
    delayMicroseconds(CLKUS);
    dataInput |= (digitalRead(DATA) ? (1<<i) : 0);
    digitalWrite(CLOCK,LOW);    
    delayMicroseconds(CLKUS);
    if (i==15) digitalWrite(LATCH,LOW); // Serial Mode
  }                           //Конец функции ввода с клавиатуры
  n=-1; 
  //delay(300);
  if (dataInput==0b1111111111111101)
  {
    n=1; 
  }
  else if (dataInput==0b1111111111111011)
  {
    n=2;
  }
  else if (dataInput==0b1111111111110111)
  {
    n=3;
  }
  else if (dataInput==0b1111111111101111)
  {
    n=4;
  }
  else if (dataInput==0b1111111111011111)
  {
    n=5;
  }
  else if (dataInput==0b1111111110111111)
  {
    n=6;
  }
  else if (dataInput==0b1111111101111111)
  {
    n=7;
  }
  else if (dataInput==0b1111111011111111)
  {
    n=8;
  }
  else if (dataInput==0b1111110111111111)
  {
    n=9;
  }
  else if (dataInput==0b1111111111111110)
  {
    n=0;
  }

  if(n>=0)
  {
    freqA[pos] = n;
    pos++;
    if(pos>6) pos = 0;
    delay(250);
  }

  for(int j=0; j<7; j=j+1) // Начало функции вывода массива на LCD
  {
    lcd.backlight();
    lcd.setCursor(j,0);
    lcd.print(freqA[j]);
  }          // Конец функции вывода массива на LCD
}

Изменение размера массива и цикла ничего не изменяет - на конце числа на LCD по прежнему -1.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В строке 7 исправьте размер массива с 6 на 7, Вы записываете за пределы массива операцией freqA[6]=0;