Массив из переменных

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Привет. Нужно создать массив, состоящий из 6 переменных. Выглядят они так:

Цитата:

  [color=#CC6600]int[/color] Hour = RTC.get(DS1307_HR,[color=#CC6600]true[/color]);
  [color=#CC6600]int[/color] Min = RTC.get(DS1307_MIN,[color=#CC6600]false[/color]);
  [color=#CC6600]int[/color] Sec = RTC.get(DS1307_SEC,[color=#CC6600]false[/color]);
  [color=#CC6600]int[/color] Dt = RTC.get(DS1307_DATE,[color=#CC6600]false[/color]);
  [color=#CC6600]int[/color] Mth = RTC.get(DS1307_MTH,[color=#CC6600]false[/color]);
  [color=#CC6600]int[/color] Yr = RTC.get(DS1307_YR,[color=#CC6600]false[/color]);


int Time получается объявить из этих переменных, но в серийный порт выводится лишь одна цифра - 2201.Я так понял, это случайная цифра, т.к это ни год, ни месяц, ни час, ни минута, и ни что-то из них.

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

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013
  int Hour = RTC.get(DS1307_HR,true);
  int Min = RTC.get(DS1307_MIN,false);
  int Sec = RTC.get(DS1307_SEC,false);
  int Dt = RTC.get(DS1307_DATE,false);
  int Mth = RTC.get(DS1307_MTH,false);
  int Yr = RTC.get(DS1307_YR,false);

 

vdk
Offline
Зарегистрирован: 14.04.2013
int Time[7]; // объявляем массив

Time[1] = RTC.get(DS1307_HR,true); 
Time[2]  = RTC.get(DS1307_MIN,false);
// и т.д.

как-то вот так

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Да, ещё вопрос, но не в тему: возможно ли создание нескольких loop()? У меня была идея - в одном loop() сделать счетчик времени, в другом - вольтметр, в третьем - условие вывода их на дисплей. Возможно ли это сделать? Для этого разумеется, нужен вывод массива Time за пределы loop...

Snubist
Offline
Зарегистрирован: 18.02.2013

Ты хочешь паралельно запустить три процесса?

vdk
Offline
Зарегистрирован: 14.04.2013

Nickalaich пишет:

Да, ещё вопрос, но не в тему: возможно ли создание нескольких loop()? У меня была идея - в одном loop() сделать счетчик времени, в другом - вольтметр, в третьем - условие вывода их на дисплей. Возможно ли это сделать? Для этого разумеется, нужен вывод массива Time за пределы loop...

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

Намного проще все три задачи объединить в одном loop

Переменные, объявленные вне функций (и вне setup и loop), считаются глобальными (если упрощенно, то объявлять их нужно до setup)

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Можете показать примеры трёх loop() в таком виде? Как это должно выглядеть?

Да, два процесса парраллельно, но результат от них будет только при условии выполнения условия в 3 цикле.

vdk
Offline
Зарегистрирован: 14.04.2013

Nickalaich пишет:

Можете показать примеры трёх loop() в таком виде? Как это должно выглядеть?

Ну, как-то вот так: http://easyelectronics.ru/avr-uchebnyj-kurs-arxitektura-programm-chast-3...

(и там дальше по ссылкам)

Но непонятно, что вам мешает делать все последовательно

 

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Делая последовательно, у меня не получается подобрать подходящее условие... Если я беру if - else тогда при нажатии на кнопку, информация на дисплее не обновляется. А если я беру while - выполняется то одно, то другое, без нажатия кнопки.

Snubist
Offline
Зарегистрирован: 18.02.2013

Код приведи, а то не совсем понятно.

Adno
Offline
Зарегистрирован: 21.09.2012

int Time[2];

enum {
Hour, // 0
Min, // 1
Sec // 2
};

Тогда вызов Time[Hour]=RTC.get(DS1307_HR,true)

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013
#include <LiquidCrystal.h>
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
  
  lcd.begin(16,2);
  Serial.begin(9600);
/*
  RTC.stop();
  RTC.set(DS1307_SEC,0);        //set the seconds
  RTC.set(DS1307_MIN,35);     //set the minutes
  RTC.set(DS1307_HR,20);       //set the hours
  RTC.set(DS1307_DOW,7);       //set the day of the week
  RTC.set(DS1307_DATE,28);       //set the date
  RTC.set(DS1307_MTH,4);        //set the month
  RTC.set(DS1307_YR,13);         //set the year
  RTC.start();
*/
}

void loop()
{
  int x = analogRead(0);
  do
   {
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  lcd.print(":");
  lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  lcd.print(":");
  lcd.print(RTC.get(DS1307_SEC,false));//read seconds
  lcd.setCursor(3,1);                 // some space for a more happy life
  lcd.print(RTC.get(DS1307_DATE,false));//read date
  lcd.print("/");
  lcd.print(RTC.get(DS1307_MTH,false));//read month
  lcd.print("/");
  lcd.print(RTC.get(DS1307_YR,false)); //read year
  delay(1000);
   }
   while(x<100);
do
   {
  lcd.clear();
  int z = analogRead(3);
  double y = z/204.6;
  lcd.print("Voltage is:");
  lcd.setCursor(12,0);
  lcd.print(y);
  delay(500);
  }
  while(x<600);
  }

Собрано из нескольких кусков кода. Компилируется, но работает не корректно.

Nickalaich
Nickalaich аватар
Offline
Зарегистрирован: 07.04.2013

Adno, массив Time мне нужно использовать в целом. Вызываться он должен в Serial.println() и lcd.print().

Snubist
Offline
Зарегистрирован: 18.02.2013

Не совсем понятно, где в коде кнопка,  похоже на analogRead(0) ???. И что она должна делать. И зачем зацикливать вывод на дисплей в разных циклах.

ну попробуй вот так


#include <DS1307.h>
#include <LiquidCrystal.h>
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Wire.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int SetCur1=4, SetCur2=12;
void setup()
{
  
  lcd.begin(16,2);
  Serial.begin(9600);
}

void loop()
{
  if (analogRead(0)<100) //если кнопка не нажата
    {
    SetCur1=4; //Курсор на первой строке
    SetCur2=12; //Курсор на второй строке 
  }
else //если кнопка нажата
  {
  SetCur1=12;//Курсор на второй строке
  SetCur2=4;  //Курсор на первой строке
  }
    
lcd.clear();
lcd.setCursor(SetCur1,0);
lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
lcd.print(":");
lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
lcd.print(":");
lcd.print(RTC.get(DS1307_SEC,false));//read seconds
lcd.setCursor(3,1);                 // some space for a more happy life
lcd.print(RTC.get(DS1307_DATE,false));//read date
lcd.print("/");
lcd.print(RTC.get(DS1307_MTH,false));//read month
lcd.print("/");
lcd.print(RTC.get(DS1307_YR,false)); //read year
int z = analogRead(3);
double y = z/204.6;
lcd.setCursor(SetCur2,0);
lcd.print("Voltage is:");
lcd.print(y);
delay(500);

}