Нужна помощь в оптимизации кода. Датчики + нагрузка по расписанию.

Товарищ Майор
Offline
Зарегистрирован: 22.05.2014
#include <TFT.h>  
#include <SPI.h>
#include <SHT1x.h>
#include <EEPROM2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include "RTClib.h"
#include "stdio.h"


int cycleTime = 1000;
char tempPrintout[6];
char humPrintout[8];
char tempCPrintout[6];
float h;
float t;
float tempC;

#define RELAY_PIN 3
#define cs   10
#define dc   9
#define rst  8
#define dataPin  7
#define clockPin 5

RTC_DS1307 rtc;
TFT TFTscreen = TFT(cs, dc, rst);
OneWire oneWire(A0);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;
SHT1x sht1x(dataPin, clockPin);

void setup() {

  i2c_setup();
  lcd_setup();
  dallas_setup();
  relay_setup();
  clock_setup();

}

void loop() {

  lcd_loop();
  sht1x_loop();
  dallas_loop();
  relay_loop();

}


void i2c_setup() {

#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif

}


void lcd_setup() {

  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text("T1: ", 15, 10);
  TFTscreen.text("H: ", 15, 30);
  TFTscreen.text("T2: ", 15, 50);
  TFTscreen.text("PH: ", 15, 70);
  TFTscreen.setTextSize(2);

}


void dallas_setup() {

  OneWire oneWire(A0);
  DeviceAddress tempDeviceAddress;
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);

}


void relay_setup() {

  boolean relayStatus6 = LOW;
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);

}


void clock_setup() {

  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__));
  //  }

}


void lcd_loop() {
char buff[9];
  buff[8] = '\0';
  DateTime now = rtc.now();
  sprintf(buff, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  
  String tempVal = String(t, 2);
  String humVal = String(h, 2);
  String tempCVal = String(tempC, 2);

  tempVal.toCharArray(tempPrintout, 6);
  humVal.toCharArray(humPrintout, 6);
  tempCVal.toCharArray(tempCPrintout, 6);

  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(tempPrintout, 100, 10);
  TFTscreen.text(humPrintout, 100, 30);
  TFTscreen.text(tempCPrintout, 100, 50);
  TFTscreen.text("N/A", 100, 70);
TFTscreen.text(buff, 40, 90);

  delay(cycleTime);

  TFTscreen.stroke(0, 0, 0);
  TFTscreen.text(tempPrintout, 100, 10);
  TFTscreen.text(humPrintout, 100, 30);
  TFTscreen.text(tempCPrintout, 100, 50);
  TFTscreen.text("N/A", 100, 70);
  TFTscreen.text(buff, 40, 90);

}


void sht1x_loop() {

  sensors.requestTemperatures();
  tempC = sensors.getTempC(tempDeviceAddress);
  t = sht1x.readTemperatureC();
  h = sht1x.readHumidity();

}


void dallas_loop() {

  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);

}


void clock_loop() {

  


}


void relay_loop() {
  DateTime now = rtc.n#include <TFT.h>  // Arduino LCD library
#include <SPI.h>
#include <SHT1x.h>
#include <EEPROM2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include "RTClib.h"//clock
#include "stdio.h"

//Day time
int dtime = 6;
int dMin = 0;
int dSec = 0;

//Night time

int nTime = 0;
int nMin = 1;
int nSec = 1;

int cycleTime = 1000;
char tempPrintout[6];
char humPrintout[8];
char tempCPrintout[6];
float h;
float t;
float tempC;

#define RELAY_PIN 3
#define cs   10
#define dc   9
#define rst  8
#define dataPin  7//zelenij
#define clockPin 5//belozelen

RTC_DS1307 rtc;
TFT TFTscreen = TFT(cs, dc, rst);
/*OneWire oneWire(A0);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;*/
SHT1x sht1x(dataPin, clockPin);

void setup() {

  i2c_setup();
  lcd_setup();
  dallas_setup();
  relay_setup();
  clock_setup();

}

void loop() {

  lcd_loop();
  sht1x_loop();
  /*dallas_loop();*/
  relay_loop();
  clock_loop();

}


void i2c_setup() {

#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif

}


void lcd_setup() {

  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text("T1: ", 15, 10);
  TFTscreen.text("H: ", 15, 30);
  TFTscreen.text("T2: ", 15, 50);
  TFTscreen.text("PH: ", 15, 70);
  TFTscreen.setTextSize(2);

}


void dallas_setup() {

  OneWire oneWire(A0);
  DeviceAddress tempDeviceAddress;
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);

}


void relay_setup() {

  boolean relayStatus6 = LOW;
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);

}


void clock_setup() {

  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__));
  //  }

}


void lcd_loop() {
char buff[9];
  buff[8] = '\0';
  DateTime now = rtc.now();
  sprintf(buff, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  
  String tempVal = String(t, 2);
  String humVal = String(h, 2);
  String tempCVal = String(tempC, 2);

  tempVal.toCharArray(tempPrintout, 6);
  humVal.toCharArray(humPrintout, 6);
  tempCVal.toCharArray(tempCPrintout, 6);

  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(tempPrintout, 100, 10);
  TFTscreen.text(humPrintout, 100, 30);
  TFTscreen.text(tempCPrintout, 100, 50);
  TFTscreen.text("N/A", 100, 70);
TFTscreen.text(buff, 40, 90);

  delay(cycleTime);

  TFTscreen.stroke(0, 0, 0);
  TFTscreen.text(tempPrintout, 100, 10);
  TFTscreen.text(humPrintout, 100, 30);
  TFTscreen.text(tempCPrintout, 100, 50);
  TFTscreen.text("N/A", 100, 70);
  TFTscreen.text(buff, 40, 90);

}


void sht1x_loop() {

  sensors.requestTemperatures();
  tempC = sensors.getTempC(tempDeviceAddress);
  t = sht1x.readTemperatureC();
  h = sht1x.readHumidity();

}


/*void dallas_loop() {

  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);

}
*/

void clock_loop() {

  


}


void relay_loop() {
  DateTime now = rtc.now();
 // DateTime dTime (now.hour() >= 4, now.minute() >= 1, now.second() >= 1);
  //DateTime nTime (now.hour() <= 3, now.minute() <= 1, now.second() <= 1);
  if (now.hour() >= 9/*dTime.hour()&&now.minute() >= dTime.hour()&&now.second() >= dTime.second()*/)
  {
    digitalWrite(RELAY_PIN, HIGH);
  }
  if (now.hour() <= 9 /*nTime.hour()&&now.minute() >= nTime.hour()&&now.second() >= nTime.second()*/)
  {
    digitalWrite(RELAY_PIN, LOW);
  }
}


ow();
 // DateTime dTime (now.hour() >= 4, now.minute() >= 1, now.second() >= 1);
  //DateTime nTime (now.hour() <= 3, now.minute() <= 1, now.second() <= 1);
  if (now.hour() >= 9/*dTime.hour()&&now.minute() >= dTime.hour()&&now.second() >= dTime.second()*/)
  {
    digitalWrite(RELAY_PIN, HIGH);
  }
  if (now.hour() <= 9 /*nTime.hour()&&now.minute() >= nTime.hour()&&now.second() >= nTime.second()*/)
  {
    digitalWrite(RELAY_PIN, LOW);
  }
}

 

Товарищ Майор
Offline
Зарегистрирован: 22.05.2014

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

#include <TFT.h>  // Arduino LCD library
#include <SPI.h>
#include <SHT1x.h>
#include <EEPROM2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include "RTClib.h"//clock
#include "stdio.h"

//Day time
int dtime = 6;
int dMin = 0;
int dSec = 0;

//Night time

int nTime = 0;
int nMin = 1;
int nSec = 1;

int cycleTime = 1000;
char tempPrintout[6];
char humPrintout[8];
char tempCPrintout[6];
float h;
float t;
float tempC;

#define RELAY_PIN 3
#define cs   10
#define dc   9
#define rst  8
#define dataPin  7//zelenij
#define clockPin 5//belozelen

RTC_DS1307 rtc;
TFT TFTscreen = TFT(cs, dc, rst);
OneWire oneWire(A0);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;
SHT1x sht1x(dataPin, clockPin);

void setup() {

  i2c_setup();
  lcd_setup();
  dallas_setup();
  relay_setup();
  clock_setup();

}

void loop() {

  lcd_loop();
  sht1x_loop();
  dallas_loop();
  relay_loop();
 // clock_loop();

}


void i2c_setup() {

#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif

}


void lcd_setup() {

  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text("T1: ", 15, 10);
  TFTscreen.text("H: ", 15, 30);
  TFTscreen.text("T2: ", 15, 50);
  TFTscreen.text("PH: ", 15, 70);
  TFTscreen.setTextSize(2);

}


void dallas_setup() {

  OneWire oneWire(A0);
  DeviceAddress tempDeviceAddress;
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);

}


void relay_setup() {

  boolean relayStatus6 = LOW;
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);

}


void clock_setup() {

  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__));
  //  }

}


void lcd_loop() {
char buff[9];
  buff[8] = '\0';
  DateTime now = rtc.now();
  sprintf(buff, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  
  String tempVal = String(t, 2);
  String humVal = String(h, 2);
  String tempCVal = String(tempC, 2);

  tempVal.toCharArray(tempPrintout, 6);
  humVal.toCharArray(humPrintout, 6);
  tempCVal.toCharArray(tempCPrintout, 6);

  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(tempPrintout, 100, 10);
  TFTscreen.text(humPrintout, 100, 30);
  TFTscreen.text(tempCPrintout, 100, 50);
  TFTscreen.text("N/A", 100, 70);
TFTscreen.text(buff, 40, 90);

  delay(cycleTime);

  TFTscreen.stroke(0, 0, 0);
  TFTscreen.text(tempPrintout, 100, 10);
  TFTscreen.text(humPrintout, 100, 30);
  TFTscreen.text(tempCPrintout, 100, 50);
  TFTscreen.text("N/A", 100, 70);
  TFTscreen.text(buff, 40, 90);

}


void sht1x_loop() {

  sensors.requestTemperatures();
  tempC = sensors.getTempC(tempDeviceAddress);
  t = sht1x.readTemperatureC();
  h = sht1x.readHumidity();

}


void dallas_loop() {

  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);

}



void relay_loop() {
  DateTime now = rtc.now();
 // DateTime dTime (now.hour() >= 4, now.minute() >= 1, now.second() >= 1);
  //DateTime nTime (now.hour() <= 3, now.minute() <= 1, now.second() <= 1);
  if (now.hour() >= 9/*dTime.hour()&&now.minute() >= dTime.hour()&&now.second() >= dTime.second()*/)
  {
    digitalWrite(RELAY_PIN, HIGH);
  }
  if (now.hour() <= 9 /*nTime.hour()&&now.minute() >= nTime.hour()&&now.second() >= nTime.second()*/)
  {
    digitalWrite(RELAY_PIN, LOW);
  }
}

 

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

Строки 178 и 182. Условия будут выполняться весь час. И весь этот час (начиная с 9.00 до 9.59.59 в это время now.hour() == 9) релюшка будет получать иголку, включение и сразу выключение. Напрашивается хотя бы else вместо строки 182, дабы исключить одновременно два действия на одном пине.
Остальное не смотрел.

Навскидку, при сравнениях времени с расписанием лучше сравнивать не часы, в "собранное" время, например,
 ( hour << 12 ) + ( minutes << 6 ) + seconds) это вписывается в uint16_t, тогда и сравнения будут более корректны. Хотя, наверное есть и более другие методы, позволяющие отслеживать переходы через 0.00.

 

Товарищ Майор
Offline
Зарегистрирован: 22.05.2014

kisoft пишет:

Строки 178 и 182. Условия будут выполняться весь час. И весь этот час (начиная с 9.00 до 9.59.59 в это время now.hour() == 9) релюшка будет получать иголку, включение и сразу выключение. Напрашивается хотя бы else вместо строки 182, дабы исключить одновременно два действия на одном пине.
Остальное не смотрел.

Навскидку, при сравнениях времени с расписанием лучше сравнивать не часы, в "собранное" время, например,
 ( hour << 12 ) + ( minutes << 6 ) + seconds) это вписывается в uint16_t, тогда и сравнения будут более корректны. Хотя, наверное есть и более другие методы, позволяющие отслеживать переходы через 0.00.

 

 

Спасибо за интересную мысль на счет собранного времени, действительно это несколько лаконичнее будет нежели сейчас. На счет "иголок", обращу внимание, так же спасибо!