Аквариум и ds1302

romkat
Offline
Зарегистрирован: 13.04.2015
Форумчане, гляньте глазом, где я накососрезил , непонятно как вкл воздушный насос когда хочет, код уже замылился перед глазами, не вижу ошибку. Спасибо!



#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302, 8, 10, 9); //rst-dat-clk
#include <LiquidCrystal.h> //Подключаем библиотеку для работы с LCD
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты

#define dht11_pin 14 // определение номера порта dht11

byte read_dht11_dat() //далее функция считывания одного байта данных с датчика
{
  byte i = 0;
  byte result = 0;
  for (i = 0; i < 8; i++)
  {
    while (!digitalRead(dht11_pin)); // ожидание получения "1" с датчика
    delayMicroseconds(30);
    if (digitalRead(dht11_pin) != 0 ) // если значение осталось "1" через 30 мксек
      bitSet(result, 7 - i); // запись бита в результат
    while (digitalRead(dht11_pin)); // ожидание окончания "1"
  }
  return result;
}


int airpin = 13;
int ledpin = 11;
int t = 0;
int v = 0;
int light;

void setup() {
  //  Serial.begin(9600);
  lcd.begin(16, 2);
  time.begin();
  //  time.settime(-1, 53); //установит 55 минут, а секунды, часы и дату, оставит без изменений
  //time.settime(0, 22, 18); //установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений
  // time.settime(0,04,21,28,02,17,2);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
  lcd.clear();
  pinMode(dht11_pin, OUTPUT); //установка порта dht11_pin в режим выхода
  digitalWrite(dht11_pin, HIGH);  //установка на нем высокого уровня
  pinMode(airpin, OUTPUT);
  pinMode(ledpin, OUTPUT);
  light = 0;
}

void loop() {
  time.gettime();
  dht11();
  lcd.setCursor(0, 0);
  //lcd.print(time.Hours); lcd.print(':'); lcd.print(time.minutes); lcd.print(':'); lcd.print(time.seconds); lcd.print("  ");
  // lcd.print(time.gettime("H:i:s")); // выводим время
  lcd.print(time.gettime("H:i  "));  lcd.print(t); lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print(time.gettime("dM  ")); lcd.print(v); lcd.print("%");

  if (time.Hours >= 7 && time.Hours <= 22) { // c 07:00 до 22:00
    if (time.minutes >= 50 && time.minutes <= 59) {
      digitalWrite(airpin, HIGH);
      lcd.setCursor(15, 0);
      lcd.print("A");
    }
    else if (time.minutes >= 50 && time.minutes <= 59) {
      digitalWrite(airpin, LOW);
      lcd.setCursor(15, 0);
      lcd.print("  ");
    }
  }

  if (time.Hours >= 7 && time.Hours <= 22) {
    if (light == 0) {
    for (int i = 0; i <= 150; i++)
      {
        analogWrite(ledpin, i);
        delay(400);
      }
    }
    digitalWrite(ledpin, HIGH);
    lcd.setCursor(15, 1);
    lcd.print("L");
    light = 1;
  }



  else  {
    if (light == 1) {
      for (int i = 150; i >= 0; i--)
      {
        analogWrite(ledpin, i);
        delay(100);
      }
    }
    digitalWrite(ledpin, LOW);
    light == 0;
    lcd.setCursor(15, 1);
    lcd.print("  ");
  }

  delay(500); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
}

void dht11() {
  byte dht11_dat[5];
  byte dht11_in;
  byte i;// start condition
  digitalWrite(dht11_pin, LOW); // установка низкого уровня
  delay(18); // задержка 18 мс
  digitalWrite(dht11_pin, HIGH);  // установка высокого уровня
  delayMicroseconds(1);  // задержка 1 мкс
  pinMode(dht11_pin, INPUT);  //установка порта dht11_pin в режим входа

  delayMicroseconds(40);  // задержка 40 мкс
  if (digitalRead(dht11_pin))  // далее проверка получения сигналов готовности датчика
  {
    //    Serial.println("cond. 1 not met");
    delay(1000);
    return;
  }
  delayMicroseconds(80);
  if (!digitalRead(dht11_pin))
  {
    //    Serial.println("cond. 2 not met");
    return;
  }

  delayMicroseconds(80); // задержка 80 мкс

  for (i = 0; i < 5; i++)               // прием 5 байт данных
  {
    dht11_dat[i] = read_dht11_dat(); // с помощью функции read_dht11_dat
  }

  pinMode(dht11_pin, OUTPUT);  //установка порта dht11_pin в режим выхода
  digitalWrite(dht11_pin, HIGH);  // установка высокого уровня
  /*  byte dht11_check_sum = dht11_dat[0] + dht11_dat[2]; // проверка контрольной суммы
    if (dht11_dat[4] != dht11_check_sum)
    {

      //     Serial.println("DHT11 checksum error");
    }
    //    Serial.print("T"); // далее вывод показаний датчика
    //   Serial.println(int(dht11_dat[2]));
    //   Serial.print("V");
    //   Serial.println(int(dht11_dat[0]));
  */
  t = (int(dht11_dat[2]));
  v = (int(dht11_dat[0]));
}


 

arDubino
Offline
Зарегистрирован: 12.01.2017

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

if (time.minutes >= 50 && time.minutes <= 59) {
061       digitalWrite(airpin, HIGH);
062       lcd.setCursor(15, 0);
063       lcd.print("A");
064     }
065     else if (time.minutes >= 50 && time.minutes <= 59) {
066       digitalWrite(airpin, LOW);
067       lcd.setCursor(15, 0);
068       lcd.print("  ");
069

    }

 

 

arDubino
Offline
Зарегистрирован: 12.01.2017

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

т.е. если включено то выключить если выключено то включить РАЗОВО.

romkat
Offline
Зарегистрирован: 13.04.2015

Thx!!! большой, как чек сделать пока не знаю, вторая прога на микроконтроллере, типа флага по условию?

arDubino
Offline
Зарегистрирован: 12.01.2017

у тебя там уже слово лайт есть правда интегер. 0 1. сделай еще айр тоже 0 1 . по тому же принципу там же все у тебя есть.

 

romkat
Offline
Зарегистрирован: 13.04.2015

Ок, понял. спасибо большое человеческое!)

arDubino
Offline
Зарегистрирован: 12.01.2017

у тебя там еще косяки. работает это с 7 до 23-00 а не 22-00. и воздух качаешь только в этой время. ночью рыбки ты дышать не хотят?!!

и рассвет/закат надо было не так сделать. а включил его в 7-00 и выключил в 23-00 или 22-00. зачем колбасить подурности все время. 

и лсд колбасить каждую секунду не надо. разово сигнал подал и все.

т.е. воздух включаешь в 50мин каждый час и выключаешь в 00 мин. разово с подачей сигнала на лсд. 

romkat
Offline
Зарегистрирован: 13.04.2015

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

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302, 8, 10, 9); //rst-dat-clk
#include <LiquidCrystal.h> //Подключаем библиотеку для работы с LCD
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты

#define dht11_pin 14 // определение номера порта dht11

byte read_dht11_dat() //далее функция считывания одного байта данных с датчика
{
  byte i = 0;
  byte result = 0;
  for (i = 0; i < 8; i++)
  {
    while (!digitalRead(dht11_pin)); // ожидание получения "1" с датчика
    delayMicroseconds(30);
    if (digitalRead(dht11_pin) != 0 ) // если значение осталось "1" через 30 мксек
      bitSet(result, 7 - i); // запись бита в результат
    while (digitalRead(dht11_pin)); // ожидание окончания "1"
  }
  return result;
}


int airpin = 13;
int ledpin = 11;
int t = 0;
int v = 0;
int light;
int air;

void setup() {
  //  Serial.begin(9600);
  lcd.begin(16, 2);
  time.begin();
  //  time.settime(-1, 53); //установит 55 минут, а секунды, часы и дату, оставит без изменений
  //time.settime(0, 22, 18); //установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений
  // time.settime(0,04,21,28,02,17,2);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
  lcd.clear();
  pinMode(dht11_pin, OUTPUT); //установка порта dht11_pin в режим выхода
  digitalWrite(dht11_pin, HIGH);  //установка на нем высокого уровня
  pinMode(airpin, OUTPUT);
  pinMode(ledpin, OUTPUT);

  time.gettime();
  if (time.Hours >= 7 && time.Hours < 22) { // c 07:00 до 22:00
    digitalWrite(ledpin, HIGH);
    lcd.setCursor(15, 1);
    lcd.print("L");
    light = 1;
  }
  else {
    light = 0;
  }
  air = 0;
}

void loop() {
  time.gettime();

  if (time.Hours = 7 && time.minutes == 0) {
    rassvet();
  }

  if (time.Hours = 22 && time.minutes == 0) {
    zakat();
  }

  if (time.Hours >= 7 && time.Hours < 22 && light == 0) {
    digitalWrite(ledpin, HIGH);
    lcd.setCursor(15, 1);
    lcd.print("L");
    light = 1;
  }

  else if (time.Hours < 7 && time.Hours > 22 && light == 1) {
    digitalWrite(ledpin, LOW);
    lcd.setCursor(15, 1);
    lcd.print("  ");
    light = 0;
  }

  if (time.minutes > 49 && time.minutes <= 59 && light == 1 && air == 0) {
    digitalWrite(airpin, HIGH);
    lcd.setCursor(15, 0);
    lcd.print("A");
    air = 1;
  }

  else if (time.minutes < 49 && time.minutes > 59 && air == 1) {
    digitalWrite(airpin, LOW);
    lcd.setCursor(15, 0);
    lcd.print("  ");
    air = 0;
  }

  dht11();
  lcd.setCursor(0, 0);
  lcd.print(time.gettime("H:i  "));  lcd.print(t); lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print(time.gettime("dM  ")); lcd.print(v); lcd.print("%");

  delay(500);
}

void dht11() {
  byte dht11_dat[5];
  byte dht11_in;
  byte i;// start condition
  digitalWrite(dht11_pin, LOW); // установка низкого уровня
  delay(18); // задержка 18 мс
  digitalWrite(dht11_pin, HIGH);  // установка высокого уровня
  delayMicroseconds(1);  // задержка 1 мкс
  pinMode(dht11_pin, INPUT);  //установка порта dht11_pin в режим входа

  delayMicroseconds(40);  // задержка 40 мкс
  if (digitalRead(dht11_pin))  // далее проверка получения сигналов готовности датчика
  {
    //    Serial.println("cond. 1 not met");
    delay(1000);
    return;
  }
  delayMicroseconds(80);
  if (!digitalRead(dht11_pin))
  {
    //    Serial.println("cond. 2 not met");
    return;
  }

  delayMicroseconds(80); // задержка 80 мкс

  for (i = 0; i < 5; i++)               // прием 5 байт данных
  {
    dht11_dat[i] = read_dht11_dat(); // с помощью функции read_dht11_dat
  }

  pinMode(dht11_pin, OUTPUT);  //установка порта dht11_pin в режим выхода
  digitalWrite(dht11_pin, HIGH);  // установка высокого уровня
  /*  byte dht11_check_sum = dht11_dat[0] + dht11_dat[2]; // проверка контрольной суммы
    if (dht11_dat[4] != dht11_check_sum)
    {

      //     Serial.println("DHT11 checksum error");
    }
    //    Serial.print("T"); // далее вывод показаний датчика
    //   Serial.println(int(dht11_dat[2]));
    //   Serial.print("V");
    //   Serial.println(int(dht11_dat[0]));
  */
  t = (int(dht11_dat[2]));
  v = (int(dht11_dat[0]));
}

void rassvet() {
  for (int i = 0; i <= 200; i++)
  {
    analogWrite(ledpin, i);
    delay(400);
  }
  digitalWrite(ledpin, HIGH);
  lcd.setCursor(15, 1);
  lcd.print("L");
  light = 1;
}
void zakat() {
  for (int i = 200; i >= 0; i--)
  {
    analogWrite(ledpin, i);
    delay(400);
  }
  digitalWrite(ledpin, LOW);
  lcd.setCursor(15, 1);
  lcd.print("  ");
  light = 0;
}

 

romkat
Offline
Зарегистрирован: 13.04.2015

arDubino пишет:

и лсд колбасить каждую секунду не надо. разово сигнал подал и все.

т.е. воздух включаешь в 50мин каждый час и выключаешь в 00 мин. разово с подачей сигнала на лсд. 

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

arDubino
Offline
Зарегистрирован: 12.01.2017

romkat пишет:

arDubino пишет:

и лсд колбасить каждую секунду не надо. разово сигнал подал и все.

т.е. воздух включаешь в 50мин каждый час и выключаешь в 00 мин. разово с подачей сигнала на лсд. 

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

ну я хз.

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