помогите плиз с кодом

winziwul
Offline
Зарегистрирован: 05.03.2014

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

#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h> // подключаем библу для епром
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay(); 
  
  int smallNum = 123; // целое число от 0 до 255
  EEPROM.write(0, smallNum); // запись числа в ячейку 0
  int bigNum = 789; // число > 255 разбиваем на 2 байта (макс. 65536)
  byte hi = highByte(bigNum); // старший байт
  byte low = lowByte(bigNum); // младший байт
  EEPROM.write(1, hi);  // записываем в ячейку 1 старший байт
  EEPROM.write(2, low); // записываем в ячейку 2 младший байт
   
}


void loop() {
   
  display.setCursor(30,5);
  display.setTextSize(3);
  display.clearDisplay();
  display.setTextColor(WHITE);
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (15 / 1023.0);//(5.0 / 1023.0)15.00 для делителя
  
  display.println(voltage);
  display.setCursor(0,0);
  display.setTextSize(1);
  display.println("min");
  if (voltage <= 11.5) 
  display.println(voltage);// напряжение минимум
  display.setCursor(0,15);
  display.setTextSize(1);
  display.println("max");
  display.println(voltage);// напряжение максимум
  delay(500); // задержка 500 мс
  display.display();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

очень хорошо, что вам почти все понятно, потому как не могу того же сказать о себе :)

Пожалуйста, изложите четко. что именно вы хотите получить от скетча, что получаете и что не работает.

 

winziwul
Offline
Зарегистрирован: 05.03.2014

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

так вот всё сделал кроме того что бы оно сохранялось в памяти сравниволось и выводилось на экрана сейчас вот что

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

Ну, скетч то Вы не сами писали, где-то взяли, так ведь? И совсем не понимаете, что там написано. Или я не прав?

winziwul
Offline
Зарегистрирован: 05.03.2014

вы не правы я его сам писал

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

winzivul. Есть код и есть контент (я так называю) это то что делает , или должна делать программа. По идее это одно и тоже. Но практика показавает иначе. Вот человек суетится что-то пытается делать и в результате ничего. То есть контент работы человека ничего не делать. 

  Продолжаю. Вы делаете вольтметр. Контент у вас выводить показание на экран. Усложнили записываем текущие показания в память. Дальше найти максимум минимум от чего? Ясно что от текщего значения. Но начиная откуда. От создания вселеной, или прошивки программы . И наконец вы значений максимума и минимума и дальше что работа закончена , можно жечь Ардуину или все же надо значения максимума и минимума сбрасывать.

winziwul
Offline
Зарегистрирован: 05.03.2014

я знаю и минимум и максиму, в скейче я написал if (voltage <= 11.5) это для минимального а для максимального я не дописывал пока что нет смысла надо разобратся с епром как записать и читать для вывода и сравнения пока что минимум ну а максимум проблемой не будет, если я правельно понял алгоритм будет такой же только надо будет изменить адрес записи и чтения в епром

5N62V
Offline
Зарегистрирован: 25.02.2016

winziwul пишет:

вы не правы я его сам писал

По-моему Вы просто еще не все библиотеки подключили. 

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

Тогда в строке 14, вместо 123 поставьте 1023, а в 18-ой, вместо 789, поставьте ноль. Все нормальные люди так делают - изначально минимальное число ставится как можно бОльшим, а максимальное - как можно меньшим.

После 31 строки поставьте проверку такоего типа:

ЕСЛИ sensorValue больше текущего наибольшего, то "текущее наибольшее" = sensorValue;
ИНАЧЕ ЕСЛИ sensorValue меньше текущего наименьшего, то "текущее наименьшее" = sensorValue;

После этого текщие наименьшее и наибльшее преобразуйте в вольты (также, как в строке 32) и показывает где Вам надо.

winziwul
Offline
Зарегистрирован: 05.03.2014

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

b707
Offline
Зарегистрирован: 26.05.2017

winziwul пишет:

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

А вы пытались сделать минимум и максимум? А то в коде - никаких следов.

Делается это просто. Заводите две переменные - Vmin и Vmax. В момент старта программы  берете первое измеренное значение и сохраняете его и в Vmin и в Vmax. Это же логично - если у вас значение всего одно, они и максимальное и минимальное, верно?

А дальше не сложнее. После измерения каждого нового значения вы сравниваете его с Vmin. Если новое значение меньше -сохраняете это значение в переменной Vmin как новый минимум. И точно так же с Vmax, только знак сранения - "больше".

Надеюсь все понятно.

winziwul
Offline
Зарегистрирован: 05.03.2014

if (voltage <= 11.5) минимум строка 38, а максимум я же написал пока не делал надо что то одно сночало сделать

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

А причём тут вообще 11.5? Почему не 11.49?

Делайте как я Вам написал (или как написал b707 - практически тоже самое) и не пудрите себе и нам мозг.

winziwul
Offline
Зарегистрирован: 05.03.2014

спасибо попробую но это уже завтра

b707
Offline
Зарегистрирован: 26.05.2017

winziwul пишет:

я знаю и минимум и максиму, в скейче я написал if (voltage <= 11.5) это для минимального

Если вы про строку 38 в коде, то там написан бред, так как это условие абсолютно бесполезно. Любое компьютерное условие if-then состоит из двух частей - части if "если", где проверяется условие, и части then-"то" ,  где описано что надо сделать, если условие выполнено. У вас части "то" нет, условие вы проверяете, но ничего не делаете.

winziwul пишет:

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

вот что вам на данном этапе совсем не нужно - это разбираться с EEPROM. Для максимума и минимума EEPROM совсем не нужен. Решите задачу пока так, в локальных переменных.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Для начала надо глобаль объявить 3 переменные voltage,Max_voltage,Min_voltage. В сетапе определить  voltage и это значение присвоить Max_voltage,Min_voltage. зНу а дальше в лупе измерять текучку и приваивать если она больше большего и меньше меньшего. Вы так пытаетесь придумать код, что забываете зачем вам программа. Не путайте код и контент. Это совершенно разные вещи. Вот к примеру вы каждый день ходите на работу , к примеру делать мебель. В чем контент вашей жизни - бегать на работу или делать мебель. Бегать на работу это текучка. А делать мебель это контент. Вот так и в коде. Вы просто запутались в кодах текучки и не можете понять почему контент программы у вас неправильно работает.

winziwul
Offline
Зарегистрирован: 05.03.2014

если правельно понял то вот

#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h> // подключаем библу для епром
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.clearDisplay(); 
  int Max_voltage = 15;
  int Min_voltage = 11.5; 
  int smallNum = 1023; // целое число от 0 до 255
  EEPROM.write(0, smallNum); // запись числа в ячейку 0
  int bigNum = 0; // число > 255 разбиваем на 2 байта (макс. 65536)
  byte hi = highByte(bigNum); // старший байт
  byte low = lowByte(bigNum); // младший байт
  EEPROM.write(1, hi);  // записываем в ячейку 1 старший байт
  EEPROM.write(2, low); // записываем в ячейку 2 младший байт
   
}


void loop() {
   
  display.setCursor(30,5);
  display.setTextSize(3);
  display.clearDisplay();
  display.setTextColor(WHITE);
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (15 / 1023.0);//(5.0 / 1023.0)15.00 для делителя
  
  display.println(voltage);
  display.setCursor(0,0);
  display.setTextSize(1);
  display.println("min");
  if (voltage <= 11.5) 
  display.println(voltage);// напряжение минимум
  display.setCursor(0,15);
  display.setTextSize(1);
  display.println("max");
  if (voltage >= 13) 
  display.println(voltage);// напряжение максимум
  delay(500); // задержка 500 мс
  display.display();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

winziwul пишет:

если правельно понял то вот

НеправЕльно...

По-моему вы скетч перепутали и снова загрузили тот же код, что и в первом посте.

winziwul
Offline
Зарегистрирован: 05.03.2014

строка 13 14

winziwul
Offline
Зарегистрирован: 05.03.2014

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
float Max_voltage = 15;
float Min_voltage = 11.5;
float voltage;
//---------main()---------------------
void setup() {
  //
}

void loop() {
  int sensorValue = analogRead(A0);
  voltage = sensorValue * (15 / 1023.0);//(5.0 / 1023.0)15.00 для делителя
  if (voltage > Max_voltage)Max_voltage = voltage;
  if (voltage < Min_voltage)Min_voltage = voltage;
  // сохранить в EEROM voltage
  // вывести на экран все 3 значения 
}

Текучку выкинул из программы.

b707
Offline
Зарегистрирован: 26.05.2017

winziwul пишет:

строка 13 14

И что? Вы ввели две новые переменные, а дальше? Где все то, о чем вам писал Евгений и я? Где присваивание этой переменной текущего значения, где сравнени со старым мин и макс? Вы сделали одну десятую часть. Или Вы на каждый новый символ нам будете постить новый код?

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

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

b707
Offline
Зарегистрирован: 26.05.2017

winziwul пишет:

 мне проще написать для пика а вот теперь решил освоить ардуинку

Про "мне проще" - вранье. Мин и макс считается везде одинаково, это азы даже не программирования, а простой логики

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:
Текучку выкинул из программы.

зря ты это. Теперь он ничему не научится, и так же будет заливать всем, что просто ардуину не знает, а вообще спец по пикам... по бубнам тоже :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

b707 , вы думаете это все. Найдется еще место где он затупит.  Синтаксис языка конечно лучше знать. Но понимать программа должна сделать еще важнее. Но похоже для некоторых это лишнее.

winziwul
Offline
Зарегистрирован: 05.03.2014

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

b707
Offline
Зарегистрирован: 26.05.2017

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