Двухканальный вольт-амперметр (Arduino)

nikitosik292
Offline
Зарегистрирован: 26.04.2022

Всем привет! Нужно сделать двухканальный вольт-амперметр , по схеме . Задание выглядит таким образом :

Используйте макетную плату Arduino для реализации двухканального цифрового вольтметра.Напряжение будет измеряться на аналоговых контактах A1 и A2. Выбор канала будет осуществляться с помощью кнопки S1. Клавиша S2 изменяет диапазон измеряемого напряжения. Диапазоны можно менять промежуточными значениями от 1,1В до 5В. Информация о выбранном диапазоне будет постоянно отображаться во второй строке дисплея.Измеряемые значения напряжения в Вольтах– (В) будут отображаться на дисплее с точностью до 2 знаков после запятой, которые будут подключены через Шина I2C! Кнопка S3 запускает режим, при котором на экране будут отображаться измеренные значения напряжения обоих каналов одновременно, кнопка S4 будет имитировать зацикливание программы, которая вызывается нажатием на нее. Под циклом мы подразумеваем состояние, в котором программа выполняется в бесконечном цикле, но в основном не делает того, что должна делать, например. while (1) {delay (100)} Это состояние обозначается клавишей S4. Следовательно, он не сбрасывает сторожевой счетчик во время цикла. Сторожевой таймер запускается в функции setup(). Во время нормального выполнения программы сторожевой счетчик регулярно сбрасывается. Через 8 секунд после нажатия кнопки S4 происходит сброс Arduino со сторожевого таймера! Клавиша S5 при нажатии запускает режим усреднения. В этом режиме напряжения будут отображаться как и раньше, но значение напряжения будет рассчитываться как среднее значение десяти измерений. Этот режим помогает подавить шум АЦП. Дисплей покажет единицу измерения следующим образом: V [avg]. Кнопки должны быть подключены с помощью программного резистора PULLUP и должны быть обработаны от джиттера (программное использование времени с использованием функции миллис (). Запрещено использовать функцию келай (). Загораются в зависимости от того, какой канал в данный момент активен. К контакту 11 будет подключен динамик, который будет издавать звуковой сигнал (около 1 кГц) при каждом нажатии каждой кнопки.Измеренные значения, а также выбранный диапазон будут отправляться по последовательной линии на ПК (в одном- секундные интервалы). Отправляемые данные будут иметь следующий вид: «C >> K1 =?, ??V; K2 =?, ??V; Range =?, ??V» Где C — время с момента включения Arduino (в секунд).

 

 

 

Застрял на том что не знаю как одной кнопкой менять значения. Если кто-то знает как это сделать буду очень благодарен

 

 

 

 

 

 

 

 

 

 

   

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

Задание тебе, а делать будет кто-то другой?

nikitosik292
Offline
Зарегистрирован: 26.04.2022

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

 

nik182
Offline
Зарегистрирован: 04.05.2015

Знаешь что такое флаг в программе? Меняешь его при нажатии кнопки. Проверка нажатия кнопки - одна часть программы. В другой части программы, где вывод значения, в зависимости от флага выводишь одно или другое значение в зависимости от значения флага, например с помощью оператора if . В третей части программы считываешь значения двух каналов и запоминаешь.

nikitosik292
Offline
Зарегистрирован: 26.04.2022
Что-то типо этого ?
 
if (digitalRead(button3) == 0){
      digitalWrite(led2,HIGH);
    digitalWrite(led1,HIGH);
         
  } 
  
  if (digitalRead(button3) == 1){
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    
DIVGENY
Offline
Зарегистрирован: 23.08.2016

nikitosik292 пишет:

Что-то типо этого ?
   
поздравляем, вы написали код программы для стробоскопа. 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

курсовая?

с кнопками я разобрался, дальше сам одолеешь?
 

// кнопки
int S1 = 5;   // кнопка S1
int S2 = 6;   // кнопка S2
int S3 = 7;   // кнопка S3
int S4 = 8;   // кнопка S4

const byte inputPins[2] = {A1, A2};
void printLcd(int adc) {
  //пишем функцию
}
byte readButtonS1() {
  //опрашиваем кнопку S1
}

byte readButtonS2() {
  //опрашиваем кнопку S2
}

byte readButtonS3() {
  //опрашиваем кнопку S3
}

byte readButtonS4() {
  //опрашиваем кнопку S4
}

// Дисплей
#include <Wire.h>
#include <LiquidCrystal_I2C.h>    // Подключение библиотеки дисплея по I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Указываем I2C адрес дисплея

// Режимы
bool mode_v = 0;
void modeV () {
  if (mode_v) {
    analogReference(DEFAULT);
    lcd.setCursor(2, 1);
    lcd.print("MODE = 5Volt");
  } else {
    analogReference(INTERNAL);
    lcd.setCursor(1, 1);
    lcd.print("MODE = 1.1Volt");
  }
}


// Сторожевой таймер
#include <GyverWDT.h>


void setup() {
  //  келай (); //Запрещено использовать функцию келай ()
  Serial.begin(115200);
  pinMode(S1, INPUT_PULLUP);
  pinMode(S2, INPUT_PULLUP);
  pinMode(S3, INPUT_PULLUP);
  pinMode(S4, INPUT_PULLUP);


  //  lcd.init();              // Инициализация дисплея
  lcd.begin();             // инициализация зависит от библиотеки
  lcd.backlight();         // Подключение подсветки
  lcd.setCursor(0, 0);     // Установка курсора в начало первой строки

  //установка режима измерения напряжения
  modeV();

  delay(10000); // если сторожевой таймер не поддерживается
  Watchdog.enable(RESET_MODE, WDT_PRESCALER_1024);   

}


void loop() {
  //  келай (); //Запрещено использовать функцию келай ()

  int stateButtonS1 = readButtonS1();             // читаем состояние кнопки S1 "0" или "1"
  printLcd(analogRead(inputPins[stateButtonS1])); // выводим значение АЦП на экран

}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Цитата "...Напряжение будет измеряться на аналоговых контактах A1 и A2. Выбор канала будет осуществляться с помощью кнопки S1..."

Это можно сделать так

const byte inputPins[2] = {A1, A2};
void printLcd(int adc){
  //пишем функцию
}
byte readButtonS1(){
  //опрашиваем кнопку S1
}
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
  stateButton = readButtonS1();//читаем состояние кнопки S1 "0" или "1"
  printLcd(analogRead(inputPins[stateButton]);//выводим значение АЦП на экран
  
}

 

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

Ребята, автор считает себя самым хитрожопым.

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

Есть лохи "помогать"? "Помогайте"!

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

ЕвгенийП пишет:

Ребята, автор считает себя самым хитрожопым.

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

Есть лохи "помогать"? "Помогайте"!

да вроде он заказчик и есть, видимо 130 гринов не потянет )))

Pyotr
Offline
Зарегистрирован: 12.03.2014

ЕвгенийП пишет:

Ребята, автор считает себя самым хитрожопым.

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

Есть лохи "помогать"? "Помогайте"!

Спасибо, что раскусили клиента. Я то подумал, что студент и правда решил начать чему-то учиться. Я сваливаю отсюдова))) Хотя... их студентам можно делать курсовые за деньги - пусть у них будут "дипломированные спецы"

Morroc
Offline
Зарегистрирован: 24.10.2016

А он это... эффективный манагер, им же тоже учиться как то надо ) у программеров выпросил задешево, студенту продал задорого, на эти 2% и живет )

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

Выпил, украл, тюрьма... Романтика.