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

stpavel
Offline
Зарегистрирован: 09.10.2018

Forthomo пишет:

stpavel пишет:

Схема расчитана на 6 рюмок. Выведены разъемы подключения на концевики, MP3 модуль, экран, светодиодную ленту , серво, насос .

Сбрось схему и скетч в личку если не жалко.forthomo@yandex.ru

Ответил в почту. 

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

stpavel пишет:

Ответил в почту. 

а можно и мне nikolajyashkin@ya.ru

stpavel
Offline
Зарегистрирован: 09.10.2018

Nikolaj666 пишет:
stpavel пишет:

Ответил в почту. 

а можно и мне nikolajyashkin@ya.ru

Схемы у меня нет. Я их не очень люблю рисовать ) На печатной плате есть все элементы, которые необходимы.

По поводу скетча, не вижу смысла пока плодить тут разнообразие. Тем более, что экран который я использую, очень специфичен. И переделывать придется достаточно много. Проще взять любой из последних скетчей , выложенных тут , и поменять  analogRead на digitalRead.

 

Lerik-Co
Offline
Зарегистрирован: 30.08.2019

Forthomo пишет:

Lerik-Co пишет:

Вот ссылки на комплектующие, может пригодится кому.

если не трудно подпиши что где, потом добавлю на Я диск.

https://ru.aliexpress.com/item/32969220231.html - Nano Mini USB с Загрузчиком совместимый Nano 3,0 контроллер CH340 USB драйвер 16 МГц Nano v3.0 ATMEGA328P
https://ru.aliexpress.com/item/32821121484.html - 1 шт. 1 канал 24 В релейный модуль щит с оптроном поддержка высокого и низкого уровня триггера модуль питания для arduino
https://ru.aliexpress.com/item/32902208606.html - WAVGAT DC6-12V R385 аквариум круглый водяной воздушный насос с постоянным током аквариумные воздушные насосы аксессуары
https://ru.aliexpress.com/item/32924594679.html - Kebidumei 2X18650 USB power Bank зарядное устройство чехол DIY коробка для телефона повербанк для iPhone Портативная зарядка Внешняя батарея
https://ru.aliexpress.com/item/32835898778.html - 2 шт. EC11 энкодер аудио цифровой потенциометр с выключателем ручки 20 мм EC11 переключатель
https://ru.aliexpress.com/item/32809175063.html - 2019 LiitoKala HG2 18650 3000 мАч заряжаемая электронная сигарета батарея высокой разрядки, 30A большой ток + DIY nicke
https://ru.aliexpress.com/item/33026447179.html - 2 дюйма 4ohm 3 Вт полный спектр мини Динамик для стерео звук Динамик коробка аксессуары «сделай сам»
https://ru.aliexpress.com/item/32956009458.html - WS2812B DC 5V Светодиодные ленты RGB 50 см 1 м 2 м 3 м 4 м 5 м 30/60/144 светодиодный s смарт Пиксельная адресация чёрно-белые печатные платы WS2812 IC 17Key бар
https://ru.aliexpress.com/item/32948823768.html - 1 шт. новые SG90 Servo мини микро 9g для дистанционно управляемых вертолетов самолетов пенный самолет автомобиль Лодка горячая Распродажа 2018
https://ru.aliexpress.com/item/32655318932.html - 1 шт. мини mp3-плеер модуль с упрощенным выходом динамик MP3-TF-16P для arduino DIY KIT
https://ru.aliexpress.com/item/1605337399.html - Оригинальный XL6009 DC-DC модуль усилителя Мощность Модуль питания Выход регулируется Супер LM2577 Повышающий Модуль
https://ru.aliexpress.com/item/4000036567119.html - 5 шт., инфракрасный линия трек датчик слежения TCRT5000 препятствие Avoidanc AVR ARM PIC DC 5V
https://ru.aliexpress.com/item/32968385247.html - Белого и синего цвета цвет 128X64 O светодиодный ЖК-дисплей светодиодный Дисплей модуль для Arduino 0,96 I2C IIC Серийный новый оригинальный с CaseI

Zeerz85
Offline
Зарегистрирован: 24.09.2019

добрый день, подскажите как можно подключить вот такой дисплей

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Как я понял у него есть два режима работы, spi и i2c, но как их переключить не понял, заранее спасибо (дисплей 0,96' oled ssd1306 12864 spi i2c 2,2-5,5v белый)

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Схема DFPlayer https://yadi.sk/i/kRdb5E8vFc5MzA

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Zeerz85 пишет:

Как я понял у него есть два режима работы, spi и i2c, но как их переключить не понял, заранее спасибо (дисплей 0,96' oled ssd1306 12864 spi i2c 2,2-5,5v белый)

Каждый производитель, выпускают свою печатные плату с различной компоновкой электронных компонентов и выведенным интерфейсом, так-как контроллер SSD1306 поддерживает сразу три протокола работы:

► 8-bit 6800/8080-series parallel interface
► 3 /4 wire Serial Peripheral Interface
► I2C

Для изменения протокола работы, предусмотрены три линии BS0, BC1 и BS2 с помощью которых, контроллер дисплея определяет по какому протоколу ему работать. В моем случаи, OLED дисплей разработан для работы по одному протоколу I2C, в других вариантов, возможно смена протокола работы с помощью нулевых резисторах или DIP переключателей.

Запроси схему у продавца.

Все есть в Инете.

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Zeerz85 пишет:

добрый день, подскажите как можно подключить вот такой дисплей


нужно перепаять нулевые резисторы на R1,R4,R8.
там же написано на плате

Zeerz85
Offline
Зарегистрирован: 24.09.2019

С R3 нужно убирать резистор?

 

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Zeerz85 пишет:

С R3 нужно убирать резистор?

 


да

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Zeerz85 пишет:

С R3 нужно убирать резистор?

 

да

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Спасибо чуть позже отпишусь получилось или нет

 

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Forthomo пишет:

Forthomo пишет:

RW3 пишет:

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

https://yadi.sk/d/iBAHJ_Fq8le9NQ

31 и 37 особенно колоритные, добавляю себе.

Добавил:

void Tost() { //Рандом - 1
     randomSeed(currentTime);
	 byte num=random(22); // 0...21
 Serial.println(num);
 //mp3_set_volume (20);// устанвливаем громкость 20 (если хотите установить
//   кнопки для регулировки громкости вручную, закоментируйте эту и следующую строчку)
   delay (100);
   lcd.clear();
    switch (num){
	//case 0...19
	case 20: //ЖЕЛАЮ ЧТОБЫ ВСЕ
		lcd.setCursor(0, 0);
		lcd.print(F("ЖЕЛАЮ ЧТОБЫ ВСЕ"));
		lcd.setCursor(5, 1);
		lcd.print(F("!!!!"));    
		mp3_play (31);  // Проигрываем "mp3/0031.mp3"
		delay(100);	 
	break;
	case 21: //ХЛОПНУТЬ ПО РЮМАШКЕ
 
		lcd.setCursor(0, 0);
		lcd.print(F("А НЕ ХЛОПНУТЬ ЛИ"));
		lcd.setCursor(1, 1);
		lcd.print(F("НАМ ПО РЮМАШКЕ?"));  
		mp3_play (31);  // Проигрываем "mp3/0031.mp3"		
		delay(3500);
		lcd.clear();
		lcd.setCursor(1, 0);
		lcd.print(F("ЗАМЕТЬТЕ, НЕ Я"));
		lcd.setCursor(1, 1);
		lcd.print(F("ЭТО ПРЕДЛОЖИЛ!"));  
	break;
	}
	delay(2000)
}

 

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

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

эта?

lcd.print(F("ЗАМЕТЬТЕ, НЕ Я"));

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Forthomo пишет:

эта?

lcd.print(F("ЗАМЕТЬТЕ, НЕ Я"));

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

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Вот так попробуй:

	case 21: //ХЛОПНУТЬ ПО РЮМАШКЕ
 		mp3_play (31);  // Проигрываем "mp3/0031.mp3"	
		lcd.setCursor(0, 0);
		lcd.print(F("А НЕ ХЛОПНУТЬ ЛИ"));
		lcd.setCursor(1, 1);
		lcd.print(F("НАМ ПО РЮМАШКЕ?"));  	
		delay(3500);
		lcd.clear();
		lcd.setCursor(0, 0);
		lcd.print(F(" ЗАМЕТЬТЕ, НЕ Я "));
		lcd.setCursor(0, 1);
		lcd.print(F(" ЭТО ПРЕДЛОЖИЛ! "));  
	break;

 

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Коллеги, подскажите. Есть скетч для замера напряжения на акуме через делитель и выводом на 7й и 6йпиксель светодиодной ленты компилятор выдает вот такую ошибку : expected ';' before '{' token (не хватает ; перед { ) на 41 строчку, однако если  закоментировать с 41 по44 строчку компиляция проходит без ошибок. Что не так?

#include "Adafruit_NeoPixel.h"
// Светодиоды
const int PIN_LED = 5;// Сюда подключаются светодиоды
const int LED_COUNT = 6; // 6 светодиодов 5+1
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800);


int pin_read = A7;// пин для считывания напряжения
float max_v = 4.25; // максимальный заряд аккумулятора
float min_v = 2.75; // минимальный заряд аккумулятора
 
void setup(){ 

  //pinMode(A7, INPUT); // добавить в void setup
  analogReference(INTERNAL); // установка опорного напряжения для аналоговых входов
  strip.begin();
  
}
  
void loop(){ 
  float Vbat = (analogRead(pin_read) * 1.1) / 1023;
  float del = 0.091; // R2/(R1+R2) 100k & 10k 
  float Vin = Vbat / del;
  int procents = ((Vin - min_v) / (max_v - min_v)) * 100;// уровень заряда в процентах
if(procents >= 0 && procents < 20) {// 20% заряда
  strip.setPixelColor(5, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный
  strip.setPixelColor(6, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный 
  }
  else if(procents >= 20 && procents < 40) {// 40% заряда
  strip.setPixelColor(5, strip.Color(255, 255, 0)); //CRGB::Yellow 0xFFFF00 желтый
  strip.setPixelColor(6, strip.Color(255, 165, 0)); //CRGB::Orange 0xFFA500 оранжевый
  }
  else if(procents >= 40 && procents < 60) {// 60% заряда
  strip.setPixelColor(5, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
  strip.setPixelColor(6, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
  }  
  else if(procents >= 60 && procents < 80) {// 80% заряда
  strip.setPixelColor(5, strip.Color(0, 255, 255)); //CRGB::Aqua 0x00FFFF голубой
  strip.setPixelColor(6, strip.Color(0, 0, 255)); //CRGB::Blue 0x0000FF синий
  } 
  else (procents >= 80 && procents <= 100) {// 100% заряда
  strip.setPixelColor(5, strip.Color(255, 0, 255)); //CRGB::Magenta 0xFF00FF фиолетовый
  strip.setPixelColor(6, strip.Color(128, 0, 128)); //CRGB::Purple 0x800080 фиолетовый
  } 
	strip.show();
}	

  

 

stpavel
Offline
Зарегистрирован: 09.10.2018

Forthomo пишет:

Коллеги, подскажите. Есть скетч для замера напряжения на акуме через делитель и выводом на 7й и 6йпиксель светодиодной ленты компилятор выдает вот такую ошибку : expected ';' before '{' token (не хватает ; перед { ) на 41 строчку, однако если  закоментировать с 41 по44 строчку компиляция проходит без ошибок. Что не так?

#include "Adafruit_NeoPixel.h"
// Светодиоды
const int PIN_LED = 5;// Сюда подключаются светодиоды
const int LED_COUNT = 6; // 6 светодиодов 5+1
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN_LED, NEO_GRB + NEO_KHZ800);


int pin_read = A7;// пин для считывания напряжения
float max_v = 4.25; // максимальный заряд аккумулятора
float min_v = 2.75; // минимальный заряд аккумулятора
 
void setup(){ 

  //pinMode(A7, INPUT); // добавить в void setup
  analogReference(INTERNAL); // установка опорного напряжения для аналоговых входов
  strip.begin();
  
}
  
void loop(){ 
  float Vbat = (analogRead(pin_read) * 1.1) / 1023;
  float del = 0.091; // R2/(R1+R2) 100k & 10k 
  float Vin = Vbat / del;
  int procents = ((Vin - min_v) / (max_v - min_v)) * 100;// уровень заряда в процентах
if(procents >= 0 && procents < 20) {// 20% заряда
  strip.setPixelColor(5, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный
  strip.setPixelColor(6, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный 
  }
  else if(procents >= 20 && procents < 40) {// 40% заряда
  strip.setPixelColor(5, strip.Color(255, 255, 0)); //CRGB::Yellow 0xFFFF00 желтый
  strip.setPixelColor(6, strip.Color(255, 165, 0)); //CRGB::Orange 0xFFA500 оранжевый
  }
  else if(procents >= 40 && procents < 60) {// 60% заряда
  strip.setPixelColor(5, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
  strip.setPixelColor(6, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
  }  
  else if(procents >= 60 && procents < 80) {// 80% заряда
  strip.setPixelColor(5, strip.Color(0, 255, 255)); //CRGB::Aqua 0x00FFFF голубой
  strip.setPixelColor(6, strip.Color(0, 0, 255)); //CRGB::Blue 0x0000FF синий
  } 
  else (procents >= 80 && procents <= 100) {// 100% заряда
  strip.setPixelColor(5, strip.Color(255, 0, 255)); //CRGB::Magenta 0xFF00FF фиолетовый
  strip.setPixelColor(6, strip.Color(128, 0, 128)); //CRGB::Purple 0x800080 фиолетовый
  } 
	strip.show();
}	

  

 

После else условие не указывается

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Так?

  else if (procents >= 80 && procents <= 100) // 100% заряда
  strip.setPixelColor(5, strip.Color(255, 0, 255)); //CRGB::Magenta 0xFF00FF фиолетовый
strip.setPixelColor(6, strip.Color(128, 0, 128)); //CRGB::Purple 0x800080 фиолетовый

	strip.show();

 

stpavel
Offline
Зарегистрирован: 09.10.2018

Forthomo пишет:

Так?

  else if (procents >= 80 && procents <= 100) // 100% заряда
  strip.setPixelColor(5, strip.Color(255, 0, 255)); //CRGB::Magenta 0xFF00FF фиолетовый
strip.setPixelColor(6, strip.Color(128, 0, 128)); //CRGB::Purple 0x800080 фиолетовый

	strip.show();

 

Вот  так :
 

if(procents < 20) {// 20% заряда
	  strip.setPixelColor(5, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный
	  strip.setPixelColor(6, strip.Color(255, 0, 0)); //CRGB::Red 0xFF0000 красный
	  }
 else if(procents < 40) {// 40% заряда
         strip.setPixelColor(5, strip.Color(255, 255, 0)); //CRGB::Yellow 0xFFFF00 желтый
        strip.setPixelColor(6, strip.Color(255, 165, 0)); //CRGB::Orange 0xFFA500 оранжевый
	  }
else if(procents < 60) {// 60% заряда
	  strip.setPixelColor(5, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
	  strip.setPixelColor(6, strip.Color(0, 255, 0)); //CRGB::Lime 0x00FF00 зеленый
	  } 
else if(procents < 80) {// 80% заряда
	  strip.setPixelColor(5, strip.Color(0, 255, 255)); //CRGB::Aqua 0x00FFFF голубой
	  strip.setPixelColor(6, strip.Color(0, 0, 255)); //CRGB::Blue 0x0000FF синий
	  }
else {// 100% заряда
	  strip.setPixelColor(5, strip.Color(255, 0, 255)); //CRGB::Magenta 0xFF00FF фиолетовый
	  strip.setPixelColor(6, strip.Color(128, 0, 128)); //CRGB::Purple 0x800080 фиолетовый
	  } 

 

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Спасибо! а обязательно заканчивать "if"   "else" или можно "else if" ?

stpavel
Offline
Зарегистрирован: 09.10.2018

Forthomo пишет:

Спасибо! а обязательно заканчивать "if"   "else" или можно "else if" ?

Не обязательно. Все зависит от того что мы хотим получить.
Если в вашем примере procent вдруг по какой то причине будет чуть больше 100 ни одно из условий не выполнится . А вероятность такой ситуации очень велика.  Можно было бы записать последним условием else if ( procent >= 80 ) , тогда это былобы аналогично else в данном примере. Мне конструкция с else больше нравиться.
 

lean_74
Offline
Зарегистрирован: 22.12.2015

 Forthomo могу тебе отправить "брата,", просто сломался корпус у основания, сам паяльник рабочий.

или пришли мне свой... почта мой_ник@mail. ru

stpavel
Offline
Зарегистрирован: 09.10.2018

yct9 пишет:

Если не трудно будет, выложите фото в собранном виде

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Подскажите может кто-то делал наливатор с дисплеем ssd1306 по протоколу spi

stpavel
Offline
Зарегистрирован: 09.10.2018

Zeerz85 пишет:
Подскажите может кто-то делал наливатор с дисплеем ssd1306 по протоколу spi

А смысл , если можно по i2c ? Меньше использованных пинов ардуино, которых и так дефицит ))
В гугле полно инфы по SPI дисплеям и ардуино , первое что попалось
https://voltiq.ru/oled-128x64px-spi-and-arduino/

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Все сделал не работает

Zeerz85
Offline
Зарегистрирован: 24.09.2019

По spi подключал все работает (тест) а i2c не хочет

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Нашел инфу вот эту только нечего не понял, может кто-нибудь поможет http://microsin.net/adminstuff/hardware/ssd1306-oled-controller/Pechat.html

stpavel
Offline
Зарегистрирован: 09.10.2018

Zeerz85 пишет:
Нашел инфу вот эту только нечего не понял, может кто-нибудь поможет http://microsin.net/adminstuff/hardware/ssd1306-oled-controller/Pechat.html

 

Ссылка раз

Cсылка два

Разжевано все до мелочей, даже есть примеры как текст выводить.

 

Zeerz85
Offline
Зарегистрирован: 24.09.2019

Я все понимаю, но это 4pin , a у меня 7pin

stpavel
Offline
Зарегистрирован: 09.10.2018

Zeerz85 пишет:
Я все понимаю, но это 4pin , a у меня 7pin

да, это я ошибся ,  по i2c скинул последние две ссылки.

Ну а предыдущая  ?  https://voltiq.ru/oled-128x64px-spi-and-arduino/
Здесь же все понятно.

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Zeerz85 пишет:
Я все понимаю, но это 4pin , a у меня 7pin

У тебя 4-SPI , это даже на дисплее написано.

Держи документ https://yadi.sk/i/useI_yjqeJkzEQ

 

Konservator
Offline
Зарегистрирован: 02.10.2019

подписка

Rolo1
Offline
Зарегистрирован: 13.09.2019

Модуль реле разве на 24v нужен для проекта? На 5v не подойдет что ли?

RW3
RW3 аватар
Offline
Зарегистрирован: 07.08.2019

Rolo1 пишет:

Модуль реле разве на 24v нужен для проекта? На 5v не подойдет что ли?

Подойдёт

Rolo1
Offline
Зарегистрирован: 13.09.2019

Благодарю.

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

lean_74 пишет:

 Forthomo могу тебе отправить "брата,", просто сломался корпус у основания, сам паяльник рабочий.

или пришли мне свой... почта мой_ник@mail. ru

Коллега спасибо за поддержку непродолжительного траура. Теперь буду использовать самодельную паяльную станцию, фото постом ниже, лет 5 пылилась.

aleks_raichel
Offline
Зарегистрирован: 27.08.2019

Всем добрый вечер! У меня такой глюк периодически появляется:

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

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Можно усилитель дополнительно поставить, но к другим выводам плеера подключить на схеме это есть. Такой глюк с зацикливанием не замечал. Возможно это связано с питанием.

flam (не проверено)

Мужики.Есть схема и скетч на похожий на ваш девайс,но с расходомером и вместо сервы шаговый двигатель и непонятным для меня индикатором из 7 сигментным индикатором.Не могли бы вы для меня и не только помочь  переделать скетч и схему под lcd дисплей и mp3 тосты[code]

int buttonPin = 12;     // номер входа, подключенный к кнопке
int Motor =  A4; // номер выхода мотора
const int ZeroButton = 9; //кнопка концевика
int buttonState = 0;         // переменная для хранения состояния кнопки
int ZeroState = 0; // значение концевика
int Stakan1Pin = 6; // датчики обнаружения стаканов
int Stakan2Pin = 4;
int Stakan3Pin = 3;
int Stakan1 = 0; // значения датчиков обнаружения стаканов
int Stakan2 = 0;
int Stakan3 = 0;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, A0, A2, A1, A3);
 
volatile      uint32_t varTime   = 0;
/*
   Функция resetNumber обнуляет текущее значение
   на счётчике
*/
void resetNumber()
{
  // Для сброса на мгновение ставим контакт
  // reset в HIGH и возвращаем обратно в LOW
  digitalWrite(RESET_PIN, HIGH);
  digitalWrite(RESET_PIN, LOW);
}//
/*
   Функция showNumber устанавливает показания индикаторов
   в заданное неотрицательное число `n` вне зависимости
   от предыдущего значения
*/
void showNumber(int n)
{
  // Первым делом обнуляем текущее значение
  resetNumber();
 
  // Далее быстро «прокликиваем» счётчик до нужного
  // значения
  while (n--) {
    digitalWrite(CLOCK_PIN, HIGH);
    digitalWrite(CLOCK_PIN, LOW);
  }
}//
//Функция разлива
void Razliv(float Doza1) {
  digitalWrite(Motor, HIGH);
  //delay(3000);
  Obem = 0;
  varTime = millis();
  while (Obem < Doza1)
  {
    varPulse = pulseIn(pinSensor, HIGH, 1000000);               // Считываем длительность импульса, но не дольше 0,2 сек
    //varPulse = pulseIn(pinSensor, HIGH, 200000);
    if (varPulse) {
      varResult = 0.125 * uint8_t(10000000 / (98 * 2 * varPulse)); // Если длительность импульса считана, то рассчитываем скорость потока воды: Q = 1000000/(15L) л/мин
      Obem = Obem + varResult;
    }
    else        {
      varResult = 0; // Если длительность импульса не считана, то считаем что скорость потока воды = 0 л/мин
    }
 
    if ((varTime + 10) < millis() || varTime > millis()) {
      varTime = millis();
      Serial.println((String) "CKOPOCTb = " + varResult + " L/MIN"); // Выводим скорость потока воды, показания которой будут меняться после каждого импульса
      Serial.println((String) "Ob'em = " + Obem + " mL");
    }
  }
  digitalWrite(Motor, LOW);
}
void setup() {                                                 //
  Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта
  pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход
  pinMode(buttonPin, INPUT);
  pinMode(Stakan1Pin, INPUT);
  pinMode(Stakan2Pin, INPUT);
  pinMode(Stakan3Pin, INPUT);
  pinMode(Motor, OUTPUT);
  digitalWrite(Motor, LOW);
  pinMode(RESET_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(POT_PIN, INPUT);
  pinMode(ZeroButton, INPUT);
  // set the speed at 60 rpm:
  myStepper.setSpeed(12);
  // Обнуляем счётчик при старте, чтобы он не оказался
  // в случайном состоянии
  resetNumber();
  Doza = 0;
}
//
void loop() {
  int rotation, nalivat1, okr;
  // Определяем ноль отсчета поворота руки
  ZeroState = digitalRead(ZeroButton);
  while (ZeroState == 0)
  {
    myStepper.step(0.003 * stepsPerRevolution);
    ZeroState = digitalRead(ZeroButton);    
  }
  digitalWrite(A0, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A3, LOW);
  //myStepper.stop;
  // считываем в rotation напряжение с потенциометра:
  // микроконтроллер выдаст число от 0 до 1023
  // пропорциональное углу поворота ручки
  rotation = analogRead(POT_PIN);
 
  // в nalivat1 записываем полученное ранее значение rotation
  // делённое на 10.3. Поскольку в переменных мы пожелали хранить
  // целые значения, дробная часть от деления будет отброшена.
  // В итоге мы получим целое число от 0 до 255
  nalivat1 = rotation / 10.3;
  okr = nalivat1 % 5; // Округляем значение до 5
  if (okr != 0) {
    nalivat1 = nalivat1 + 5 - okr;
  }
  if (nalivat1 == 100) {
    nalivat1 = 99;
  }
  if (Doza != nalivat1) { // Сравниваем новое значение полученное с потенциометра с предыдущим
    Doza = nalivat1; // Записываем новое значение
    showNumber(Doza); // Отображаем новое значение
  }
 
  // считываем значения с входа кнопки
  // varTime = millis();
  buttonState = digitalRead(buttonPin);
  if (buttonState == 1)
  { //delay(20);
    if ((varTime + 20) < millis() ) {
      varTime = millis();
      buttonState = digitalRead(buttonPin);
      if (buttonState == 1) // Выполнение основного кода программы при нажатой кнопки разлива
      {
        myStepper.step(-0.09 * stepsPerRevolution);
        Stakan1 = digitalRead(Stakan1Pin);
        if (Stakan1 == 1) {
          Razliv(Doza);
        }
        myStepper.step(-0.15 * stepsPerRevolution);
        Stakan2 = digitalRead(Stakan2Pin);
        if (Stakan2 == 1) {
          Razliv(Doza);
        }
        myStepper.step(-0.14 * stepsPerRevolution);
        Stakan3 = digitalRead(Stakan3Pin);
        if (Stakan3 == 1) {
          Razliv(Doza);
        }
      }
    }
  }
  //
 
}
[/code]
Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

flam, прочитайте тему целиком и попадете в папку или в две,  со схемой, рабочими скетчами и прочее... Заодно скетчи научитесь выкладывать чтобы другие прочитать могли, и без обид...

"с расходомером и вместо сервы шаговый двигатель" - это наверное будет несколько другой проект, если присоединяться энтузиасты.

flam (не проверено)

Тему вашу,схемы и скетчи последние просмотрел полностью.Спасибо вам что так токрыто делитесь этим.

flam (не проверено)
[code]
#include <Stepper.h>

const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution
// for your motor
const uint8_t  pinSensor = 2;                                  // Определяем № вывода Arduino, к которому подключён датчик расхода воды
uint32_t varPulse;                                       // Объявляем переменную для хранения длительности импульсов с датчика
float  varResult = 0;                               // Определяем переменную для хранения рассчитанной скорости потока воды
float Obem = 0.0;                                        // Объявляем переменную для хранения рассчитанной скорости потока воды
float Doza = 25.0;
#define CLOCK_PIN 7
#define RESET_PIN 5
#define POT_PIN  A5
int buttonPin = 12;     // номер входа, подключенный к кнопке
int Motor =  A4; // номер выхода мотора
const int ZeroButton = 9; //кнопка концевика
int buttonState = 0;         // переменная для хранения состояния кнопки
int ZeroState = 0; // значение концевика
int Stakan1Pin = 6; // датчики обнаружения стаканов
int Stakan2Pin = 4;
int Stakan3Pin = 3;
int Stakan1 = 0; // значения датчиков обнаружения стаканов
int Stakan2 = 0;
int Stakan3 = 0;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, A0, A2, A1, A3);

volatile      uint32_t varTime   = 0;
/*
   Функция resetNumber обнуляет текущее значение
   на счётчике
*/
void resetNumber()
{
  // Для сброса на мгновение ставим контакт
  // reset в HIGH и возвращаем обратно в LOW
  digitalWrite(RESET_PIN, HIGH);
  digitalWrite(RESET_PIN, LOW);
}//
/*
   Функция showNumber устанавливает показания индикаторов
   в заданное неотрицательное число `n` вне зависимости
   от предыдущего значения
*/
void showNumber(int n)
{
  // Первым делом обнуляем текущее значение
  resetNumber();

  // Далее быстро «прокликиваем» счётчик до нужного
  // значения
  while (n--) {
    digitalWrite(CLOCK_PIN, HIGH);
    digitalWrite(CLOCK_PIN, LOW);
  }
}//
//Функция разлива
void Razliv(float Doza1) {
  digitalWrite(Motor, HIGH);
  //delay(3000);
  Obem = 0;
  varTime = millis();
  while (Obem < Doza1)
  {
    varPulse = pulseIn(pinSensor, HIGH, 1000000);               // Считываем длительность импульса, но не дольше 0,2 сек
    //varPulse = pulseIn(pinSensor, HIGH, 200000);
    if (varPulse) {
      varResult = 0.125 * uint8_t(10000000 / (98 * 2 * varPulse)); // Если длительность импульса считана, то рассчитываем скорость потока воды: Q = 1000000/(15L) л/мин
      Obem = Obem + varResult;
    }
    else        {
      varResult = 0; // Если длительность импульса не считана, то считаем что скорость потока воды = 0 л/мин
    }

    if ((varTime + 10) < millis() || varTime > millis()) {
      varTime = millis();
      Serial.println((String) "CKOPOCTb = " + varResult + " L/MIN"); // Выводим скорость потока воды, показания которой будут меняться после каждого импульса
      Serial.println((String) "Ob'em = " + Obem + " mL");
    }
  }
  digitalWrite(Motor, LOW);
}
void setup() {                                                 //
  Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта
  pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход
  pinMode(buttonPin, INPUT);
  pinMode(Stakan1Pin, INPUT);
  pinMode(Stakan2Pin, INPUT);
  pinMode(Stakan3Pin, INPUT);
  pinMode(Motor, OUTPUT);
  digitalWrite(Motor, LOW);
  pinMode(RESET_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(POT_PIN, INPUT);
  pinMode(ZeroButton, INPUT);
  // set the speed at 60 rpm:
  myStepper.setSpeed(12);
  // Обнуляем счётчик при старте, чтобы он не оказался
  // в случайном состоянии
  resetNumber();
  Doza = 0;
}
//
void loop() {
  int rotation, nalivat1, okr;
  // Определяем ноль отсчета поворота руки
  ZeroState = digitalRead(ZeroButton);
  while (ZeroState == 0)
  {
    myStepper.step(0.003 * stepsPerRevolution);
    ZeroState = digitalRead(ZeroButton);    
  }
  digitalWrite(A0, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A3, LOW);
  //myStepper.stop;
  // считываем в rotation напряжение с потенциометра:
  // микроконтроллер выдаст число от 0 до 1023
  // пропорциональное углу поворота ручки
  rotation = analogRead(POT_PIN);

  // в nalivat1 записываем полученное ранее значение rotation
  // делённое на 10.3. Поскольку в переменных мы пожелали хранить
  // целые значения, дробная часть от деления будет отброшена.
  // В итоге мы получим целое число от 0 до 255
  nalivat1 = rotation / 10.3;
  okr = nalivat1 % 5; // Округляем значение до 5
  if (okr != 0) {
    nalivat1 = nalivat1 + 5 - okr;
  }
  if (nalivat1 == 100) {
    nalivat1 = 99;
  }
  if (Doza != nalivat1) { // Сравниваем новое значение полученное с потенциометра с предыдущим
    Doza = nalivat1; // Записываем новое значение
    showNumber(Doza); // Отображаем новое значение
  }

  // считываем значения с входа кнопки
  // varTime = millis();
  buttonState = digitalRead(buttonPin);
  if (buttonState == 1)
  { //delay(20);
    if ((varTime + 20) < millis() ) {
      varTime = millis();
      buttonState = digitalRead(buttonPin);
      if (buttonState == 1) // Выполнение основного кода программы при нажатой кнопки разлива
      {
        myStepper.step(-0.09 * stepsPerRevolution);
        Stakan1 = digitalRead(Stakan1Pin);
        if (Stakan1 == 1) {
          Razliv(Doza);
        }
        myStepper.step(-0.15 * stepsPerRevolution);
        Stakan2 = digitalRead(Stakan2Pin);
        if (Stakan2 == 1) {
          Razliv(Doza);
        }
        myStepper.step(-0.14 * stepsPerRevolution);
        Stakan3 = digitalRead(Stakan3Pin);
        if (Stakan3 == 1) {
          Razliv(Doza);
        }
      }
    }
  }
  //

}
[/code]

 

 

 

 

flam (не проверено)

научился скетчи выкладывать?

Forthomo
Forthomo аватар
Offline
Зарегистрирован: 10.04.2019

Уже хорошо, свернуть забыл. Нашел схему и скетчи?

flam (не проверено)

которые на Ядиске?Да