SVisual icon indicating copy to clipboard operation
SVisual copied to clipboard

Win32. Программу установил, Но нужна помощь!

Open Tyill opened this issue 6 years ago • 16 comments

Tyill avatar Feb 27 '19 07:02 Tyill

В описании к программе написано, что всё для работы с Ардуино есть в архиве с программой. Но как связать её с Ардуино Иде? Мне нужно контролировать датчик температуры ds18b20. В ардуино Иде скачал библиотеку для датчика и в сериал порт температуру отдаю, а как вывести её на гарфик?

himical avatar Mar 03 '19 08:03 himical

Текст немного исказился! Прошу прощения!. Как связать вашу программу с Arduino IDE? В описании к программе написано, что всё для работы с Ардуино есть в архиве с программой! Файлы просмотрел, но библиотек не нашел. Датчик температуры в serial port показания выводит. С чего начать.

himical avatar Mar 03 '19 10:03 himical

в папке с дистрибутивом ПО есть архив rar под названием "arduino_client.rar".

default

в нем папка - библиотека для Arduino IDE. Разархивируйте ее туда, где у вас другие библиотеки для ардуино лежат. У меня, например, так:

default

и подключите в Arduino IDE:

default

Дальше наберите пример:

#include <SVClient.h>
void setup() {

	bool ok = svisual::connectOfCOM("test");

}
int cnt = 0;
void loop() {

	svisual::addIntValue("dfv", cnt);

	++cnt;
	if (cnt > 10) cnt = 0;

	bool odd_cnt = cnt % 2;

    svisual::addBoolValue("bFW", odd_cnt);

    svisual::addBoolValue("bBW", !odd_cnt);

	delay(200);
}

Запустите SVMonitor.exe, в настройках выберите - "Получение данных с COM". Загрузите скетч в плату и увидите график.

Tyill avatar Mar 05 '19 05:03 Tyill

Здравствуйте! Прочитал вашу инструкцию, в общем я так и делал. Тестовый скейч с трудом загрузил в ардуино нано. Постоянно выдавала ошибку: 1 Загрузив с трудом, перешёл в программу из архива "SV106_Win64_ru" но графика так и не увидел! В чем может быть проблема? На ардуино мигает "TX" значит передача идёт! Подключенный модуль в программе загорелся зелёным кружком! svmonitor 106 И ещё пробовал эту: svmonitor 1001 Тоже графика нет!

himical avatar Mar 05 '19 20:03 himical

Просмотрев ещё раз видео я понял, что нужно было график перетащить из под зеленого кружка! Теперь возникает вопрос , Как мне вывести температуру с датчика DS18B20 на график? Я понял serial print использовать нельзя!

himical avatar Mar 05 '19 20:03 himical

надо 2 раза левой кнопкой мыши щекнуть на выбранном сигнале и справа будет график. смотрите видео, там клики мыши видать все.

чтобы температуру вывести, надо что-то типа этого записать:

 
void loop()
{

int analogPin = 3;     // номер порта к которому подключен датчик
int val = 0;           // переменная для хранения считываемого значения

  val = analogRead(analogPin);     // считываем значение
 
 svisual::addIntValue("temp", val);    // передаем в монитор      
}

В SVMonitor появится сигнал "temp", щелкайте 2 ЛКМ на него и будет график.

Tyill avatar Mar 06 '19 05:03 Tyill

да. где-то в мануале у меня написано, что serial print использовать нельзя.

Tyill avatar Mar 06 '19 05:03 Tyill

старые версии лучше не использовать, там много изменений было сделано, ошибок устранено. используйте последнюю 1.0.6

Tyill avatar Mar 06 '19 05:03 Tyill

Но датчик температуры 18d20 цифровой и к аналоговому пину не подключишь! Кроме того, после считывания бит происходит перевод значений в градусы цельсия. Вот пример мною проверенного скетча, но как тут вывести показания на график? ХЭЛП! #include <OneWire.h>

/*

  • Получаем температуру от датчиков серии DS18x20 */

// Поддерживаемые датчики #define DS18S20_ID 0x10 #define DS18B20_ID 0x28

// Линия 1-Wire будет на pin 2 OneWire ds(2);

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

void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8];

if (!ds.search(addr)) { ds.reset_search(); return; }

if (OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; }

if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) { Serial.print("Device is not a DS18x20 family device.\n"); return; }

ds.reset(); ds.select(addr);

// Запускаем конвертацию ds.write(0x44, 1);

// Подождем... delay(1000);

present = ds.reset(); ds.select(addr);

// Считываем ОЗУ датчика
ds.write(0xBE);

// Обрабатываем 9 байт for ( i = 0; i < 9; i++) { data[i] = ds.read(); }

// Высчитываем температуру :) int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract; LowByte = data[0]; HighByte = data[1];

TReading = (HighByte << 8) + LowByte;

// Проверяем дубак там или нет SignBit = TReading & 0x8000;

// Если на улице дубак :) if (SignBit) { TReading = (TReading ^ 0xffff) + 1; }

// Умножаем на (100 * 0.0625) или 6.25 Tc_100 = (6 * TReading) + TReading / 4;

// Отделяем целые от дробных чисел Whole = Tc_100 / 100; Fract = Tc_100 % 100;

Serial.print("Temperature: ");

// Если на улице дубак напишем минус перед цифрами :) if (SignBit) { Serial.print("-"); }

Serial.print(Whole); Serial.print(".");

if (Fract < 10) { Serial.print("0"); }

Serial.print(Fract); Serial.print("\n"); }

himical avatar Mar 24 '19 17:03 himical

не понял в чем проблема. вот вы перевели в градусы, потом передавайте на график.

все Serial.Print уберите, вот что получится:

#include <OneWire.h>
#include <SVClient.h>

/*
Получаем температуру от датчиков серии DS18x20
*/
// Поддерживаемые датчики
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28

// Линия 1-Wire будет на pin 2
OneWire ds(2);

void setup(void) {

svisual::connectOfCOM("myModule");

}

void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];

if (!ds.search(addr)) {
ds.reset_search();
return;
}

if (OneWire::crc8( addr, 7) != addr[7]) {
//Serial.print("CRC is not valid!\n");
return;
}

if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
//Serial.print("Device is not a DS18x20 family device.\n");
return;
}

ds.reset();
ds.select(addr);

// Запускаем конвертацию
ds.write(0x44, 1);

// Подождем...
delay(1000);

present = ds.reset();
ds.select(addr);

// Считываем ОЗУ датчика
ds.write(0xBE);

// Обрабатываем 9 байт
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}

// Высчитываем температуру :)
int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
LowByte = data[0];
HighByte = data[1];

TReading = (HighByte << 8) + LowByte;

// Проверяем дубак там или нет
SignBit = TReading & 0x8000;

// Если на улице дубак :)
if (SignBit) {
TReading = (TReading ^ 0xffff) + 1;
}

// Умножаем на (100 * 0.0625) или 6.25
Tc_100 = (6 * TReading) + TReading / 4;

// Отделяем целые от дробных чисел
Whole = Tc_100 / 100;
Fract = Tc_100 % 100;

// Если на улице дубак напишем минус перед цифрами :)
if (SignBit)
  svisual::addIntValue("temp", -Whole );
else 
  svisual::addIntValue("temp", Whole );

}

и будет в градусах график.

Tyill avatar Mar 24 '19 18:03 Tyill

Спасибо за оперативный ответ! Скетч залил и программой график отобразил! Но хотелось бы и десятые доли градуса отображать, а то грубоватый график получается! Такая возможность имеется? image

himical avatar Mar 25 '19 19:03 himical

вообще да, сначала имелась. потом специально клиента для ардуинки загрубил, сделал тип int (16 бит) для всех переменных, соответственно float (32 бит) туда уже не влезет. это было сделано, чтобы была возможность больше записать переменных, помимо самой пользовательской программы, поскольку память контроллера ограничена.

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

Tyill avatar Mar 26 '19 03:03 Tyill

клиента для ардуино изменил:

  • варнинги поправил свои;
  • добавил метод для передачи 'float' значений.

вот новая версия.

Tyill avatar Apr 01 '19 17:04 Tyill

Поменял "Int" на "Float" , но как то особой разницы не вижу, кроме шести цифр после запятой! image Может в скетче что то поменять? #include <OneWire.h> #include <SVClient.h>

/* Получаем температуру от датчиков серии DS18x20 */ // Поддерживаемые датчики #define DS18S20_ID 0x10 #define DS18B20_ID 0x28

// Линия 1-Wire будет на pin 6 OneWire ds(6);

void setup(void) {

svisual::connectOfCOM("myModule");

}

void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8];

if (!ds.search(addr)) { ds.reset_search(); return; }

if (OneWire::crc8( addr, 7) != addr[7]) { //Serial.print("CRC is not valid!\n"); return; }

if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) { //Serial.print("Device is not a DS18x20 family device.\n"); return; }

ds.reset(); ds.select(addr);

// Запускаем конвертацию ds.write(0x44, 1);

// Подождем... delay(1000);

present = ds.reset(); ds.select(addr);

// Считываем ОЗУ датчика ds.write(0xBE);

// Обрабатываем 9 байт for ( i = 0; i < 9; i++) { data[i] = ds.read(); }

// Высчитываем температуру :) int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract; LowByte = data[0]; HighByte = data[1];

TReading = (HighByte << 8) + LowByte;

// Проверяем дубак там или нет SignBit = TReading & 0x8000;

// Если на улице дубак :) if (SignBit) { TReading = (TReading ^ 0xffff) + 1; }

// Умножаем на (100 * 0.0625) или 6.25 Tc_100 = (6 * TReading) + TReading / 4;

// Отделяем целые от дробных чисел Whole = Tc_100 / 100; Fract = Tc_100 % 100;

// Если на улице дубак напишем минус перед цифрами :) if (SignBit) svisual::addFloatValue("temp", -Whole ); else svisual::addFloatValue("temp", Whole );

}

himical avatar Apr 04 '19 19:04 himical

кроме шести цифр после запятой!

криво я его собрал. скачайте релиз еще раз.

на счет того, что ничего не изменилось. пишите так:

....
// Отделяем целые от дробных чисел
float fWhole = Tc_100 / 100.0;

// Если на улице дубак напишем минус перед цифрами :)
if (SignBit)
svisual::addFloatValue("temp", -fWhole );
else
svisual::addFloatValue("temp", fWhole);

Tyill avatar Apr 05 '19 05:04 Tyill

Огромное спасибо! Сейчас получилось то, что было нужно! Ещё небольшая просьба что бы на 32 битной системе можно юзать (Планшетный ПК 32 бит система.) А на большом компе (64 бит) всё работает хорошо! Спасибо!

himical avatar Apr 05 '19 18:04 himical