Tyill / SVisual

Monitoring and record(save) of data for Arduino and STM32
MIT License
24 stars 9 forks source link

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

Open Tyill opened 5 years ago

himical commented 5 years ago

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

himical commented 5 years ago

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

Tyill commented 5 years ago

в папке с дистрибутивом ПО есть архив 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". Загрузите скетч в плату и увидите график.

himical commented 5 years ago

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

himical commented 5 years ago

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

Tyill commented 5 years ago

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

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


void loop()
{

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

  val = analogRead(analogPin);     // считываем значение

 svisual::addIntValue("temp", val);    // передаем в монитор      
}

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

Tyill commented 5 years ago

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

Tyill commented 5 years ago

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

himical commented 5 years ago

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

include

/*

// Поддерживаемые датчики

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"); }

Tyill commented 5 years ago

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

все 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 );

}

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

himical commented 5 years ago

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

Tyill commented 5 years ago

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

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

Tyill commented 5 years ago

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

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

himical commented 5 years ago

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

include

include

/ Получаем температуру от датчиков серии 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 );

}

Tyill commented 5 years ago

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

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

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

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

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

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