Разное о выращивании табака на Алтае
Вы не вошли.
Как водится, слепил из не дорогих деталей и того что валялось под ногами в мастерской, довольно крутой девайс.
По сути, получился моторизованный кран с электроприводом для воды охлаждения/термостат жидкостный.
Запчасти:
1) Arduino UNO
2) Дисплей восьмиразрядный на MAX7219.
3) Градусник DS18b20.
4) Сервопривод от китайской игрушки.
5) Драйвер двигателя постоянного тока на L298N.
6) Сам кран + пневматический шланг.
Не в сети
Не в сети
Не в сети
Собрал аппарат, для перегонки фруктовой браги. Сейчас, залил воду для эксперимента. Девайс, стабильненько держит темперетуру исходящей воды охлаждения, в диапазоне 45..50 градусов. На воде, очень стабильно работает! Я даже удивился. Скорее всего, даже не придётся устраивать PID регулятор. В режиме термостата +-5 градусов, всё довольно хорошо работает.
Не в сети
Программа.
#include <max7219.h>
MAX7219 max7219;//DIN-12,CS-11,CLK-10
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 9//Разрешающая способность DS18B20 12/9bit
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer, outsideThermometer;
String temp;
char temp2[12];
//////////////MOTOR PORT///////
byte ena = 4;
byte in1 = 5;
byte in2 = 6;
void setup(void)
{
Serial.begin(9600);
pinMode( ena, OUTPUT );
pinMode( in1, OUTPUT );
pinMode( in2, OUTPUT );
max7219.Begin();
max7219.Clear();
sensors.begin();
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();
Serial.print("Device 1 Address: ");
printAddress(outsideThermometer);
Serial.println();
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer), DEC);
Serial.println();
}
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 11; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
if (tempC>=50) tone(3,100,500);//Подаём тональный сигнал на порт 3, если температура выше 50 градусов.
temp = tempC;
temp.toCharArray(temp2, temp.length());
}
// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
Serial.print("Resolution: ");
Serial.print(sensors.getResolution(deviceAddress));
Serial.println();
}
void loop(void)
{
sensors.requestTemperatures();
float tempC = sensors.getTempC(outsideThermometer);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
max7219.DisplayText("HHHH", 0);
tone(3,1000,500);
delay(1000);
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
temp = tempC;
temp.toCharArray(temp2, temp.length());
max7219.DisplayText(temp2, 0); //0=left justify 1=right justify
sensors.requestTemperatures();
float tempC1 = sensors.getTempC(insideThermometer);
if(tempC1 == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
max7219.DisplayText("HHHH", 1);
tone(3,1000,500);
delay(1000);
return;
}
Serial.print("Temp C: ");
Serial.print(tempC1);
if (tempC>=20) {
if (tempC>=50) {
tone(3,50,500);//Подаём тональный сигнал на порт 3, если температура выше 50 градусов.
analogWrite( ena, 155 );
// выставляем режим мотора - вращение по часовой
digitalWrite( in1, HIGH );
digitalWrite( in2, LOW );
delay(100); // пауза 3сек
digitalWrite( in1, LOW );
delay(2000);
}
if (tempC<=45) {
tone(3,50,500);//Подаём тональный сигнал на порт 3, если температура выше 50 градусов.
analogWrite( ena, 155 );
// выставляем режим мотора - вращение по часовой
digitalWrite( in2, HIGH );
digitalWrite( in1, LOW );
delay(100); // пауза 3сек
digitalWrite( in2, LOW );
delay(2000);
}
}
temp = tempC;
temp.toCharArray(temp2, temp.length());
max7219.DisplayText(temp2, 1);
}
Не в сети
По идее, нужно перенести эту технологию на узел отбора, вместо стоп/старт.
Не в сети
Не в сети
Не в сети
Не в сети
Приехал мне сегодня с китая сервопривод MG995. На нём буду сервокран делать.
Сразу переделал сервопривод в сервомотор. Убрал ограничительный штифт на шестерне и откусил вал резистора внутреннего(рассоединил резистор с шестернёй выходной). Теперь, сервомотор умеет крутить в обе стороны бесконечно и останавливаться.
Не в сети
Управление сервомотором.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
void setup() {
myservo.attach(5); // подключаем MG995 к 5-у порту esp8266, оранжевый провод сервопривода(коричневый масса, красный +5В).
pinMode(5, OUTPUT);// назначаем пятый порт выводом
}
void loop() {
myservo.write(0); //крутим в одну сторону
delay(3000);
myservo.write(180);//крутим в обратную сторону
delay(5000);
digitalWrite(5, LOW);//останавливаем вращение
delay(5000);
}
Не в сети
Пневмокран на 6мм мне обошёлся в 76 рублей. Сервопривод MG995, стоит порядка 280 рублей. Сам сервокран(без микрокомпьютера) уже влазит в 500 рублей. Посмотрим, что получится из этих узлов в реальной жизни.
Не в сети
Не в сети
Не в сети