Re: Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)
Сейчас перечитал свою тему, интересно то как! И давно как было! 
С уважением, Николай.
Моё оборудование : → Винокурня Николя
|
Форум самогонщиков, винокуров, виноделов, пивоваров, бондарей и очень хороших людей |
Alco Distillers → Электронное оборудование → Автоматика на Arduino для ректификации и дистилляции (схема-прошивки)
с 381 по 400 из 421
Сейчас перечитал свою тему, интересно то как! И давно как было! 
Модуль управления скоростью отбора (возможно в перспективе программно будет)
Программное управление ... чем? Интересно.
Да не нужно это. Это старт-стоп. Он плохой вариант!
Про библиотеку TVout. Перешел в эту тему.
Не пробовал, поковыряюсь, если время будет
На всякий случай... там конфликт возникает и обнаруживается на уровне компиляции. Т.е. железо для понимания проблемы не нужно. Если найдете время - будет интересно (хоть какая-то польза от телевизора
).
там конфликт возникает и обнаруживается на уровне компиляции.
Тогда там ошибка должна быть указана явно.
Сейчас проверил загрузку в ардуинку. Грузится без проблем.
Библиотеку качал отсюда https://github.com/amperka/TVout
Грузится без проблем.
Ну да. Попробуйте 1-Wire прицепить (любимый термометр), у меня не дает...
Arduino: 1.8.0 (Windows 8.1), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"
Изменены опции сборки, пересобираем все
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s: Assembler messages:
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s:742: Error: unknown opcode `delay2'
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s:797: Error: unknown opcode `delay1'
.............................................................................................................
.............................................................................................................
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s:983: Error: unknown opcode `delay2'
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s:985: Error: unknown opcode `o1bs'
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s:986: Error: unknown opcode `svprt'
C:\Users\adm\AppData\Local\Temp\cc6R4Tcz.s:988: Error: unknown opcode `o1bs'
lto-wrapper: C:\Users\adm\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.3-arduino2/bin/avr-gcc returned 1 exit status
c:/users/adm/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Pro or Pro Mini.
Добавил датчик, тоже нормально все.
// библиотека для работы с композитным видео выходом
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4 // Пин датчиков температуры
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#include <TVout.h>
// файлы изображений
#include "schematic.h"
#include "TVOlogo.h"
// создаём объект TV класса TVout
TVout TV;
int zOff = 150;
int xOff = 0;
int yOff = 0;
// размер сторон куба
int sideSize = 50;
int viewPlane = 64;
// угол куба
float angle = PI / 60;
// массив координат куба
float cube3D[8][3] = {
{xOff - sideSize, yOff + sideSize, zOff - sideSize},
{xOff + sideSize, yOff + sideSize, zOff - sideSize},
{xOff - sideSize, yOff - sideSize, zOff - sideSize},
{xOff + sideSize, yOff - sideSize, zOff - sideSize},
{xOff - sideSize, yOff + sideSize, zOff + sideSize},
{xOff + sideSize, yOff + sideSize, zOff + sideSize},
{xOff - sideSize, yOff - sideSize, zOff + sideSize},
{xOff + sideSize, yOff - sideSize, zOff + sideSize}
};
unsigned char cube2D[8][2];
void setup()
{
sensors.begin();
// инициализируем коммуникацию с телевизиром
// выбираем режим PAL / NTSC и разрешние экрана
TV.begin(PAL);
// выбираем шрифт 6x8
TV.selectFont(font6x8);
intro();
// выводим строку
TV.println("Hello!\r\nI am the TVout library for Arduino\n");
// ждём 3 секунды
TV.delay(3000);
// выводим строку
TV.println("I generate PAL or NTSC composite video signal\n");
// ждём 3 секунды
TV.delay(3000);
// выводим строку
TV.println("My schematic:");
// ждём 2 секунды
TV.delay(2000);
// очищаем экран
TV.clearScreen();
// выводим изображение
TV.bitmap(0,0,schematic);
// ждём 5 секунд
TV.delay(5000);
// очищаем экран
TV.clearScreen();
// выводим строку
TV.println("Lets see what\nI can do");
// ждём 2 секунды
TV.delay(2000);
// шрифты
// очищаем экран
TV.clearScreen();
// выводим строку в заданных координатах
TV.println("Multiple fonts:");
// выбираем шрифт «4×6»
TV.selectFont(font4x6);
// выводим строку
TV.println("4x6 font FONT");
// выбираем шрифт «6×8»
TV.selectFont(font6x8);
// выводим строку
TV.println("6x8 font FONT");
// выбираем шрифт «8×8»
TV.selectFont(font8x8);
// выводим строку
TV.println("8x8 font FONT");
// ждём 2 секунды
TV.delay(2000);
// Draw Basic Shapes
// очищаем экран
TV.clearScreen();
// выбираем шрифт «6×8»
TV.selectFont(font6x8);
// выводим строку
TV.print(9,44,"Draw Basic Shapes");
// ждём 2 секунды
TV.delay(2000);
// круги
// очищаем экран
TV.clearScreen();
// рисуем круг в центре экрана белым цветом
// с радиусом «TV.vres()/3» без закраски
TV.drawCircle(TV.hres() / 2, TV.vres() / 2, TV.vres() / 3, WHITE);
TV.delay(500);
// рисуем круг в центре экрана белым цветом
// с радиусом «TV.vres()/2» с инвертацией цвета
TV.drawCircle(TV.hres() / 2, TV.vres() / 2, TV.vres() / 2, WHITE, INVERT);
// ждём 2 секунды
TV.delay(2000);
// линии и квадраты
// очищаем экран
TV.clearScreen();
// рисуем квадрат с координатами (20,20)
TV.drawRect(20, 20, 80, 56, WHITE);
TV.delay(500);
TV.drawRect(10, 10, 100, 76, WHITE,INVERT);
TV.delay(500);
TV.drawLine(60, 20, 60, 76, INVERT);
TV.drawLine(20, 48, 100, 48, INVERT);
TV.delay(500);
TV.drawLine(10, 10, 110, 86, INVERT);
TV.drawLine(10, 86, 110, 10, INVERT);
TV.delay(2000);
TV.drawLine(10, 86, 110, 10, INVERT);
// очищаем экран
TV.clearScreen();
// инициализируем генератор псевдослучайных чисел
randomSeed(analogRead(A0));
}
void loop()
{
sensors.requestTemperatures(); // считываем температуру с датчиков
TV.begin(PAL);
// выбираем шрифт 6x8
TV.selectFont(font6x8);
intro();
// выводим строку
TV.println("Hello!\r\nI am the TVout library for Arduino\n");
// вращение куба в 3D
int rsteps = random(10, 60);
switch(random(6)) {
case 0:
for (int i = 0; i < rsteps; i++) {
zrotate(angle);
// рисуем куб
printcube();
}
break;
case 1:
for (int i = 0; i < rsteps; i++) {
zrotate(2 * PI - angle);
// рисуем куб
printcube();
}
break;
case 2:
for (int i = 0; i < rsteps; i++) {
xrotate(angle);
// рисуем куб
printcube();
}
break;
case 3:
for (int i = 0; i < rsteps; i++) {
xrotate(2*PI - angle);
// рисуем куб
printcube();
}
break;
case 4:
for (int i = 0; i < rsteps; i++) {
yrotate(angle);
// рисуем куб
printcube();
}
break;
case 5:
for (int i = 0; i < rsteps; i++) {
yrotate(2 * PI - angle);
// рисуем куб
printcube();
}
break;
}
}
// функция вывода логотипа на экран
void intro() {
int w, l, wb;
int index;
w = pgm_read_byte(TVOlogo);
l = pgm_read_byte(TVOlogo + 1);
if (w & 7) {
wb = w / 8 + 1;
} else {
wb = w / 8;
}
index = wb * (l - 1) + 2;
for (int i = 1; i < l; i++ ) {
TV.bitmap((TV.hres() - w) / 2, 0, TVOlogo, index, w, i);
index -= wb;
TV.delay(50);
}
for (int i = 0; i < (TV.vres() - l) / 2; i++) {
TV.bitmap((TV.hres() - w) / 2, i, TVOlogo);
TV.delay(50);
}
TV.delay(3000);
TV.clearScreen();
}
// функция отрисовки куба
void printcube() {
for (int i = 0; i < 8; i++) {
cube2D[i][0] = (unsigned char)((cube3D[i][0] * viewPlane / cube3D[i][2]) + (TV.hres() / 2));
cube2D[i][1] = (unsigned char)((cube3D[i][1] * viewPlane / cube3D[i][2]) + (TV.vres() / 2));
}
TV.delayFrame(1);
TV.clearScreen();
drawCube();
}
// функция вращения куба по оси X
void xrotate(float q) {
float ty, tz, temp;
for(int i = 0; i < 8; i++) {
ty = cube3D[i][1] - yOff;
tz = cube3D[i][2] - zOff;
temp = ty * cos(q) - tz * sin(q);
tz = ty * sin(q) + tz * cos(q);
ty = temp;
cube3D[i][1] = ty + yOff;
cube3D[i][2] = tz + zOff;
}
}
// функция вращения куба по оси Y
void yrotate(float q) {
float tx,tz,temp;
for(int i = 0; i < 8; i++) {
tx = cube3D[i][0] - xOff;
tz = cube3D[i][2] - zOff;
temp = tz * cos(q) - tx * sin(q);
tx = tz * sin(q) + tx * cos(q);
tz = temp;
cube3D[i][0] = tx + xOff;
cube3D[i][2] = tz + zOff;
}
}
// функция вращения куба по оси Z
void zrotate(float q) {
float tx, ty, temp;
for(int i = 0; i < 8; i++) {
tx = cube3D[i][0] - xOff;
ty = cube3D[i][1] - yOff;
temp = tx * cos(q) - ty * sin(q);
ty = tx * sin(q) + ty * cos(q);
tx = temp;
cube3D[i][0] = tx + xOff;
cube3D[i][1] = ty + yOff;
}
}
// рисуем куб
void drawCube() {
TV.drawLine(cube2D[0][0], cube2D[0][1], cube2D[1][0],cube2D[1][1], WHITE);
TV.drawLine(cube2D[0][0], cube2D[0][1], cube2D[2][0],cube2D[2][1], WHITE);
TV.drawLine(cube2D[0][0], cube2D[0][1], cube2D[4][0],cube2D[4][1], WHITE);
TV.drawLine(cube2D[1][0], cube2D[1][1], cube2D[5][0],cube2D[5][1], WHITE);
TV.drawLine(cube2D[1][0], cube2D[1][1], cube2D[3][0],cube2D[3][1], WHITE);
TV.drawLine(cube2D[2][0], cube2D[2][1], cube2D[6][0],cube2D[6][1], WHITE);
TV.drawLine(cube2D[2][0], cube2D[2][1], cube2D[3][0],cube2D[3][1], WHITE);
TV.drawLine(cube2D[4][0], cube2D[4][1], cube2D[6][0],cube2D[6][1], WHITE);
TV.drawLine(cube2D[4][0], cube2D[4][1], cube2D[5][0],cube2D[5][1], WHITE);
TV.drawLine(cube2D[7][0], cube2D[7][1], cube2D[6][0],cube2D[6][1], WHITE);
TV.drawLine(cube2D[7][0], cube2D[7][1], cube2D[3][0],cube2D[3][1], WHITE);
TV.drawLine(cube2D[7][0], cube2D[7][1], cube2D[5][0],cube2D[5][1], WHITE);
}Николя, проблемы начинаются при настройке датчиков и/или опросе датчиков. Если просто подключить эти библиотеки - и у меня все компилируется. Как только начинаю активные действия с датчиками - ошибка компиляции. Причем нестабильно...
Попробуйте просто показания датчика вывести на экран, если получится (на уровне компиляции) - это будет для меня неожиданностью (приятной).
void loop()
{
sensors.requestTemperatures(); // считываем температуру с датчиковTV.begin(PAL);
// выбираем шрифт 6x8
TV.selectFont(font6x8);
intro();
// выводим строку
TV.println("Hello!\r\nI am the TVout library for Arduino\n");
Вместо TV.println("Hello!\r\nI am the TVout library for Arduino\n");
Ставим TV.println(sensors.getTempCByIndex(0));
Телека у меня под рукой нет, на практике не проверю.
Ну и лишнее из примера вычистить. Оставить только необходимое.
Николя, спасибо за обсуждение. На этот раз ( в вашем присутствии) компиляция прошла - буду разбираться, в чем была проблема. Разберусь - сообщу. Делал реальную плату - температуру измеряет, картинки на ТВ показывает, звук работает. Как только пытаюсь объединить два скетча - ошибка компиляции... Нашел в каких-то дебрях пример, измеряет температуру на 3 датчиках - выводит на ТВ. Один в один скопировал, подключил - работает. Изменил какую-то ерунду - и ... ошибка компиляции! Плюнул... Теперь (не без вашей помощи) появилось желание разобраться...
Да не за что!
Телека у меня под рукой нет, на практике не проверю.
Разберусь - сообщу.
Ну вот, сообщаю. Работает машинка. Вполне можно измерять температуру и выводить на телевизор. Ардуино + 2 резистора + библиотека TVout.
Опрос четырех датчиков (установлено 3).![]()
Проблема была в отладочных serial.print - не терпит их библиотека - глючит.
Kusnezov Oleg, фия ты хакер
Выложи хоть пример как делать... ради интереса.
Иван, спасибо.
Схема подключения ТВ.![]()
Описание библиотеки.
https://yadi.sk/i/DycudKqY3XYdrw.
Тестировал на 4 датчиках, подключенных (каждый отдельно!) к А0, А1, А2, А3 (14,15,16,17), каждый подтянут резистором 4.7к.
Тестовый код
#include <OneWire.h>
#include <TVout.h>
#include <fontALL.h>
// определяем пины термодатчиков
#define TEMP_1 14
#define TEMP_2 15
#define TEMP_3 16
#define TEMP_4 17
#define POWER_MODE 0 // режим питания термодатчика, 0 - внешнее, 1 – паразитное
bool flagT1;
bool flagT2;
bool flagT3;
bool flagT4;
// буфер данных для каждого датчика
byte bufData_1[9];
byte bufData_2[9];
byte bufData_3[9];
byte bufData_4[9];
byte addr[9];
bool sensor_1;
bool sensor_2;
bool sensor_3;
bool sensor_4;
// измеренная температура
float temperature_1 = -99.0;
float temperature_2 = -99.0;
float temperature_3 = -99.0;
float temperature_4 = -99.0;
unsigned int long timerTemp;
int const TEMP_PAUSE = 3000;
OneWire temp_1(TEMP_1);
OneWire temp_2(TEMP_2);
OneWire temp_3(TEMP_3);
OneWire temp_4(TEMP_4);
TVout TV;
void setup()
{
// Serial.begin(9600);
TV.begin(PAL,120,96);
// иницилизируем измерение температуры, через время TEMP_PAUSE можно запрашивать результат
temp_1.reset(); // сброс шины
temp_1.write(0xCC, POWER_MODE); // пропуск ROM
temp_1.write(0x44, POWER_MODE); // инициализация измерения
temp_2.reset(); // сброс шины
temp_2.write(0xCC, POWER_MODE); // пропуск ROM
temp_2.write(0x44, POWER_MODE); // инициализация измерения
temp_3.reset(); // сброс шины
temp_3.write(0xCC, POWER_MODE); // пропуск ROM
temp_3.write(0x44, POWER_MODE); // инициализация измерения
temp_4.reset(); // сброс шины
temp_4.write(0xCC, POWER_MODE); // пропуск ROM
temp_4.write(0x44, POWER_MODE); // инициализация измерения
// запускаем таймер
timerTemp = millis();
TV.clear_screen();
TV.select_font(font4x6);
TV.draw_rect(1,70,20,24,1,0);
TV.draw_rect(1,85,20,9,1,1);
TV.draw_rect(10,8,2,62,1,0);
TV.set_cursor(30,5);
TV.print("30 5");
TV.delay(200);
}
//=====================================================================================
void loop()
{
temp();
}
//-------------------------------------------------------------------------------------
void temp() {
// если прошло время достаточное для обновления датчика
// считываем температуру и запускаем новое преобразование
if ( (millis() - timerTemp) > TEMP_PAUSE){
TV.clear_screen();
temp_1.reset(); // сброс шины
sensor_1 = temp_1.search(addr);
if (sensor_1) {
temp_1.reset_search();
temp_1.reset();
temp_1.write(0xCC, POWER_MODE); // пропуск ROM
temp_1.write(0xBE, POWER_MODE); // команда чтения памяти датчика
temp_1.read_bytes(bufData_1, 9); // чтение памяти датчика, 9 байтов
if ( OneWire::crc8(bufData_1, 8) == bufData_1[8] ) { // проверка CRC
// данные правильные
flagT1 = true;
temperature_1 = (float)((int)bufData_1[0] | (((int)bufData_1[1]) << 8)) * 0.0625 + 0.03125 ;
}
else {
flagT1 = false;
temperature_1 = -99;
}
}
temp_2.reset(); // сброс шины
sensor_2 = temp_2.search(addr);
if (sensor_2) {
temp_2.reset_search();
temp_2.reset();
temp_2.write(0xCC, POWER_MODE); // пропуск ROM
temp_2.write(0xBE, POWER_MODE); // команда чтения памяти датчика
temp_2.read_bytes(bufData_2, 9); // чтение памяти датчика, 9 байтов
if ( OneWire::crc8(bufData_2, 8) == bufData_2[8] ) { // проверка CRC
// данные правильные
flagT2 = true;
temperature_2 = (float)((int)bufData_2[0] | (((int)bufData_2[1]) << 8)) * 0.0625 + 0.03125 ;
}
else {
flagT2 = false;
temperature_2 = -99;
}
}
temp_3.reset(); // сброс шины
sensor_3 = temp_2.search(addr);
if (sensor_3) {
temp_3.reset_search();
temp_3.reset();
temp_3.write(0xCC, POWER_MODE); // пропуск ROM
temp_3.write(0xBE, POWER_MODE); // команда чтения памяти датчика
temp_3.read_bytes(bufData_3, 9); // чтение памяти датчика, 9 байтов
if ( OneWire::crc8(bufData_3, 8) == bufData_3[8] ) { // проверка CRC
// данные правильные
flagT3 = true;
temperature_3 = (float)((int)bufData_3[0] | (((int)bufData_3[1]) << 8)) * 0.0625 + 0.03125 ;
}
else {
flagT3 = false;
temperature_3 = -99;
}
}
temp_4.reset(); // сброс шины
sensor_4 = temp_2.search(addr);
if (sensor_4) {
temp_4.reset_search();
temp_4.reset();
temp_4.write(0xCC, POWER_MODE); // пропуск ROM
temp_4.write(0xBE, POWER_MODE); // команда чтения памяти датчика
temp_4.read_bytes(bufData_4, 9); // чтение памяти датчика, 9 байтов
if ( OneWire::crc8(bufData_4, 8) == bufData_4[8] ) { // проверка CRC
// данные правильные
flagT4 = true;
temperature_4 = (float)((int)bufData_2[0] | (((int)bufData_2[1]) << 8)) * 0.0625 + 0.03125 ;
//TV.println(temperature_4);
}
else {
flagT4 = false;
temperature_4 = -99;
}
}
//запускаем новое преобразование
temp_1.reset(); // сброс шины
temp_1.write(0xCC, POWER_MODE); // пропуск ROM
temp_1.write(0x44, POWER_MODE); // инициализация измерения
temp_2.reset(); // сброс шины
temp_2.write(0xCC, POWER_MODE); // пропуск ROM
temp_2.write(0x44, POWER_MODE); // инициализация измерения
temp_3.reset(); // сброс шины
temp_3.write(0xCC, POWER_MODE); // пропуск ROM
temp_3.write(0x44, POWER_MODE); // инициализация измерения
temp_4.reset(); // сброс шины
temp_4.write(0xCC, POWER_MODE); // пропуск ROM
temp_4.write(0x44, POWER_MODE); // инициализация измерения
timerTemp = millis();
TV.draw_rect(1,70,20,24,1,0);
TV.draw_rect(1,85,20,9,1,1);
TV.draw_rect(10,8,2,62,1,0);
TV.set_cursor(35,5);
if (!sensor_1) {
TV.print("NO SENSOR 1");
}
else {
if (!flagT1){
TV.print("ERR SENSOR 1");
}
else{
TV.print("TOP T "); TV.print(temperature_1);TV.print(" C");
}
}
TV.set_cursor(35,15);
if (!sensor_2) {
TV.print("NO SENSOR 2");
}
else {
if (!flagT2){
TV.print("ERR SENSOR 2");
}
else{
TV.print("2/3 T "); TV.print(temperature_2);TV.print(" C");
}
}
TV.set_cursor(35,25);
if (!sensor_3) {
TV.print("NO SENSOR 3");
}
else {
if (!flagT2){
TV.print("ERR SENSOR 3");
}
else{
TV.print("LQ T "); TV.print(temperature_3);TV.print(" C");
}
}
TV.set_cursor(35,35);
if (!sensor_4) {
TV.print("NO SENSOR 4");
}
else {
if (!flagT2){
TV.print("ERR SENSOR 4");
}
else{
TV.print("CR T "); TV.print(temperature_4);TV.print(" C");
}
}
TV.delay(200);
}
} подключенных (каждый отдельно!)
А в чем тут причина? Почему к одному пину не прицепить все?
d.styler, а даст ли ему чип? Генерировать сигнал надо еще, может подавится или я не понимаю чего? Читал про эти либы, что они работу чипа хорошо тормозят.
d.styler, что бы с адресами не возиться.
Если поменял датчик, то всё сразу работает, как надо. К TV отношения не имеет.
Kusnezov Oleg, можно к аналоговому экранчику в машине прицепить (от камеры жоповидения).... типа температура ОЖ и так далее...
они работу чипа хорошо тормозят
Не то слово! Чудо, что 1-wire успевает опросить.
Иван, у меня прикол глубже.
Есть старинный видеосендер, который на эфирных частотах работает, и я могу на любом ТВ, на расстоянии до 40 м, смотреть - чего там с температурой. В том числе, на "картинке в картинке".
Впрочем можно и "беспроводный удлинитель видеосигнала" присобачить. У меня пара ненужных где-то валяется.
с 381 по 400 из 421