Покритикуйте код

Green
Offline
Зарегистрирован: 01.10.2015

У каждого свои критерии. Кому то "концепция", кому то красота, кому то минимализм, кому то сроки, кому то подучиться...)
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

UB3AFB пишет:

Покритикуйте код

Вспомнилась "критика бегуна" из из известного фильма - «Как то он не концептуально пробежал ... да пошёл ты в жопу!»

в сапогах 100 метровку за 14 секунд, да по молодости враз )))

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

Kakmyc. По Вашим советам переделал код. Всё работает, не тормозит.

#include <stdint.h>
#include <Wire.h>
#include "SPI.h"
#include "SparkFunBME280.h"
#include <DS3231.h> 
#include <LiquidCrystal_I2C.h>

BME280 mySensor;
DS3231  rtc(SDA, SCL); 
LiquidCrystal_I2C lcd(0x27,16,2);
//Кнопка на 4 пине, подсветка на 10 пине

void setup() {
  pinMode(10,OUTPUT);
  pinMode(4,INPUT_PULLUP);
  Wire.begin();
  lcd.init();
  rtc.begin();
  lcd.backlight();
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3;
  mySensor.settings.tStandby = 5;
  mySensor.settings.filter = 0;
  mySensor.settings.tempOverSample = 1;
  mySensor.settings.pressOverSample = 1;
  mySensor.settings.humidOverSample = 1;
  mySensor.begin();
  lcd.setCursor(0,0);
  lcd.print("   MeteoChasy");
  lcd.setCursor(0,1);
  lcd.print("  Evgeniy v.03");
   // The following lines can be commented out to use the values already stored in the DS1307
 // rtc.setDOW(TUESDAY);        // Set Day-of-Week to SUNDAY
 // rtc.setTime(14,31, 0);     // Set the time to 12:00:00 (24hr format)
 // rtc.setDate(27, 03, 2018);   // Set the date to October 3th, 2010
  delay(5000);
  lcd.clear();
}

void loop() {  
  static byte regim=1; //переменная для режима яркости
  static boolean flag=0;  //флаг режима яикости
  byte pwm_regim[5]={255,190,120,70,10};
  if(digitalRead(4)==LOW&&flag==0) //опрос кнопки яркости
  {
    regim++;
    flag=1;
    
   if(regim>5)
  {
   regim=1;
  }
}

if(digitalRead(4)==HIGH&&flag==1)
{
  flag=0;
}
  analogWrite(10,pwm_regim[regim]);
  
  lcd.setCursor(0,0);  //опрос и вывод на экран показаний часов
  lcd.print(rtc.getTimeStr(FORMAT_SHORT ));
  lcd.setCursor(8,0);
  lcd.print(rtc.getDateStr(FORMAT_SHORT ));
  
  static long previousMillis = 0; //переменная хранения времени, чтобы избавиться от делей
  long interval = 1000; //переменная интервала опроса датчика
 unsigned long currentMillis = millis(); //переменная пршедшего времени
  if(currentMillis - previousMillis > interval) {   //проверка интервала
  previousMillis = currentMillis;
  lcd.setCursor(0,1); //опрос и вывод на экран показаний датчика
  float temp=mySensor.readTempC()-1.5; //поправка по температуре
  lcd.print(temp,1);
  lcd.print("'C");
  lcd.setCursor(7,1);
  lcd.print((uint8_t)mySensor.readFloatHumidity());
  lcd.print("%");
  lcd.setCursor(11,1);
  int mmH=mySensor.readFloatPressure()/133;
  lcd.print(mmH); 
  lcd.print("mm");
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

UB3AFB пишет:

Kakmyc. По Вашим советам переделал код. Всё работает, не тормозит.

РАСТЁШЬ

 

 

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

ua6em. 

Потихонечку.

SLKH
Offline
Зарегистрирован: 17.08.2015

UB3AFB пишет:

Kakmyc. По Вашим советам переделал код. Всё работает, не тормозит.

 
if(regim>5) {regim=1;}

byte pwm_regim[5]={255,190,120,70,10}; analogWrite(10,pwm_regim[regim]);

Точно всё работает?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

SLKH пишет:

UB3AFB пишет:

Kakmyc. По Вашим советам переделал код. Всё работает, не тормозит.

 
if(regim>5) {regim=1;}

byte pwm_regim[5]={255,190,120,70,10}; analogWrite(10,pwm_regim[regim]);

Точно всё работает?

это да, в массиве элементы с 0 начинаются

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Неправильно переделал.
Курим массивы.
Нумерация начинается с 0.
Значит и regim должен принимать значения 0...4

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

ua6em пишет:

100 метровку за 14 секунд

А вот граф как-то говорил, что он стометровку может только баксов за 300 и то по настроению.

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

SLKH, Kakmyc

Да, понял свою ошибку. Сперва не разобрался, вроде работает, а начал режим переключать - странности какие-то.

Сейчас работает как надо.

#include <stdint.h>
#include <Wire.h>
#include "SPI.h"
#include "SparkFunBME280.h"
#include <DS3231.h> 
#include <LiquidCrystal_I2C.h>

BME280 mySensor;
DS3231  rtc(SDA, SCL); 
LiquidCrystal_I2C lcd(0x27,16,2);
//Кнопка на 4 пине, подсветка на 10 пине

void setup() {
  pinMode(10,OUTPUT);
  analogWrite(10,200);
  pinMode(4,INPUT_PULLUP);
  Wire.begin();
  lcd.init();
  rtc.begin();
  lcd.backlight();
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3;
  mySensor.settings.tStandby = 5;
  mySensor.settings.filter = 0;
  mySensor.settings.tempOverSample = 1;
  mySensor.settings.pressOverSample = 1;
  mySensor.settings.humidOverSample = 1;
  mySensor.begin();
  lcd.setCursor(0,0);
  lcd.print("   MeteoChasy");
  lcd.setCursor(0,1);
  lcd.print("  Evgeniy v.03");
   // The following lines can be commented out to use the values already stored in the DS1307
 // rtc.setDOW(TUESDAY);        // Set Day-of-Week to SUNDAY
 // rtc.setTime(14,31, 0);     // Set the time to 12:00:00 (24hr format)
 // rtc.setDate(27, 03, 2018);   // Set the date to October 3th, 2010
  delay(5000);
  lcd.clear();
}

void loop() {  
  static byte regim=0; //переменная для режима яркости
  static boolean flag=0;  //флаг режима яикости
  byte pwm_regim[5]={255,190,120,70,20};
  if(digitalRead(4)==LOW&&flag==0) //опрос кнопки яркости
  {
    regim++;
    flag=1;
    
  if(regim>4)
  {
   regim=0;
  }
}

if(digitalRead(4)==HIGH&&flag==1)
{
  flag=0;
}
  analogWrite(10,pwm_regim[regim]);
  
  lcd.setCursor(0,0);  //опрос и вывод на экран показаний часов
  lcd.print(rtc.getTimeStr(FORMAT_SHORT ));
  lcd.setCursor(8,0);
  lcd.print(rtc.getDateStr(FORMAT_SHORT ));
  
  static long previousMillis = 0; //переменная хранения времени, чтобы избавиться от делей
  long interval = 1000; //переменная интервала опроса датчика
  unsigned long currentMillis = millis(); //переменная пршедшего времени
  if(currentMillis - previousMillis > interval) {   //проверка интервала
  previousMillis = currentMillis;
  lcd.setCursor(0,1); //опрос и вывод на экран показаний датчика
  float temp=mySensor.readTempC()-1.5; //поправка по температуре
  lcd.print(temp,1);
  lcd.print("'C");
  lcd.setCursor(7,1);
  lcd.print((uint8_t)mySensor.readFloatHumidity());
  lcd.print("%");
  lcd.setCursor(11,1);
  int mmH=mySensor.readFloatPressure()/133;
  lcd.print(mmH); 
  lcd.print("mm");
    }
}

И ещё вопрос. Почему в ИДЕ1.0.6 компилируется, загружается и работает, а в 1.8.1 компилируется, загружается но не работает. То есть данные на экран вывод какую-то хрень?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

UB3AFB пишет:

SLKH, Kakmyc

Да, понял свою ошибку. Сперва не разобрался, вроде работает, а начал режим переключать - странности какие-то.

Сейчас работает как надо.

#include <stdint.h>
#include <Wire.h>
#include "SPI.h"
#include "SparkFunBME280.h"
#include <DS3231.h> 
#include <LiquidCrystal_I2C.h>

BME280 mySensor;
DS3231  rtc(SDA, SCL); 
LiquidCrystal_I2C lcd(0x27,16,2);
//Кнопка на 4 пине, подсветка на 10 пине

void setup() {
  pinMode(10,OUTPUT);
  analogWrite(10,200);
  pinMode(4,INPUT_PULLUP);
  Wire.begin();
  lcd.init();
  rtc.begin();
  lcd.backlight();
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3;
  mySensor.settings.tStandby = 5;
  mySensor.settings.filter = 0;
  mySensor.settings.tempOverSample = 1;
  mySensor.settings.pressOverSample = 1;
  mySensor.settings.humidOverSample = 1;
  mySensor.begin();
  lcd.setCursor(0,0);
  lcd.print("   MeteoChasy");
  lcd.setCursor(0,1);
  lcd.print("  Evgeniy v.03");
   // The following lines can be commented out to use the values already stored in the DS1307
 // rtc.setDOW(TUESDAY);        // Set Day-of-Week to SUNDAY
 // rtc.setTime(14,31, 0);     // Set the time to 12:00:00 (24hr format)
 // rtc.setDate(27, 03, 2018);   // Set the date to October 3th, 2010
  delay(5000);
  lcd.clear();
}

void loop() {  
  static byte regim=0; //переменная для режима яркости
  static boolean flag=0;  //флаг режима яикости
  byte pwm_regim[5]={255,190,120,70,20};
  if(digitalRead(4)==LOW&&flag==0) //опрос кнопки яркости
  {
    regim++;
    flag=1;
    
  if(regim>4)
  {
   regim=0;
  }
}

if(digitalRead(4)==HIGH&&flag==1)
{
  flag=0;
}
  analogWrite(10,pwm_regim[regim]);
  
  lcd.setCursor(0,0);  //опрос и вывод на экран показаний часов
  lcd.print(rtc.getTimeStr(FORMAT_SHORT ));
  lcd.setCursor(8,0);
  lcd.print(rtc.getDateStr(FORMAT_SHORT ));
  
  static long previousMillis = 0; //переменная хранения времени, чтобы избавиться от делей
  long interval = 1000; //переменная интервала опроса датчика
  unsigned long currentMillis = millis(); //переменная пршедшего времени
  if(currentMillis - previousMillis > interval) {   //проверка интервала
  previousMillis = currentMillis;
  lcd.setCursor(0,1); //опрос и вывод на экран показаний датчика
  float temp=mySensor.readTempC()-1.5; //поправка по температуре
  lcd.print(temp,1);
  lcd.print("'C");
  lcd.setCursor(7,1);
  lcd.print((uint8_t)mySensor.readFloatHumidity());
  lcd.print("%");
  lcd.setCursor(11,1);
  int mmH=mySensor.readFloatPressure()/133;
  lcd.print(mmH); 
  lcd.print("mm");
    }
}

И ещё вопрос. Почему в ИДЕ1.0.6 компилируется, загружается и работает, а в 1.8.1 компилируется, загружается но не работает. То есть данные на экран вывод какую-то хрень?

проблема может быть в библиотеке дисплея, скорее всего, могу прислать другую, под которой в 1.8.9 у меня работает, НИК на яндексе

SLKH
Offline
Зарегистрирован: 17.08.2015

Kakmyc пишет:
Неправильно переделал. Курим массивы. Нумерация начинается с 0. Значит и regim должен принимать значения 0...4

или индекс ссылаться на "[regim-1]"

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

ua6em Буду благодарен. А не может это быть из-за библиотеки Wire. Изначально код компилировался ,  под 1.0.6. А когда попробовал под 1.8.1 посыпалась чушь, а не данные. И эта чушь на тех местах, где должны быть нормальные данные. 

RG22EM
Offline
Зарегистрирован: 27.08.2016

UB3AFB пишет:

ua6em Буду благодарен. А не может это быть из-за библиотеки Wire. Изначально код компилировался ,  под 1.0.6. А когда попробовал под 1.8.1 посыпалась чушь, а не данные. И эта чушь на тех местах, где должны быть нормальные данные. 

напиши, вложу ответным

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

куда написать?

RG22EM
Offline
Зарегистрирован: 27.08.2016

UB3AFB пишет:

куда написать?

НИК на яндексе

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы тут что, все радиогубители (судя по никам)?

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

sadman41

Есть маленько.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Вы тут что, все радиогубители (судя по никам)?

помнится как-то обмолвился, если форум нельзя переделать, его надо возглавить, стараемся  )))

ЗЫ а наших всё прибывает и прибывает

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ua6em пишет:

ЗЫ а наших всё прибывает и прибывает

Ваших тут - как минимум трое, которых я заметил ;)

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

А сколько маскируется :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС, ещё замечания по коду.
Показания часов не стоит выводить каждый цикл.
Точно так же и вызывать функцию задания ШИМ.
analogWrite(x,y); вызывай непосредственно сразу после смены режима.
И убери дребезг контактов.
Для этого достаточно в конце цикла вызываемого по нажатию кнопки , добавить delay(20); //30,40,50 по желанию

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

Kakmyc. Спасибо