Друзья, помогите: куда и как неправильно я вставляю один скетч в другой ?
- Войдите на сайт для отправки комментариев
Пнд, 15/07/2019 - 19:00
Сломал голову, видимо, "замылился" глаз. Нужно, чтом свежим взором кто-то взнлянул. Суть:
Этот скетч отрабатывает штатно:
//АРДУИНО УНО Управление клапаном отбора
// Переменные значения и времени считывания энкодера клапана
unsigned char enc_valve_a; //Значение вывода А энкодера клапана
unsigned char enc_valve_b; //Значение вывода В энкодера клапана
unsigned char enc_valve_a_prev=0; //Предыдущее значение вывода А энкодера клапана
unsigned long enc_valve_curr_time; //Текущая временная переменная энкодера клапана
unsigned long enc_valve_loop_time; //Предыдущая временная переменная энкодера клапана
int enc_valve_val; //Значение энкодера клапана
//Переменные клапана
volatile int valve; //Скважность клапана с шагом 1/100 от 0 до 1000
void setup()
{
Serial.begin(115200);
//Назначаем пины
for (int pin=2; pin<10;pin++) //На вход
{
pinMode(pin, INPUT);
}
for (int pin=10; pin<14;pin++) //На выход
{
pinMode(pin, OUTPUT);
}
}
void loop()
{
// Опрос энкодера клапана
enc_valve_curr_time = millis();
if(enc_valve_curr_time >= (enc_valve_loop_time + 5)) // проверяем каждые 5 мсек
{
enc_valve_a = digitalRead(5); // считываем состояние выхода А энкодера
enc_valve_b = digitalRead(4); // считываем состояние выхода B энкодера
if((!enc_valve_a) && (enc_valve_a_prev))// если состояние изменилось с положительного к нулю
{
if(enc_valve_b)
{
// выход В в полож. сост., значит вращение по часовой стрелке
valve++;
if(valve>100) {valve=100;}
}
else
{
// выход В в 0 сост., значит вращение против часовой стрелки
valve--;
if(valve<0) {valve=0;}
}
}
enc_valve_a_prev = enc_valve_a; // сохраняем значение А для следующего цикла
Serial.println(valve); // пишем значение в порт
enc_valve_loop_time = enc_valve_curr_time;
}
}
Этот скетч тоже отрабатывает штатно
Пардон, не то нажал. Этот скетч тоже отрабатывает штатно
//АРДУИНО УНО Управление клапаном отбора //________Подключение библиотек термометров #include <OneWire.h> #include <DallasTemperature.h> //________Объявление пинов температурных датчиков #define ONE_WIRE_BUS_1 9 //Датчик колонны #define ONE_WIRE_BUS_2 8 //Дополнительный датчик //________Подвязывание переменных к библиотекам OneWire oneWire_out_temp1(ONE_WIRE_BUS_1); OneWire oneWire_out_temp2(ONE_WIRE_BUS_2); DallasTemperature sensor_colonna(&oneWire_out_temp1); DallasTemperature sensor_addition(&oneWire_out_temp2); #include "LedControl.h" //Библиотека индикаторов /* Рацветка шлейфов на индикацию: GND - фиолетовый Din (dout) - пин 11 - желтый CS (load) - пин 12 - зеленый CLK - пин 13 - синий четвертая цифра "X" - количество модулей */ LedControl lc = LedControl(10, 12, 11, 4); //создаём объект класса LedControl (din,clk,cs,X) //ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ // Массив с закодированными символами для надписей. byte bukvy[37] = { B01110111, //A-0 B01111111, //B-1 B01001110, //C-2 B01001111, //E-3 B01000111, //F-4 B01011110, //G-5 B00110111, //H-6 B00111000, //J-7 B00001110, //L-8 B01111110, //O-9 B01100111, //P-10 B01011011, //S-11 B00111110, //U-12 B00111011, //Y-13 B01101101, //Z-14 B01011111, //Б-15 B01000110, //Г-16 B01111001, //З-17 B01110110, //П-18 B00110011, //Ч-19 B00011111, //Ь-20 B00011111, //b-21 B00001101, //c-22 B00111101, //d-23 B00010111, //h-24 B00010000, //i-25 B00011000, //j-26 B00001100, //l-27 B00010101, //n-28 B00011101, //o-29 B00011100, //u-30 B00000101, //г-31 B01100011, //°-32 B00001000, //_-33 B00000001, //--34 B00001001, //:-36 B00000000, //пусто-37 }; //Переменные кнопок volatile int but_delta_val=0; //Значения кнопки дельты volatile int but_valve_val=0; //Значения кнопки клапана // Переменные значения и времени считывания энкодера дельты unsigned char enc_delta_a; //Значение вывода А энкодера дельты unsigned char enc_delta_b; //Значение вывода В энкодера дельты unsigned char enc_delta_a_prev=0; //Предыдущее значение вывода А энкодера дельты unsigned long enc_delta_curr_time; //Текущая временная переменная энкодера дельты unsigned long enc_delta_loop_time; //Предыдущая временная переменная энкодера дельты int enc_delta_val; //Значение энкодера дельты // Переменные значения и времени считывания энкодера клапана unsigned char enc_valve_a; //Значение вывода А энкодера клапана unsigned char enc_valve_b; //Значение вывода В энкодера клапана unsigned char enc_valve_a_prev=0; //Предыдущее значение вывода А энкодера клапана unsigned long enc_valve_curr_time; //Текущая временная переменная энкодера клапана unsigned long enc_valve_loop_time; //Предыдущая временная переменная энкодера клапана int enc_valve_val; //Значение энкодера клапана //Переменные температуры volatile int temperature_colonna=0; //Температура колонны volatile int temperature_addition=0; //Температура дополнительного датчика volatile int temperature_delta=0; //Температура отсечки unsigned long temperature_time; //Переменная задержки времени для считывания датчиков температуры unsigned long temperature_loop_time; //Переменная задержки времени для считывания датчиков температуры предыдущая //Переменные клапана volatile int valve; //Скважность клапана с шагом 1/100 от 0 до 1000 volatile int valve_on; //Время открытого клапана (мсек) volatile int valve_off; //Время закрытого клапана (мсек) unsigned long valve_time; //Текущая временная переменная работы клапана unsigned long valve_time_prev; //Предыдущая временная переменная работы клапана // Переменные для индикации volatile int tys; //Тысячи volatile int sot; //Сотни volatile int des; //Десятки volatile int edi; //Единицы void setup() { //Датчики температуры sensor_colonna.begin(); sensor_addition.begin(); Serial.begin(115200); //Назначаем пины for (int pin=2; pin<10;pin++) //На вход { pinMode(pin, INPUT); } for (int pin=10; pin<14;pin++) //На выход { pinMode(pin, OUTPUT); } //Инициализация модуля индикаторов for (int ind=0;ind<4;ind++) { lc.shutdown(ind, false); //Выводим из спящего режима lc.setIntensity(ind,3); //Яркость дисплеев на 3. Всего возможных режимов яркости от 0 до 15 lc.clearDisplay(ind); //Очистить дисплей } //Прописываем "Col °" (температура колонны) lc.setRow(0, 7, bukvy[2]);//Индикация C" lc.setRow(0, 6, bukvy[29]);//Индикация "o" lc.setRow(0, 5, bukvy[27]);//Индикация "l" lc.setRow(0, 0, bukvy[32]);//Индикация "°" lc.setDigit(0, 3, 0, false); lc.setDigit(0, 2, 0, true); lc.setDigit(0, 1, 0, false); //Прописываем "Add °" (второй датчик температуры) lc.setRow(3, 7, bukvy[0]);//Индикация "A" lc.setRow(3, 6, bukvy[23]);//Индикация "d" lc.setRow(3, 5, bukvy[23]);//Индикация "d" lc.setRow(3, 0, bukvy[32]);//Индикация "°" lc.setDigit(3, 3, 0, false); lc.setDigit(3, 2, 0, true); lc.setDigit(3, 1, 0, false); //Прописываем "Adj °" (настройка дельты) lc.setRow(1, 7, bukvy[0]);//Индикация "A" lc.setRow(1, 6, bukvy[23]);//Индикация "d" lc.setRow(1, 5, bukvy[26]);//Индикация "j" lc.setRow(1, 0, bukvy[32]);//Индикация "°" lc.setDigit(1, 3, 0, false); lc.setDigit(1, 2, 0, true); lc.setDigit(1, 1, 0, false); //Прописываем "Pro" (скважность клапана) lc.setRow(2, 7, bukvy[10]);//Индикация "P" lc.setRow(2, 6, bukvy[31]);//Индикация "r" lc.setRow(2, 5, bukvy[29]);//Индикация "o" lc.setDigit(2, 2, 0, true); lc.setDigit(2, 1, 0, false); lc.setDigit(2, 0, 0, false); //Назначение прерываний attachInterrupt(0, BUTTON_DELTA, RISING); //Прерывание дельты attachInterrupt(1, BUTTON_VALVE, RISING); //Прерывание клапана } void loop() { //________Запрос датчикам на измерение температуры sensor_colonna.requestTemperatures(); sensor_addition.requestTemperatures(); //Опрос показаний датчиков температуры temperature_time=millis(); if (temperature_time >= (temperature_loop_time+850))//проверяем каждые 850 мсек { // Формируем переменные для передачи на индикацию temperature_colonna=sensor_colonna.getTempCByIndex(0)*10; temperature_addition=sensor_addition.getTempCByIndex(0)*10; // Индикация температур DEGREE_COLONNA(); DEGREE_ADDITION(); temperature_loop_time=temperature_time; //________Обнуляем переменную задержки времени для считывания датчиков температуры } } void DEGREE_COLONNA() //Прописываем текущую температуру колонны { //Расчленение переменной температуры колонны sot=temperature_colonna/100; des=temperature_colonna% 100 / 10; edi=temperature_colonna% 10; // Индикация lc.setDigit(0, 3, sot, false); lc.setDigit(0, 2, des, true); lc.setDigit(0, 1, edi, false); } void DEGREE_ADDITION() //Прописываем текущую температуру дополнительного датчика { //Расчленение переменной температуры дополнительного датчика sot=temperature_addition/100; des=temperature_addition% 100 / 10; edi=temperature_addition% 10; // Индикация lc.setDigit(3, 3, sot, false); lc.setDigit(3, 2, des, true); lc.setDigit(3, 1, edi, false); } void DEGREE_DELTA() //Прописываем температуру отсечки { //Расчленение переменной температуры отсечки sot=temperature_delta/100; des=temperature_delta% 100 / 10; edi=temperature_delta% 10; // Индикация lc.setDigit(1, 3, sot, false); lc.setDigit(1, 2, des, true); lc.setDigit(1, 1, edi, false); } void VALVE_SETUP() //Прописываем скважность клапана { //Расчленение переменной скважности клапана /*tys=current_power/1000; sot=current_power%1000/100; des=current_power%100/10; edi=current_power%10; // Индикация lc.setDigit(1, 3, tys, false); lc.setDigit(1, 2, sot, false); lc.setDigit(1, 1, des, false); lc.setDigit(1, 0, edi, false);*/ } void BUTTON_DELTA () //Приравниваем температуру отсечки к температуре колонны { temperature_delta=temperature_colonna; DEGREE_DELTA(); } void BUTTON_VALVE () //Отключаем-подключаем клапан { }Но когда я пытаюсь их соединить вот так:
//АРДУИНО УНО Управление клапаном отбора //________Подключение библиотек термометров #include <OneWire.h> #include <DallasTemperature.h> //________Объявление пинов температурных датчиков #define ONE_WIRE_BUS_1 9 //Датчик колонны #define ONE_WIRE_BUS_2 8 //Дополнительный датчик //________Подвязывание переменных к библиотекам OneWire oneWire_out_temp1(ONE_WIRE_BUS_1); OneWire oneWire_out_temp2(ONE_WIRE_BUS_2); DallasTemperature sensor_colonna(&oneWire_out_temp1); DallasTemperature sensor_addition(&oneWire_out_temp2); #include "LedControl.h" //Библиотека индикаторов /* Рацветка шлейфов на индикацию: GND - фиолетовый Din (dout) - пин 11 - желтый CS (load) - пин 12 - зеленый CLK - пин 13 - синий четвертая цифра "X" - количество модулей */ LedControl lc = LedControl(10, 12, 11, 4); //создаём объект класса LedControl (din,clk,cs,X) //ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ // Массив с закодированными символами для надписей. byte bukvy[37] = { B01110111, //A-0 B01111111, //B-1 B01001110, //C-2 B01001111, //E-3 B01000111, //F-4 B01011110, //G-5 B00110111, //H-6 B00111000, //J-7 B00001110, //L-8 B01111110, //O-9 B01100111, //P-10 B01011011, //S-11 B00111110, //U-12 B00111011, //Y-13 B01101101, //Z-14 B01011111, //Б-15 B01000110, //Г-16 B01111001, //З-17 B01110110, //П-18 B00110011, //Ч-19 B00011111, //Ь-20 B00011111, //b-21 B00001101, //c-22 B00111101, //d-23 B00010111, //h-24 B00010000, //i-25 B00011000, //j-26 B00001100, //l-27 B00010101, //n-28 B00011101, //o-29 B00011100, //u-30 B00000101, //г-31 B01100011, //°-32 B00001000, //_-33 B00000001, //--34 B00001001, //:-36 B00000000, //пусто-37 }; //Переменные кнопок volatile int but_delta_val=0; //Значения кнопки дельты volatile int but_valve_val=0; //Значения кнопки клапана // Переменные значения и времени считывания энкодера дельты unsigned char enc_delta_a; //Значение вывода А энкодера дельты unsigned char enc_delta_b; //Значение вывода В энкодера дельты unsigned char enc_delta_a_prev=0; //Предыдущее значение вывода А энкодера дельты unsigned long enc_delta_curr_time; //Текущая временная переменная энкодера дельты unsigned long enc_delta_loop_time; //Предыдущая временная переменная энкодера дельты int enc_delta_val; //Значение энкодера дельты // Переменные значения и времени считывания энкодера клапана unsigned char enc_valve_a; //Значение вывода А энкодера клапана unsigned char enc_valve_b; //Значение вывода В энкодера клапана unsigned char enc_valve_a_prev=0; //Предыдущее значение вывода А энкодера клапана unsigned long enc_valve_curr_time; //Текущая временная переменная энкодера клапана unsigned long enc_valve_loop_time; //Предыдущая временная переменная энкодера клапана int enc_valve_val; //Значение энкодера клапана //Переменные температуры volatile int temperature_colonna=0; //Температура колонны volatile int temperature_addition=0; //Температура дополнительного датчика volatile int temperature_delta=0; //Температура отсечки unsigned long temperature_time; //Переменная задержки времени для считывания датчиков температуры unsigned long temperature_loop_time; //Переменная задержки времени для считывания датчиков температуры предыдущая //Переменные клапана volatile int valve; //Скважность клапана с шагом 1/100 от 0 до 1000 volatile int valve_on; //Время открытого клапана (мсек) volatile int valve_off; //Время закрытого клапана (мсек) unsigned long valve_time; //Текущая временная переменная работы клапана unsigned long valve_time_prev; //Предыдущая временная переменная работы клапана // Переменные для индикации volatile int tys; //Тысячи volatile int sot; //Сотни volatile int des; //Десятки volatile int edi; //Единицы void setup() { //Датчики температуры sensor_colonna.begin(); sensor_addition.begin(); Serial.begin(115200); //Назначаем пины for (int pin=2; pin<10;pin++) //На вход { pinMode(pin, INPUT); } for (int pin=10; pin<14;pin++) //На выход { pinMode(pin, OUTPUT); } //Инициализация модуля индикаторов for (int ind=0;ind<4;ind++) { lc.shutdown(ind, false); //Выводим из спящего режима lc.setIntensity(ind,3); //Яркость дисплеев на 3. Всего возможных режимов яркости от 0 до 15 lc.clearDisplay(ind); //Очистить дисплей } //Прописываем "Col °" (температура колонны) lc.setRow(0, 7, bukvy[2]);//Индикация C" lc.setRow(0, 6, bukvy[29]);//Индикация "o" lc.setRow(0, 5, bukvy[27]);//Индикация "l" lc.setRow(0, 0, bukvy[32]);//Индикация "°" lc.setDigit(0, 3, 0, false); lc.setDigit(0, 2, 0, true); lc.setDigit(0, 1, 0, false); //Прописываем "Add °" (второй датчик температуры) lc.setRow(3, 7, bukvy[0]);//Индикация "A" lc.setRow(3, 6, bukvy[23]);//Индикация "d" lc.setRow(3, 5, bukvy[23]);//Индикация "d" lc.setRow(3, 0, bukvy[32]);//Индикация "°" lc.setDigit(3, 3, 0, false); lc.setDigit(3, 2, 0, true); lc.setDigit(3, 1, 0, false); //Прописываем "Adj °" (настройка дельты) lc.setRow(1, 7, bukvy[0]);//Индикация "A" lc.setRow(1, 6, bukvy[23]);//Индикация "d" lc.setRow(1, 5, bukvy[26]);//Индикация "j" lc.setRow(1, 0, bukvy[32]);//Индикация "°" lc.setDigit(1, 3, 0, false); lc.setDigit(1, 2, 0, true); lc.setDigit(1, 1, 0, false); //Прописываем "Pro" (скважность клапана) lc.setRow(2, 7, bukvy[10]);//Индикация "P" lc.setRow(2, 6, bukvy[31]);//Индикация "r" lc.setRow(2, 5, bukvy[29]);//Индикация "o" lc.setDigit(2, 2, 0, true); lc.setDigit(2, 1, 0, false); lc.setDigit(2, 0, 0, false); //Назначение прерываний attachInterrupt(0, BUTTON_DELTA, RISING); //Прерывание дельты attachInterrupt(1, BUTTON_VALVE, RISING); //Прерывание клапана } void loop() { //________Запрос датчикам на измерение температуры sensor_colonna.requestTemperatures(); sensor_addition.requestTemperatures(); // Опрос энкодера клапана enc_valve_curr_time = millis(); if(enc_valve_curr_time >= (enc_valve_loop_time + 5)) // проверяем каждые 5 мсек { enc_valve_a = digitalRead(4); // считываем состояние выхода А энкодера enc_valve_b = digitalRead(5); // считываем состояние выхода B энкодера if((!enc_valve_a) && (enc_valve_a_prev))// если состояние изменилось с положительного к нулю { if(enc_valve_b) { // выход В в полож. сост., значит вращение по часовой стрелке valve++; } else { // выход В в 0 сост., значит вращение против часовой стрелки valve--; } } enc_valve_a_prev = enc_valve_a; // сохраняем значение А для следующего цикла Serial.println(valve); // пишем значение в порт enc_valve_loop_time = enc_valve_curr_time; } //Опрос показани1 датчиков температуры temperature_time=millis(); if (temperature_time >= (temperature_loop_time+850))//проверяем каждые 850 мсек { // Формируем переменные для передачи на индикацию temperature_colonna=sensor_colonna.getTempCByIndex(0)*10; temperature_addition=sensor_addition.getTempCByIndex(0)*10; // Индикация температур DEGREE_COLONNA(); DEGREE_ADDITION(); temperature_loop_time=temperature_time; //________Обнуляем переменную задержки времени для считывания датчиков температуры } } void DEGREE_COLONNA() //Прописываем текущую температуру колонны { //Расчленение переменной температуры колонны sot=temperature_colonna/100; des=temperature_colonna% 100 / 10; edi=temperature_colonna% 10; // Индикация lc.setDigit(0, 3, sot, false); lc.setDigit(0, 2, des, true); lc.setDigit(0, 1, edi, false); } void DEGREE_ADDITION() //Прописываем текущую температуру дополнительного датчика { //Расчленение переменной температуры дополнительного датчика sot=temperature_addition/100; des=temperature_addition% 100 / 10; edi=temperature_addition% 10; // Индикация lc.setDigit(3, 3, sot, false); lc.setDigit(3, 2, des, true); lc.setDigit(3, 1, edi, false); } void DEGREE_DELTA() //Прописываем температуру отсечки { //Расчленение переменной температуры отсечки sot=temperature_delta/100; des=temperature_delta% 100 / 10; edi=temperature_delta% 10; // Индикация lc.setDigit(1, 3, sot, false); lc.setDigit(1, 2, des, true); lc.setDigit(1, 1, edi, false); } void VALVE_SETUP() //Прописываем скважность клапана { //Расчленение переменной скважности клапана /*tys=current_power/1000; sot=current_power%1000/100; des=current_power%100/10; edi=current_power%10; // Индикация lc.setDigit(1, 3, tys, false); lc.setDigit(1, 2, sot, false); lc.setDigit(1, 1, des, false); lc.setDigit(1, 0, edi, false);*/ } void BUTTON_DELTA () //Приравниваем температуру отсечки к температуре колонны { temperature_delta=temperature_colonna; DEGREE_DELTA(); } void BUTTON_VALVE () //Отключаем-подключаем клапан { }Энкодер выдает сплошную белиберду.
Друзья, гляньте опытным глазом: в чем причина трабла и куда я что-то не так вставил. Ей-Богу, замотался искать причину!
Заранее спасибо!!!!
Sonologist, вот от этого:
нужно избавляться. Библа вставляет паузы.
Sonologist, вот от этого:
нужно избавляться. Библа вставляет паузы.
Вот падла! Что посоветуете, сэр? Если не влом - прям кусочек скетча (наверное, с одним OneWare), а? А то затрахался....
[quote=Sonologist]
[quote=dimax]
Sonologist, вот от этого:
нужно избавляться. Библа вставляет паузы.
Вот падла! Что посоветуете, сэр? Если не влом - прям кусочек скетча (наверное, с одним OneWare), а? А то затрахался.... Ашел тут библиотечку: https://www.arduinolibraries.info/libraries/ds18-b20-events
Не взгянете на "данный проблем" (я пока настолько слаб в ардуине....)? Вдруг да пойдет? Простите за наглость, но действительно в ступоре я.... Вроде, до последнего времени все шло как надо, но тут наскочил лбом на стену (выяснилось, что стена - Даллас) :)
Да что ж такое???!!! Извините за дублирование, не хотел, само получилось....
Не взгянете на "данный проблем" (я пока настолько слаб в ардуине....)? Вдруг да пойдет? Простите за наглость, но действительно в ступоре я.... Вроде, до последнего времени все шло как надо, но тут наскочил лбом на стену (выяснилось, что стена - Даллас) :)
Вам про это давно говорили, не слушали.((( Наберите сверху в поиске: "Почистил скетч примера".
Вам про это давно говорили, не слушали.((( Наберите сверху в поиске: "Почистил скетч примера".
Старик, все правильно говорите, но... Тут беда в том, что совсем мозги съехали. Не моя профессия (лекарь я, говорят -толковый). А сделать дело хочется (типа я "продвинутый" пользователь). На VB6 уж давно бы эту задачу решил, а вот с Ардуиною пока слабо знаком. Стараюсь, но не все получается. Не ругайте старика на 7-м десятке: кой-чего уже додумывать приходится через силу, что лет тридцать назад решал на раз.
http://arduino.ru/forum/programmirovanie/pochistil-sketch-primera-raboty-s-ds18b20-iz-bibly-oneware
http://arduino.ru/forum/programmirovanie/pochistil-sketch-primera-raboty-s-ds18b20-iz-bibly-oneware
Весьма благодарен, буду там копать!
Sonologist, посадите энкодер на прерывания pcint.
Sonologist, посадите энкодер на прерывания pcint.
Спасибо, это варинт, рассмотрю.
Sonologist, вот от этого:
нужно избавляться. Библа вставляет паузы.
Спасибо, Димакс: выкинул библу, стало заменно лучше.