управление от часов

vitek73
Offline
Зарегистрирован: 02.03.2014

День добрый, хочу зделать поливалку которая будет вкл и выключатца по задоному времени, ну к примеру на 15 мин в 10час и 18час,

но проблемка наданном этапе(поскольку ардуинку пока не особо знаю), привязатца к часам,  тоесть брать системные часы, которые зделаны на платке Tiny RTC ,   но когда я вставляю в цикл услоия  (now.minute(), DEC) при компиляции выводит ошибку,  ну и попутно по замыслу должна открывать фрамугу в теплице по достижении задоного времени, но с этим проблем не возникло, а вот со временем полный затык, не натолкнёте дельным советом на нужное решение? )))     ниже код с которым проводил эксперемент.

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
//часы 02012015_2240
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include "RTClib.h" //Подключаем библиотеку для использования модуля часов реального времени RTC 
#include "DHT.h"
//тест индикатора,работает на 2х строчном и 4х строчном
//при использовании 2х строчного,3я.4я,строка не пишутца
//GND — GND
// VCC — 5V
// SDA — A4
// SCL — A5
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2 //цыфровой вход
#define DHTTYPE DHT11   //не забываем тип датчика
 
DHT dht(DHTPIN, DHTTYPE);
 
RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC 
//задаем адрес LCD экрана 0x27, 16 символов, 4 строки
LiquidCrystal_I2C lcd(0x27,20,4); 
void setup () {
  lcd.init(); // Инициализируем экран
 
// Выводим сообщение //
//включаем подсветку
lcd.backlight(); //без подсветки,буквы плохо видно
//Устанавливаем позицию начиная с которой выводится текст. 
//Отступ в данном случае 3, строка 1 (отсчет от нуля).
lcd.setCursor(2,0); 
//выводим строку 1
lcd.print("TEST INDICATORA !");
//аналогично выводим вторую строку
lcd.setCursor(1,1);
lcd.print("S NOVIM GODOM");
lcd.setCursor(6,2);
lcd.print("vitek73");
lcd.setCursor(3,3);
lcd.print("test indikatora");
  
    Serial.begin(9600);
  Serial.println("DHTxx test!");
 
  dht.begin();    
    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
  //  RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, 
 //для того, чтобы загрузить в RTC дату и время на момент компиляции программы 
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки 
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! 
//    RTC.adjust(DateTime(__DATE__, __TIME__));  
//  RTC.adjust(DateTime(2015,1,2,22,53,30));
  }
}
 
void loop () {
    DateTime now = RTC.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
  //  Serial.print(" since midnight 6/7/1973 = ");
  //  Serial.print(now.unixtime());
 //   Serial.print("s = ");
  //  Serial.print(now.unixtime() / 86400L);
  //  Serial.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
 //   DateTime future (now.unixtime() + 7 * 86400L + 30);
    
  //  Serial.print(" now + 7d + 30s: ");
 //   Serial.print(future.year(), DEC);
////    Serial.print('/');
//    Serial.print(future.month(), DEC);
//    Serial.print('/');
//    Serial.print(future.day(), DEC);
//    Serial.print(' ');
//    Serial.print(future.hour(), DEC);
//    Serial.print(':');
//    Serial.print(future.minute(), DEC);
//    Serial.print(':');
//    Serial.print(future.second(), DEC);
//    Serial.println();
    
    Serial.println();
//{
 
  float h = dht.readHumidity(); 
  float t = dht.readTemperature();
 
  if (isnan(t) || isnan(h)) { 
    Serial.println("Failed to read from DHT"); 
  } 
  else { 
    Serial.print("Humidity: "); 
    Serial.print(h); 
    Serial.print(" %\t"); 
    Serial.print("Temperature: "); 
    Serial.print(t); 
    Serial.println(" *C"); 
  }     
   lcd.setCursor(0,0);
       lcd.print("                    ");
   lcd.setCursor(0,0);
lcd.print(now.year(), DEC);//год
   lcd.setCursor(4,0);
    lcd.print("/");
   lcd.setCursor(5,0);    
    lcd.print(now.month(), DEC);//месяц
   lcd.setCursor(6,0); 
    lcd.print("/");
   lcd.setCursor(7,0);    
    lcd.print(now.day(), DEC);//день
    Serial.print(' ');
        lcd.setCursor(0,1);  
    lcd.print("                    ");        
       lcd.setCursor(0,1);
    lcd.print(now.hour(), DEC);//час
   lcd.setCursor(2,1);
    lcd.print(":");
       lcd.setCursor(3,1);
    lcd.print(now.minute(), DEC);//минуты
 //  lcd.setCursor(6,1);
  //  lcd.print(':');
 //   lcd.print(now.second(), DEC);
 //   lcd.println();   
//lcd.print("qwertyuiopasdfgh");
//  lcd.setCursor(0,1);
//lcd.print("jklzxcvbnm");
    delay(30000);
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitek73 пишет:

День добрый, хочу зделать поливалку которая будет вкл и выключатца по задоному времени, ну к примеру на 15 мин в 10час и 18час,

Купите вот такую штуку - http://shop.feron.ru/tech_pod_galogen/rozetki-s-tajmerom/rozetka-s-tajmerom-nedelnaja-tm24/ и будет Вам счастье!

При желании подобную вещь можно и за сто рублей найти. Я в Леруа за 280 покупал.

vitek73
Offline
Зарегистрирован: 02.03.2014

гы, гы, я оценил ваш юмор ))

но это мне не подходит, надо городить 220в

но вопрос в следущем

при приравнивании значения к температуре нет проблем

t = dht.readTemperature();

но  когда я хочу также поступить со временем, ну к примеру с минутами, выдаёт ошибку

   minu =   (now.minute(), DEC);

пробовал так  minu =   (now.minute(); и так  minu =   (now.minute); пробовал и флоутом, тот же эфект

выдаёт типа эрора, как мне правильно написать команду?

чтоб значения времени к примеру минут поподали в  мою minu.

и эта штуковина(ваш розеточный програматор) не будет открывать форточку при достижении темперы в 27 градусов, так что как некрутите, придётца помоч виктору с ответом )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitek73 пишет:

 minu =   (now.minute(), DEC);

пробовал так  minu =   (now.minute(); и так  minu =   (now.minute); пробовал и флоутом, тот же эфект

выдаёт типа эрора, как мне правильно написать команду?

так что как некрутите, придётца помоч виктору с ответом )))

Ну, написать-то надо 

minu =   now.minute();

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

Возьимте Кернигана и Ритчи, читайте и пробуйте запускать приведённые там программы-примеры. Убеждайтесь, что Вы понимаете, как они работают.

А через месяц-другой возвращайтесь к своей задаче. Тогда Вы уже не будете "пробовать" выражения с разбалланстрованными скобками и, глядишь, что-нибудь получится.

Удачи!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, и ещё.

Заодно научитесь нормально ставить задачу. А то сначала Вы пишете , что хотите сделать поливалку "которая будет вкл и выключатца по задоному времени, ну к примеру на 15 мин в 10час и 18час,", а потом вдруг оказывается. что Вашей поливалке надо ещё и форточки открывать. Може она у Вас еще и за пивом бегать должна, просто Вы забыли написать?

vitek73
Offline
Зарегистрирован: 02.03.2014

Этот вариант я тоже пробовал, также безрезультатно,

придётца наверно смотреть уроки джереми,хотя тама вроде небыло  у него с будильником передачи,

 ну когда я всё выучю, тобиш научюсь програмировать, тогда и смысла заходить не будет, так что пока есть шанс натолкнуть виктора на правильную мысль, пока он не стал супер программистомм))). мож у меня библиотеки левые?, хотя время на жк дисплей выводитца, вобщем  я пока ищу лесенку чтоб залесть на первую ступеньку))

и попутно цель этого незамысловатого проекта, пару раз в сутки будет включатца полив в теплице, попутно отслеживатца температура внутри, и при достижении задоной температуры, будет открыватца (через электроцилинды ,форточки) жк индикатор тама не планируетца,ну вот как то так, хотел добавить чтоб ещё отслеживала влажност земли, типа если земля влажная, то полив отменить, но пришёл к выводу что пока это лишнее,  вооот ))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну,-ну. Удачи!

toc
Offline
Зарегистрирован: 09.02.2013

Виктор, что это за фигня: "выдаёт типа эрора".
Цитируйте ошибки дословно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

toc, гляньте на текст - у него там скобки разбаллансированы, вот и  "выдаёт типа эрора".

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

И  аргумент DEC без сериала...

vitek73
Offline
Зарегистрирован: 02.03.2014

ну хорошо,   моглиб сразу сказать что с количеством скобок перестарался, я взял для теста  из библиотеки дс1307,  всё заработало, видать я из рабочей зделал монстра, и как результат, оно отказалось жить, как говоритца осознал,понял, исправил, )) спасибо за наталкивания мысли )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitek73 пишет:

моглиб сразу сказать что с количеством скобок перестарался, 

Про скобки я сказал ещё в сообщении №3 (в 12:45), Видимо, Вы его не прочитали до конца.

vitek73
Offline
Зарегистрирован: 02.03.2014

Зацените  мое ваяние , ))

поскольку предписывалось включать 2 раза в сутки полив, и время полива варьироутца, зделаны так скажем 2 будильника, у каждого задоётца время вкл, и время выключения,

плюс задаётца температура,при которой будет открыватца форточка для вентиляции.

 

// vitek73 270815
// умная теплица ,вкл полив , и знает когда надо открыть проветривания
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
int windows = 12;//открытие окна
#include "DHT.h"
#define DHTPIN 4 //цыфровой вход
#define DHTTYPE DHT11   //не забываем тип датчика
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
  pinMode(windows, OUTPUT);// назначим как выход 
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
    delay(2000);
  dht.begin();    
}
 
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();  
  tmElements_t tm;
//    m = month;//месяц
//    d = day;//число
int tt1 = 27; // задаём значения нужнй температуры
//установка 1го будильника включение
 
int hh1on = 06;//часы 
int mm1on = 00;//минуты 
 
//установка 1го будильника отключение
int hh1off = 06;//часы 
int mm1off = 02;//минуты 
 
//Установка 2го будильника включение
int hh2on = 18;//часы
int mm2on = 00;//минуты 
 
//Установка 2го будильника отключение
int hh2off = 18;//часы
int mm2off = 02;//минуты 
 
int taim = 1000;//время паузы
int hh = (tm.Hour);
int mm = (tm.Minute);    
 
/ смотрим когда нам стоит открыть фрамугу
if (t > tt1)
{
  Serial.print("виндовс он  "); 
  digitalWrite(windows, HIGH);   // включает выход
  delay(taim);                  // ждет секунду
}
else
{
  Serial.print("виндовс офф  "); 
  digitalWrite(windows, LOW);   // выключаем выход
  delay(taim);                  // ждет секунду
}
 
// проверяем будильники
if (hh == hh1on)
if (mm == mm1on) 
{
  Serial.print("time 1-on "); 
  digitalWrite(ledPin, HIGH);   // включает выход
  delay(taim);                  // ждет секунду
if (hh == hh1off)
if (mm == mm1off) 
{
  Serial.print("time 1-off "); 
  digitalWrite(ledPin, LOW);    // выключает выход
  delay(taim);                  // ждет секунду
//опрос второго будильника
if (hh == hh2on)  //ждём пока сойдутца часы
if (mm == mm2on)  //ждём пока сойдутца минуты
{
  Serial.print("time 2-on ");  //типа радосное событие,сработал будильник 
  digitalWrite(ledPin, HIGH);   // включает выход
  delay(taim);                  // ждет секунду
if (hh == hh2off)
if (mm == mm2off) 
{
  Serial.print("time 2-off "); 
  digitalWrite(ledPin, LOW);    // выключает выход
  delay(taim);       // ждет секунду
  
  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();
    Serial.print("Humidity: "); 
    Serial.print(h); 
    Serial.print(" %\t"); 
    Serial.print("Temperature: "); 
    Serial.print(t); 
    Serial.println(" *C");     
  } 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);
  }
  delay(1000);
}
 
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitek73 пишет:

Зацените  мое ваяние , ))

И Вам того же!

uint8_t operator = (uint8_t newVoltage) {
	m_Voltage = newVoltage;
	analogWrite(m_pinVoltage, m_Voltage);
	#ifdef DEBUG
	printVoltage();
	#endif	// DEBUG
	return m_Voltage;
}

int8_t m_pinOut1, m_pinOut2, m_pinVoltage;
uint8_t m_Voltage;
StateConstant m_State, m_SubState, m_LastState;
void(*StateIsOn)(const uint8_t);

 

vitek73
Offline
Зарегистрирован: 02.03.2014

День вечерний всем ), появился вопрос, 

состряпал из кусочков регистратор на сд карту, на сд пишетца с буфера,

но когда я пытался записать туда значения с датчика ds18b20 при компиляции выдаёт ошибку,

хотя остальные данные часов, с dnt 11  воспринимаютца хорошо,

на экран с ds18b20 выводитца, а на карту неполучаетца записать. не натолкнёте ищёразок на правильные выводы? )   проблема с записью 96 строки на карту памяти , вот .


// ВОБЩЕМ по замыслу пишет на СД карту всю инфу, 
//время влажность температуру, напряжение, 
//с заданым интервалом (60сек)

//ds18b20 140915_1230_датчик температуры 2 и более
//http://arduino-project.net/podklyuchenie-ds18b20-arduino/
 // 28D9BF0704000074   длинный датчик 0x28, 0xD9, 0xBF, 0x07, 0x04, 0x00, 0x00, 0x74
 // 2845C3B805000054   жолтый         0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   
 // 2822AAB90500007F   красный        0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F
//28E946B9050000E3     0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3     на макетке

#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ONE_WIRE_BUS 9
 
OneWire oneWire(ONE_WIRE_BUS);
 
DallasTemperature sensors(&oneWire);
 
DeviceAddress Thermometer1 = { 
  0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3 };  // адрес датчика DS18B20 280054B604000092
DeviceAddress Thermometer2 = { 
  0x28, 0xD9, 0xBF, 0x07, 0x04, 0x00, 0x00, 0x74 }; //длинный датчик
 #include <DS1307RTC.h>// Библиотеки
#include <Time.h> // для работы
#include <Wire.h> // часов
#include <SPI.h>
#include <SD.h>
#include "DHT.h"
#define DHTPIN 2 //цыфровой вход
#define DHTTYPE DHT11   //не забываем тип датчика
const int chipSelect = 10;
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
 
  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);
 
  Serial.begin(9600);
//}
 {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) //{
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}
  
void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {
 //float tempss = tempC;
  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);
 
  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);

  int h = dht.readHumidity();
  int t = dht.readTemperature();    
  // make a string for assembling the data to log:
String dataString = "";
 tmElements_t tm;
   RTC.read(tm);// читаем данные с часов
  dataString+=(tmYearToCalendar(tm.Year));// читаем год и пишем в буфер
  dataString+= "/";
  dataString+= (tm.Month); // читаем месяц и пишем в буфер
  dataString+= "/";
  dataString+= (tm.Day); // читаем день и пишем в буфер
  dataString+= " ";
  dataString+= (tm.Hour);// читаем час и пишем в буфер
  dataString+= ":";
  dataString+= (tm.Minute);// читаем минуты и пишем в буфер
  dataString+= ": Hum- ";
  dataString+= (h);// читаем минуты и пишем в буфер
  dataString+= ": Temp- ";
  dataString+= (t);// читаем минуты и пишем в буфер  
  dataString+= " ";   
  //dataString+= (Thermometer2);// ВОТ ЭТА СТРОКА НЕ ХОЧЕТ КОМПИЛИРОВАТЦА
  //  Serial.println(tempC);
  //Serial.print (tempC); 
  printTemperature(Thermometer2);
  dataString+= " "; 
 
  // прочитать три датчика и присоединить к строке:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
dataString += String(sensor);
    if (analogPin < 2) {
//dataString += ",";
    }
 //   {
//dataString += "vitek";
//    }
  }

  // открыть файл. обратите внимание, что только один файл может быть открыт одновременно,
  // поэтому вы должны закрыть этот один перед открытием другого.
File dataFile = SD.open("data.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
dataFile.println(dataString);
dataFile.close();
  delay(60000);
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }  
 //}
}
  
  
  

 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

У вас отчень маленький дылей в 122 срочке . У вилечте иго .И запись пайдет.

Radjah
Offline
Зарегистрирован: 06.08.2014

vitalikost
Offline
Зарегистрирован: 28.11.2014

Чуствую зараз тапками закидают, ну если заменить 96 строку на dataString+=sensors.getTempC(Thermometer2); 

Может даже заработает ;-)