Помогите начинаюшему

Sim0012
Offline
Зарегистрирован: 26.02.2015

Пытаюсь освоить ардуино ...

Хочу выводить время температуру и влажность на дисплей от Nokia 5110  c температурой и влажностью все норм нашел рабочий код а вот со временем не совсем... не могу его вывести на дисплей только на ком порт получаеться..  

что надо изменить в коде?   

 

Посоветуйте литературку для начинаюших)

датчик темпереатуры dht11

модуль реального времени на основе DS3231

 

#include <LCD5110_Basic.h>

#include <dht11.h>
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
 
LCD5110 myGLCD(8, 9, 10, 11, 12);
dht11 sensor;
tmElements_t tm;
 
extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];
 
void setup()
{
  myGLCD.InitLCD(63);
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("");
  Serial.println("-------------------");
}
 
void loop()
{
  sensor.read(7);
  
  myGLCD.clrScr();
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI(sensor.temperature , LEFT, 0);  
  myGLCD.printNumI(sensor.humidity, 45, 0);
  
  myGLCD.setFont(SmallFont);
  myGLCD.print("C", 30, 20);
  myGLCD.print("%", 75, 20);
  
  myGLCD.print("12", CENTER, 38);
  
  delay(1000);
 tmElements_t tm;
 
  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
}
  
}
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}
bwn
Offline
Зарегистрирован: 25.08.2014

Я с этим дисплеем не работал, значит могу ошибатся. Для начала научитесь вставлять код http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

чтобы люди не бегали по всей портянке и могли ссылатся на конкретные строки. Далее разберитесь с системой команд дисплея

myGLCD.clrScr();

  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI(sensor.temperature , LEFT, 0);  
  myGLCD.printNumI(sensor.humidity, 45, 0);
  
  myGLCD.setFont(SmallFont);
  myGLCD.print("C", 30, 20);
  myGLCD.print("%", 75, 20);),
 
какой параметр за что отвечает. Когда научитесь выводить в нужное вам место информацию, по образу и подобию цепляйте туда время. Как то так. (второй и третий параметр после запятой, думаю столбец и строка откуда пойдет вывод)
Поскольку вы сразу взялись за достаточно сложный проект для начинающего, могу посоветовать только форум или англоязычные ресурсы.
X-Dron
Offline
Зарегистрирован: 24.01.2015

Если RTC DS3231, то почему используете библиотеку от DS1307. Они не совместимы.
Я пользовал эту https://github.com/NorthernWidget/DS3231
Примеры внутри библиотеки

skyspirit
Offline
Зарегистрирован: 27.02.2015

Sim0012 а какую плату arduino вы использовали? а то у меня Arduino Nano v3.0

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

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

skyspirit пишет:

Sim0012 а какую плату arduino вы использовали? а то у меня Arduino Nano v3.0

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

 

 

Начните вот с этого http://arduino.ru/Reference

И найдите У.Соммер "Програмирование микроконтроллерных плат Arduino/Freeduino". Ток начать придется с мигания светодиодм, а не с боевых дронов и звезд смерти.

Да, и шрифт нормальный поставьте.

Sim0012
Offline
Зарегистрирован: 26.02.2015

Использую uno китайскую

Sim0012
Offline
Зарегистрирован: 26.02.2015

X-Dron пишет:
Если RTC DS3231, то почему используете библиотеку от DS1307. Они не совместимы. Я пользовал эту https://github.com/NorthernWidget/DS3231 Примеры внутри библиотеки

 

В этой статье http://ardushop.ru/kak-podklyuchit-chasy-realnogo-vremeni-k-arduino/ говориться что они полностью совместимы. И у меня на компорт верное время выдаеться

skyspirit
Offline
Зарегистрирован: 27.02.2015

А код который пишется он подходит ко всем платам, например если написан для Nano а применять на Uno, Mega, Pro mini и т.п. или на оборот?

bwn
Offline
Зарегистрирован: 25.08.2014

skyspirit пишет:

А код который пишется он подходит ко всем платам, например если написан для Nano а применять на Uno, Mega, Pro mini и т.п. или на оборот?

В большинстве случаев да, но возможно придется дорабатывать если другой МК. Нано, UNO, Pro mini между собой скорее всего без проблем, а вот для Меги уже может не подойти (нужно дорабатывать)

skyspirit
Offline
Зарегистрирован: 27.02.2015

Если использовать мощные сервоприводи то желательно питание реализовать отдельно, не через USB? И если в спецификации платы указано питание 6-20в то можно спокойно подавать в данных пределах или лучше среднее что то вывести.

bwn
Offline
Зарегистрирован: 25.08.2014

На плату лучше не превышать 12В иначе могут сдохнуть ее стабилизаторы. USB только для экспериментов с оглядкой. Сервы двигатели реле только отдельное, кроме токов меньше помех по цифровым сетям.

skyspirit
Offline
Зарегистрирован: 27.02.2015

Я случайно кз своей ардуино сделал, все работает нормально но теперь только с дополнительным питанием , с USB не хватает светодиод  L на плате горит очень тускло. То что в этом случаи вышло из строя на платы?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Sim0012 Посмотри ветку форума "Русские символы LCD5110" в "Общие", может что-нибудь поможет тебе...

Sim0012
Offline
Зарегистрирован: 26.02.2015

нашел код для определения влажности почвы


#include <LiquidCrystal.h>
#include <OneWire.h>  //подключаем библиотеку
OneWire  ds(1);
 LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
 int pr=0;
 int pochva=0;

 void setup() {
   lcd.begin(16, 2);
  }


 void loop() {

    //Определение влажности почвы
    if (analogRead(2) <= 820) // Если очень влажная почва
     {lcd.setCursor(8, 1); lcd.setCursor(0,1); //Первый символ второй строки
   lcd.print("Pochva:"); //Текст второй строки
     lcd.print("Ochen Vlagno"); 
     delay(1000);}//Обновление значения каждые 10 секунд
   else if( analogRead(2)>820 && analogRead(2)<900)//Умеренно влажная
    {lcd.setCursor(8, 1); 
    lcd.print("VLAJNAYA");lcd.setCursor(0,1); //Первый символ второй строки
   lcd.print("Pochva:"); //Текст второй строки
    delay(1000);}//Обновление значения каждые 10 секунд
  else 
    {lcd.setCursor(8, 1);//Если сухая почва 
    lcd.print("SUHAYA");lcd.setCursor(0,1); //Первый символ второй строки
   lcd.print("Pochva:"); //Текст второй строки
    delay(1000);}//Обновление значения каждые 10 секунд
    
    

 }

и пытаюсь переделать его под дисплей нокиа 5110 но чтото  не выходит(( Посмотрите что не так )) 

#include <LCD5110_Basic.h>
#include <OneWire.h>

LCD5110 lcd(8, 9, 10, 11, 12);

extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];

void setup()
{
  lcd.InitLCD(63);
}

void loop()

 //Определение влажности почвы
    if (analogRead(2) <= 820) // Если очень влажная почва
     {lcd.setCursor(8, 1); lcd.setCursor(0,1); //Первый символ второй строки
   lcd.print("Pochva:"); //Текст второй строки
     lcd.print("Ochen Vlagno"); 
     delay(1000);}//Обновление значения каждые 10 секунд
   else if( analogRead(2)>820 && analogRead(2)<900)//Умеренно влажная
    {lcd.setCursor(8, 1); 
    lcd.print("VLAJNAYA");lcd.setCursor(0,1); //Первый символ второй строки
   lcd.print("Pochva:"); //Текст второй строки
    delay(1000);}//Обновление значения каждые 10 секунд
  else 
    {lcd.setCursor(8, 1);//Если сухая почва 
    lcd.print("SUHAYA");lcd.setCursor(0,1); //Первый символ второй строки
   lcd.print("Pochva:"); //Текст второй строки
    delay(1000);}//Обновление значения каждые 10 секунд
    
  
 }

пишет 

 
sketch_feb27a.ino:17:5: error: expected initializer before 'if'
sketch_feb27a.ino:22:4: error: expected unqualified-id before 'else'
sketch_feb27a.ino:27:3: error: expected unqualified-id before 'else'
sketch_feb27a.ino:34:2: error: expected declaration before '}' token
Ошибка компиляции.
 
X-Dron
Offline
Зарегистрирован: 24.01.2015

после void loop() открывающаяся фигурная скобка

Sim0012
Offline
Зарегистрирован: 26.02.2015

Теперь вообще целуу гору ошибок выдает((

 
sketch_mar04a.ino: In function 'void loop()':
sketch_mar04a.ino:18:11: error: 'class LCD5110' has no member named 'setCursor'
sketch_mar04a.ino:18:32: error: 'class LCD5110' has no member named 'setCursor'
sketch_mar04a.ino:19:23: error: no matching function for call to 'LCD5110::print(const char [8])'
sketch_mar04a.ino:19:23: note: candidates are:
In file included from sketch_mar04a.ino:1:0:
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note: void LCD5110::print(char*, int, int)
   void print(char *st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note:   candidate expects 3 arguments, 1 provided
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note: void LCD5110::print(String, int, int)
   void print(String st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note:   candidate expects 3 arguments, 1 provided
sketch_mar04a.ino:20:30: error: no matching function for call to 'LCD5110::print(const char [13])'
sketch_mar04a.ino:20:30: note: candidates are:
In file included from sketch_mar04a.ino:1:0:
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note: void LCD5110::print(char*, int, int)
   void print(char *st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note:   candidate expects 3 arguments, 1 provided
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note: void LCD5110::print(String, int, int)
   void print(String st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note:   candidate expects 3 arguments, 1 provided
sketch_mar04a.ino:23:10: error: 'class LCD5110' has no member named 'setCursor'
sketch_mar04a.ino:24:25: error: no matching function for call to 'LCD5110::print(const char [9])'
sketch_mar04a.ino:24:25: note: candidates are:
In file included from sketch_mar04a.ino:1:0:
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note: void LCD5110::print(char*, int, int)
   void print(char *st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note:   candidate expects 3 arguments, 1 provided
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note: void LCD5110::print(String, int, int)
   void print(String st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note:   candidate expects 3 arguments, 1 provided
sketch_mar04a.ino:24:31: error: 'class LCD5110' has no member named 'setCursor'
sketch_mar04a.ino:25:23: error: no matching function for call to 'LCD5110::print(const char [8])'
sketch_mar04a.ino:25:23: note: candidates are:
In file included from sketch_mar04a.ino:1:0:
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note: void LCD5110::print(char*, int, int)
   void print(char *st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note:   candidate expects 3 arguments, 1 provided
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note: void LCD5110::print(String, int, int)
   void print(String st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note:   candidate expects 3 arguments, 1 provided
sketch_mar04a.ino:28:10: error: 'class LCD5110' has no member named 'setCursor'
sketch_mar04a.ino:29:23: error: no matching function for call to 'LCD5110::print(const char [7])'
sketch_mar04a.ino:29:23: note: candidates are:
In file included from sketch_mar04a.ino:1:0:
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note: void LCD5110::print(char*, int, int)
   void print(char *st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note:   candidate expects 3 arguments, 1 provided
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note: void LCD5110::print(String, int, int)
   void print(String st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note:   candidate expects 3 arguments, 1 provided
sketch_mar04a.ino:29:29: error: 'class LCD5110' has no member named 'setCursor'
sketch_mar04a.ino:30:23: error: no matching function for call to 'LCD5110::print(const char [8])'
sketch_mar04a.ino:30:23: note: candidates are:
In file included from sketch_mar04a.ino:1:0:
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note: void LCD5110::print(char*, int, int)
   void print(char *st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:88:8: note:   candidate expects 3 arguments, 1 provided
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note: void LCD5110::print(String, int, int)
   void print(String st, int x, int y);
        ^
C:\Users\Sim0012\Documents\Arduino\libraries\NOKIAzaebala/LCD5110_Basic.h:89:8: note:   candidate expects 3 arguments, 1 provided
Ошибка компиляции.
 
Наверно я с библиотеками работать не умею
X-Dron
Offline
Зарегистрирован: 24.01.2015

Вы пытаетесь методами класса LiquidCrystal рулить в классе LCD5110. А там методы совершенно другие, нет там никаких setCursor, print имеет 3 операнда, а не один.

		LCD5110(int SCK, int MOSI, int DC, int RST, int CS);
		void	InitLCD(int contrast=LCD_CONTRAST);
		void	setContrast(int contrast);
		void	enableSleep();
		void	disableSleep();
		void	clrScr();
		void	clrRow(int row, int start_x = 0, int end_x = 83);
		void	invert(bool mode);
		void	invertText(bool mode);
		void	print(char *st, int x, int y);
		void	print(String st, int x, int y);
		void	printNumI(long num, int x, int y, int length=0, char filler=' ');
		void	printNumF(double num, byte dec, int x, int y, char divider='.', int length=0, char filler=' ');
		void	setFont(uint8_t* font);
		void	drawBitmap(int x, int y, bitmapdatatype bitmap, int sx, int sy);

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Для меня это пока аброкадабра(( Где можно поподробнее узнать?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

sandr4 пишет:

Sim0012 Посмотри ветку форума "Русские символы LCD5110" в "Общие", может что-нибудь поможет тебе...

Sim0012
Offline
Зарегистрирован: 26.02.2015

Пока все работает))) 

Sim0012
Offline
Зарегистрирован: 26.02.2015

А как сделать чтобы при определенной влажности включалось релле? 

Чтото вот это не хочет работать

if (analogRead(2) <= 200) {digitalWrite(7, HIGH);}

 

Sim0012
Offline
Зарегистрирован: 26.02.2015

Вроде разобрался)

void setup()
{
  pinMode( 7 , OUTPUT);
}

void loop()
{
  if (( ( 200 ) > ( analogRead(2) ) ))
  {
    digitalWrite( 7 , HIGH );
  }
  else
  {
    digitalWrite( 7 , LOW );
  }
}

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

digitalWrite(7, (analogRead(2) > 200));

вместо if-else

Sim0012
Offline
Зарегистрирован: 26.02.2015

А как снимать показания с датчика влажности почвы раз в минуту а не постоянно?

X-Dron
Offline
Зарегистрирован: 24.01.2015

if (millis()%60000==0) digitalWrite(7, (analogRead(2) > 200));

снимать и записывать

Sim0012
Offline
Зарегистрирован: 26.02.2015

Использую вот такой вт датчик влажности почвы и на него все время подаеться напряжение((( с эти можно чтото сделать?

Sim0012
Offline
Зарегистрирован: 26.02.2015

X-Dron пишет:

if (millis()%60000==0) digitalWrite(7, (analogRead(2) > 200));

снимать и записывать

В отделном скетче все работает . А когда совмещаю нет((( Что может быть?

#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
#include <dht11.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием

Time t; // Инициализация структуры 
//String str1;
char* str[]={"Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье"};
int d;

dht11 sensor;

void setup()
{
  Serial.begin(9600);
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  //rtc.setDOW(7);        // Установка дня недели
  //rtc.setTime(14, 25, 00);  // Установка времени 10:59:10 
  //rtc.setDate(01, 03, 2015);   // Установка даты 20 июля 2013
  pinMode( 7 , OUTPUT);
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(2); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10){
    display.setCursor(9,0);
    display.print("0");
    display.setCursor(22,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(9,0);
    display.print(t.hour);}
    
    display.setCursor(37,0);
    display.print("-");
    
  if(int(t.min)<10){
    display.setCursor(51,0);
    display.print("0");
    display.setCursor(65,0);
    display.print(int(t.min));} // Вывод минут  
  else{  
    display.setCursor(51,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(37, 0);
    display.print("0");
    display.setCursor(43, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(37, 0); 
    display.print((t.sec));} // Вывод секунд
    

  display.setCursor(13,17);
  display.print(rtc.getDateStr()); // Вывод даты
  sensor.read(4);
  display.setTextSize(1); // Установка набора символов
  display.setCursor(60, 27);
  display.print(sensor.temperature);
  display.setCursor(15, 27);
  display.print("Темп.С");
  display.setCursor(60, 37);
  display.print(analogRead(2));
  display.setCursor(15, 37);
  display.print("Влаж.%");  
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с

  if (millis()%3000==0) digitalWrite(7, (analogRead(2) > 200));
}

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

Из-за delay (1000) значение кратное millis()%3000 попадает в пропускаемый диапазон и ничего не работает. предложенный мной метод не работает если есть функции delay(), или программа достаточно большая. перед delay (1000) сделайте:
if (Counter++ == 0) digitalWrite(7,(analogRead(2)>200);
if (Counter >= 3) Counter=0;

добавьте к int d;
int d, Counter=0;

Sim0012
Offline
Зарегистрирован: 26.02.2015

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

#include <Wire.h>                    //необходимо для работы с часами
#include <OneWire.h>            // подключаем библиотеку для работы с 1-Wire
#include <DS1307.h>             // подключаем библиотеку для работы с часами DS1307


int ledPin = 7;   // управление светодиодами, присоединён к pin 7
long tmIntv = 1000;    //интервал для обновления времени на экране каждую секунду
long tempIntv = 30000;    //интервал для обновления температуры, хватит и пол минуты
long prvMlsTm = 0;    //предыдущее показание миллисекунд для обновления показания часов
long prvMlsTemp = 0;   //предыдущее показание миллисекунд для обновления показания температуы
long prvMlsLght = 0;    //предыдущее показание миллисекунд для проверки временного интервала
long lghtIntv = 5000;    //интервал для проверки включения/выключения освещения аквариума,5сек 1 минута
int lghtStat = 0;   //если подсветка включена, то в 1
int upLghtTime = 12;      //включаем в 8 утра
int downLghtTime = 7;     //выключаем в 17 вевера
int isNight = 0;    //если включаем на ночь, т.е. начальное время больше конечного
int prevSec = 0;  //предыдущее показание секунд для перезапуска если остановились

//отрабатывает при включении Arduino
void setup(){
  
  pinMode(ledPin, OUTPUT); // режим порта устанавливаем на вывод (запись)

  if (upLghtTime > downLghtTime) {          //если ночное время
    isNight = 1;
  }
}



void light () {    //включаем/выключаем освещение аквариума
  int hr;
  int isLght = 0;
  
  hr = RTC.get(DS1307_HR, true);    //получаем значение часов

  if (isNight == 0) {  //если день
    
    if (hr >= upLghtTime && hr < downLghtTime) {   //проверяем интервал
      isLght = 1;     //если необходимо включить свет
    } else {
      isLght = 0;
    }
    
  } else {    //если ночь
     
    if(hr - upLghtTime >= 0) {    //если больше или равно верхнему значению, то необходимо включить свет
      isLght = 1;   //если необходимо включить свет
    } else {
      if(hr < downLghtTime) {     //если меньше нижнего значения, то необходимо включить свет
        isLght = 1;    //если необходимо включить свет
      } else {
        isLght = 0;
      }
    }
  }  //закончился цикл выбора: день или ночь?

  if((isLght == 1) && (lghtStat == 0)) {   //если свет еще не включен и выставлен флаг необходимости включить
       lghtStat = 1;
       digitalWrite(ledPin, HIGH);   //собственно, включаем подавая высокий уровень на вывод
   } else {
     if(isLght == 0 && lghtStat == 1) {
         lghtStat = 0;
        digitalWrite(ledPin, LOW);     //собственно, выключаем снимая высокий уровень на выводе
     }
   }
    
}


void loop()     //постоянно отрабатывает в цикле

{
  unsigned long currentMillis = millis();   //миллисекунд прошло со старта
  //дело в том, что если делать через delay(), то система в это время простаивает, 
  //а нам постоянно необходимо чего-нить обрабатывать
  //поэтому просто считаем прошедшее время и сверяем его с интервалами
  
  //проверяем не прошел ли нужный интервал для обновления часов, если прошел то
  if(currentMillis - prvMlsTm > tmIntv) {
      prvMlsTm = currentMillis;
  }
 //     printTime();   //вызываем ф-цию вывода времени на экран если 
  //}
 // //проверяем не прошел ли нужный интервал для обновления температуры, если прошел то
//  if(currentMillis - prvMlsTemp > tempIntv) {
 //     prvMlsTemp = currentMillis;
   //   printTemp();  //
 // }
  //проверяем не прошел ли нужный интервал для включения/выключения освещения, если прошел то
  if(currentMillis - prvMlsLght > lghtIntv) {
      prvMlsLght = currentMillis;
      light();    //вызываем ф-цию проверки необходимости включения/выключения освещения
  }
}

 

Но у меня возникла проблемма . Там используеться другая библиотека <DS1307.h>  хоть и с такимже название. Как можно переделать скетч?

bwn
Offline
Зарегистрирован: 25.08.2014

Привести переменные двух библиотек в соответствие между собой.

Sim0012
Offline
Зарегистрирован: 26.02.2015

bwn пишет:

Привести переменные двух библиотек в соответствие между собой.

А можно наглядно?) то что то не пойму(((

bwn
Offline
Зарегистрирован: 25.08.2014

Sim0012 пишет:

bwn пишет:

Привести переменные двух библиотек в соответствие между собой.

А можно наглядно?) то что то не пойму(((

Нету у меня ваших библиотек. По коду - ключевая строка 35. Посмотрите, как получить значение "hr" с вашей библиотекой и измените эту строку. Больше вроде часы нигде не играют (кроме инициации).

Sim0012
Offline
Зарегистрирован: 26.02.2015

bwn пишет:

Sim0012 пишет:

bwn пишет:

Привести переменные двух библиотек в соответствие между собой.

А можно наглядно?) то что то не пойму(((

Нету у меня ваших библиотек. По коду - ключевая строка 35. Посмотрите, как получить значение "hr" с вашей библиотекой и измените эту строку. Больше вроде часы нигде не играют (кроме инициации).

Спасибо)) Буду пытаться)

Sim0012
Offline
Зарегистрирован: 26.02.2015

где подвох?

#include <Wire.h>                    //необходимо для работы с часами
#include <OneWire.h>            // подключаем библиотеку для работы с 1-Wire
#include <DS1307.h>             // подключаем библиотеку для работы с часами DS1307

DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием
Time hr; // Инициализация структуры


int ledPin = 7;   // управление светодиодами, присоединён к pin 7
long tmIntv = 1000;    //интервал для обновления времени на экране каждую секунду
long tempIntv = 30000;    //интервал для обновления температуры, хватит и пол минуты
long prvMlsTm = 0;    //предыдущее показание миллисекунд для обновления показания часов
long prvMlsTemp = 0;   //предыдущее показание миллисекунд для обновления показания температуы
long prvMlsLght = 0;    //предыдущее показание миллисекунд для проверки временного интервала
long lghtIntv = 5000;    //интервал для проверки включения/выключения освещения аквариума,5сек 1 минута
int lghtStat = 0;   //если подсветка включена, то в 1
int upLghtTime = 8;      //включаем в 8 утра
int downLghtTime = 17;     //выключаем в 17 вевера
int isNight = 0;    //если включаем на ночь, т.е. начальное время больше конечного
int prevSec = 0;  //предыдущее показание секунд для перезапуска если остановились

//отрабатывает при включении Arduino
void setup(){
  
  pinMode(ledPin, OUTPUT); // режим порта устанавливаем на вывод (запись)

  if (upLghtTime > downLghtTime) {          //если ночное время
    isNight = 1;
  }
}



void light () {    //включаем/выключаем освещение аквариума
  int hr;
  int isLght = 0;
  
 // hr = RTC.get(DS1307_HR, true);    //получаем значение часов
 hr = rtc.getTime();

  if (isNight == 0) {  //если день
    
    if (hr >= upLghtTime && hr < downLghtTime) {   //проверяем интервал
      isLght = 1;     //если необходимо включить свет
    } else {
      isLght = 0;
    }
    
  } else {    //если ночь
     
    if(hr - upLghtTime >= 0) {    //если больше или равно верхнему значению, то необходимо включить свет
      isLght = 1;   //если необходимо включить свет
    } else {
      if(hr < downLghtTime) {     //если меньше нижнего значения, то необходимо включить свет
        isLght = 1;    //если необходимо включить свет
      } else {
        isLght = 0;
      }
    }
  }  //закончился цикл выбора: день или ночь?

  if((isLght == 1) && (lghtStat == 0)) {   //если свет еще не включен и выставлен флаг необходимости включить
       lghtStat = 1;
       digitalWrite(ledPin, HIGH);   //собственно, включаем подавая высокий уровень на вывод
   } else {
     if(isLght == 0 && lghtStat == 1) {
         lghtStat = 0;
        digitalWrite(ledPin, LOW);     //собственно, выключаем снимая высокий уровень на выводе
     }
   }
    
}


void loop()     //постоянно отрабатывает в цикле

{
 
  unsigned long currentMillis = millis();   //миллисекунд прошло со старта
  //дело в том, что если делать через delay(), то система в это время простаивает, 
  //а нам постоянно необходимо чего-нить обрабатывать
  //поэтому просто считаем прошедшее время и сверяем его с интервалами
  
  //проверяем не прошел ли нужный интервал для обновления часов, если прошел то
  if(currentMillis - prvMlsTm > tmIntv) {
      prvMlsTm = currentMillis;
  }
 //     printTime();   //вызываем ф-цию вывода времени на экран если 
  //}
 // //проверяем не прошел ли нужный интервал для обновления температуры, если прошел то
//  if(currentMillis - prvMlsTemp > tempIntv) {
 //     prvMlsTemp = currentMillis;
   //   printTemp();  //
 // }
  //проверяем не прошел ли нужный интервал для включения/выключения освещения, если прошел то
  if(currentMillis - prvMlsLght > lghtIntv) {
      prvMlsLght = currentMillis;
      light();    //вызываем ф-цию проверки необходимости включения/выключения освещения
  }
}

 

 

vremi_s_relle.ino: In function 'void light()':
vremi_s_relle.ino:39:5: error: cannot convert 'Time' to 'int' in assignment
Ошибка компиляции.
 
bwn
Offline
Зарегистрирован: 25.08.2014

Мне кажется вы сильно резко поступаете в 6 строке. Я пока стараюсь в дебри структур не лезть (без понимания, что там происходит). У меня библа для аппаратного I2C и данные получаю таким способом - Hour=(RTC.get(DS1307_HR,true));. Далее работаю с переменной "Hour". В стандартном примере как у вас данные берутся?

Sim0012
Offline
Зарегистрирован: 26.02.2015

bwn пишет:

Мне кажется вы сильно резко поступаете в 6 строке. Я пока стараюсь в дебри структур не лезть (без понимания, что там происходит). У меня библа для аппаратного I2C и данные получаю таким способом - Hour=(RTC.get(DS1307_HR,true));. Далее работаю с переменной "Hour". В стандартном примере как у вас данные берутся?

Я пока толком и сам не разобрался у меня есть 2 кода и я их пытаюсь совместить)

bwn
Offline
Зарегистрирован: 25.08.2014

Sim0012 пишет:

bwn пишет:

Мне кажется вы сильно резко поступаете в 6 строке. Я пока стараюсь в дебри структур не лезть (без понимания, что там происходит). У меня библа для аппаратного I2C и данные получаю таким способом - Hour=(RTC.get(DS1307_HR,true));. Далее работаю с переменной "Hour". В стандартном примере как у вас данные берутся?

Я пока толком и сам не разобрался у меня есть 2 кода и я их пытаюсь совместить)

Сбросьте стандартный рабочий пример из вашей библиотеки.

X-Dron
Offline
Зарегистрирован: 24.01.2015

Sim0012 пишет:

где подвох?

две пременные с одним именем, но с разным типом данных. Одна глобальная, вторая локальная. Пытаетесь в целочисленную переменную затолкать структуру. А потом работать все-равно отращаетесь как к целочисленной.

Sim0012
Offline
Зарегистрирован: 26.02.2015

По чему с 4 мя датчиками и релле все нормально работает, а с 3мя хрень какаято 

с 4мя


  if (Counter++ == 0) digitalWrite(2,(analogRead(1)>200));
  if (Counter >= 3) Counter=0;
   if (Counter++ == 0) digitalWrite(3,(analogRead(2)>200));
  if (Counter >= 3) Counter=0;
   if (Counter++ == 0) digitalWrite(4,(analogRead(3)>200));
  if (Counter >= 3) Counter=0;
   if (Counter++ == 0) digitalWrite(5,(analogRead(4)>200));
 if (Counter >= 3) Counter=0;

 

 

с 3мя 

  if (Counter++ == 0) digitalWrite(2,(analogRead(1)>200));
  if (Counter >= 3) Counter=0;
   if (Counter++ == 0) digitalWrite(3,(analogRead(2)>200));
  if (Counter >= 3) Counter=0;
   if (Counter++ == 0) digitalWrite(4,(analogRead(3)>200));
  if (Counter >= 3) Counter=0;
 

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

Для меня не понятно, что первый-то кусок кода делает
но во втором бы 3 заменил на 2 у сравнения счетчика

Sim0012
Offline
Зарегистрирован: 26.02.2015

Ребят подскжите еще пожалуйсто) что-то не получаеться... есть 3 датчика влажности они должны открывать клаппан и включать нассос. в этом коде вроде все работает 

void setup()
{
  pinMode( 5 , OUTPUT);
   pinMode( 4 , OUTPUT);
   pinMode( 3 , OUTPUT);
   pinMode( 2 , OUTPUT);
}

 
void loop()
{
 
 digitalWrite(5,(analogRead(2) > 200));
 digitalWrite(2,(analogRead(2) > 200));
 digitalWrite(4,(analogRead(1) > 200));
  digitalWrite(2,(analogRead(1) > 200));
digitalWrite(3,(analogRead(3) > 200));
  digitalWrite(2,(analogRead(3) > 200));
 

  
}

А вот если вставлять его во весь код то както некорректо... Как правильнее будет написать?

#include <DS1307.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
#include <dht11.h>
 
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
DS1307 rtc(A4, A5); // Инициализация библиотеки с указанием



Time t; // Инициализация струк

int d, Counter=0;
dht11 sensor;

void setup()
{
  display.begin();// Инициализация дисплея
  display.setContrast(55);
  display.setTextSize(1);
  rtc.halt(false); // Установка режимов 
 // rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  //rtc.setDOW(7);        // Установка дня недели
  //rtc.setTime(14, 25, 00);  // Установка времени 10:59:10 
  //rtc.setDate(01, 03, 2015);   // Установка даты 20 июля 2013
  pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT);
  pinMode( 4 , OUTPUT);
  pinMode( 5 , OUTPUT);
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  display.setTextSize(1); // Установка набора символов
  display.clearDisplay(); // Очистка экрана
  if(int(t.hour)<10)
  {
    display.setCursor(42,0);
    display.print("0");
    display.setCursor(48,0);
    display.print(t.hour);} // Вывод часов
  else{
    display.setCursor(42,0);
    display.print(t.hour);}
    display.setCursor(53,0);
    display.print(".");
    
    display.setCursor(68,0);
    display.print(".");
    
  if(int(t.min)<10){
    display.setCursor(57,0);
    display.print("0");
    display.setCursor(63,0);
    display.print(int(t.min)); // Вывод минут  
  }
  else{  
    display.setCursor(57,0);
    display.print(int(t.min));}
    
    display.setTextSize(1); // Установка набора символов
  if(int(t.sec)<10){
    display.setCursor(72, 0);
    display.print("0");
    display.setCursor(79, 0);
    display.print(int(t.sec));} // Вывод секунд 
  else{
    display.setCursor(72, 0); 
    display.print((t.sec));} // Вывод секунд
    

//  display.setCursor(13,17);
  //display.print(rtc.getDateStr()); // Вывод даты
  sensor.read(6);
  display.setTextSize(1); // Установка набора символов
  display.setCursor(7, 0);
  display.print(sensor.temperature);
  display.setCursor(0, 0);
  display.print("С");
    
   display.setCursor(27, 0);
  display.print(sensor.humidity);
  display.setCursor(21, 0);
  display.print("%");
  display.setCursor(15, 37);
  display.print("Влаж.%");
  display.setCursor(60, 37);
  display.print(analogRead(3));
  display.setCursor(15, 27);
  display.print("Влаж.%");
  display.setCursor(60, 27);
  display.print(analogRead(2));
  display.setCursor(15, 17);
  display.print("Влаж.%");
  display.setCursor(60, 17);
  display.print(analogRead(1));
  
 
 digitalWrite(5,(analogRead(2) > 200));
 digitalWrite(2,(analogRead(2) > 200));
 digitalWrite(4,(analogRead(1) > 200));
  digitalWrite(2,(analogRead(1) > 200));
digitalWrite(3,(analogRead(3) > 200));
  digitalWrite(2,(analogRead(3) > 200));
 

 
  display.display(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
}

 

orelserg69
Offline
Зарегистрирован: 25.02.2015

не в тему. А можно ардуино к ноту подключить?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

не в тему. Можно, многие уже подключили.....

orelserg69
Offline
Зарегистрирован: 25.02.2015

но как что я малость не понял сом порта нет на ноуте

bwn
Offline
Зарегистрирован: 25.08.2014

orelserg69 пишет:

но как что я малость не понял сом порта нет на ноуте

А к дуине у вас кабель для com порта прилагается?

orelserg69
Offline
Зарегистрирован: 25.02.2015

 Oбычный USB. В прграмме Arduino IDE есть дрова но бук их игнорирует.

bwn
Offline
Зарегистрирован: 25.08.2014

orelserg69 пишет:

 Oбычный USB. В прграмме Arduino IDE есть дрова но бук их игнорирует.

Здесь по форуму поищите, несколько тем было с такой же проблемой. Вроде у всех разрулилось.

Sim0012
Offline
Зарегистрирован: 26.02.2015

А если по теме?)

эд
Offline
Зарегистрирован: 02.05.2015

orelserg69 пишет:

 Oбычный USB. В прграмме Arduino IDE есть дрова но бук их игнорирует.

у меня была таже беда пока все усб порты не освободил дуина не подключалась.