ARDUINO Регулятор для частотного преобразователь.

Motorfactor

✩✩✩✩✩✩✩
27 Июн 2020
2
0
Добрый день. Прошу помощи в написании скетча.
Имеем ардуино уно и ультразвуковой датчик расстояния.
На выходе из ардуино надо получить напряжение от 0 до 5 вольт в зависимости от расстояния. Так же имеем 2 кнопки для задания нижнего и верхнего предела измерения расстояния. При выходе за эти пределы на выходе ардуино должно быть 0 вольт. Пределы должны также записываться в епром что при включении не калибровать, а сразу работать.
Кто сможет помочь? Оплату гарантирую.
Кое как я смог написать сам, но работает не стабильно, и не записует в епром.
 

Вложения

Изменено:

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,451
989
59
Марий-Эл
Переменные verh и niz у тебя тип Int
Ты из функции берёш тип long и присваиваешь им. Это так задумано или случайно получилось?
Для записи и чтения EEPROM при таких числах лучше использовать библиотеку EEPROMex
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,698
473
Для записи и чтения EEPROM при таких числах лучше использовать библиотеку EEPROMex
ИМХО можно и EEPROM.h, только @Motorfactor пытается двухбайтную переменную в один байт затолкать. Впрочем это, наверное, не его вина. Это всё ArduBlock. Херовая это штука, лажу генерит сплошь и рядом. :cry:

C++:
/********************************************************************************
[B]*                                                                           *[/B]
***   ArduBlock | Technologies
***   Site: http://ardublock.ru
***   Developer: Petrov Vitaliy Nikolaevich
***   Library: http://ardublock.ru/download/libraries.zip
***
***   Mail: [email protected]
***   Books: http://ardublock.ru/index.php?id=books
[B]*                                                                           *[/B]
*********************************************************************************/
#include <EEPROM.h>

int  niz;
int  verh;
long ultrason_11() {
   long duration, distance;
   digitalWrite(11,LOW);
   delayMicroseconds(2);
   digitalWrite(11, HIGH);
   delayMicroseconds(10);
   digitalWrite(11, LOW);
   duration = pulseIn(12, HIGH);
   distance = duration/58;
   return distance;
}

void setup()
{
  Serial.begin(9600);

   niz = 0;

   verh = 0;

  pinMode(11, OUTPUT);
  pinMode(12, INPUT);
  pinMode(A3,INPUT_PULLUP);
  pinMode(10, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A4,INPUT_PULLUP);
  pinMode(3, OUTPUT);
  //EEPROM.get(1, niz); Вот она,  ошибка.
  EEPROM.get(0, niz);  // Вот так будет правильно.
  EEPROM.get(2, verh); //

}


void loop()
{
    Serial.println(ultrason_11());
    delay(300);
    if ((!digitalRead(A3))) {
      niz = ultrason_11();
      tone(10,440,1000);
      digitalWrite(13,HIGH);
//      EEPROM.put(1, niz); // Соответственно
      EEPROM.put(0, niz);   // меняем.

    }
    if ((!digitalRead(A4))) {
      verh = ultrason_11();
      tone(10,800,500);
      digitalWrite(13,HIGH);
      EEPROM.put(2, verh); 

    }
    analogWrite(3,(map(ultrason_11(),niz,verh,0,255)));

}
 
Изменено:

Motorfactor

✩✩✩✩✩✩✩
27 Июн 2020
2
0
Переменные verh и niz у тебя тип Int
Ты из функции берёш тип long и присваиваешь им. Это так задумано или случайно получилось?
Для записи и чтения EEPROM при таких числах лучше использовать библиотеку EEPROMex
Опыта у меня не в этих делах, вот думал что с помощью ардублок получится написать рабочий скетч. В принципе он как то даже работал.
По этому даже не знаю что ответить на ваш вопрос.

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