Open Tyill opened 5 years ago
Текст немного исказился! Прошу прощения!. Как связать вашу программу с Arduino IDE? В описании к программе написано, что всё для работы с Ардуино есть в архиве с программой! Файлы просмотрел, но библиотек не нашел. Датчик температуры в serial port показания выводит. С чего начать.
в папке с дистрибутивом ПО есть архив rar под названием "arduino_client.rar".
в нем папка - библиотека для Arduino IDE. Разархивируйте ее туда, где у вас другие библиотеки для ардуино лежат. У меня, например, так:
и подключите в Arduino IDE:
Дальше наберите пример:
#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". Загрузите скетч в плату и увидите график.
Здравствуйте! Прочитал вашу инструкцию, в общем я так и делал. Тестовый скейч с трудом загрузил в ардуино нано. Постоянно выдавала ошибку: Загрузив с трудом, перешёл в программу из архива "SV106_Win64_ru" но графика так и не увидел! В чем может быть проблема? На ардуино мигает "TX" значит передача идёт! Подключенный модуль в программе загорелся зелёным кружком! И ещё пробовал эту: Тоже графика нет!
Просмотрев ещё раз видео я понял, что нужно было график перетащить из под зеленого кружка! Теперь возникает вопрос , Как мне вывести температуру с датчика DS18B20 на график? Я понял serial print использовать нельзя!
надо 2 раза левой кнопкой мыши щекнуть на выбранном сигнале и справа будет график. смотрите видео, там клики мыши видать все.
чтобы температуру вывести, надо что-то типа этого записать:
void loop()
{
int analogPin = 3; // номер порта к которому подключен датчик
int val = 0; // переменная для хранения считываемого значения
val = analogRead(analogPin); // считываем значение
svisual::addIntValue("temp", val); // передаем в монитор
}
В SVMonitor появится сигнал "temp", щелкайте 2 ЛКМ на него и будет график.
да. где-то в мануале у меня написано, что serial print использовать нельзя.
старые версии лучше не использовать, там много изменений было сделано, ошибок устранено. используйте последнюю 1.0.6
Но датчик температуры 18d20 цифровой и к аналоговому пину не подключишь! Кроме того, после считывания бит происходит перевод значений в градусы цельсия. Вот пример мною проверенного скетча, но как тут вывести показания на график? ХЭЛП!
/*
// Поддерживаемые датчики
// Линия 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"); }
не понял в чем проблема. вот вы перевели в градусы, потом передавайте на график.
все 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 );
}
и будет в градусах график.
Спасибо за оперативный ответ! Скетч залил и программой график отобразил! Но хотелось бы и десятые доли градуса отображать, а то грубоватый график получается! Такая возможность имеется?
вообще да, сначала имелась. потом специально клиента для ардуинки загрубил, сделал тип int (16 бит) для всех переменных, соответственно float (32 бит) туда уже не влезет. это было сделано, чтобы была возможность больше записать переменных, помимо самой пользовательской программы, поскольку память контроллера ограничена.
подумаю над этим, может быть на опцию посажу, чтобы была возможность кому надо включить. напишу здесь, когда поправлю клиентскую либу.
клиента для ардуино изменил:
вот новая версия.
Поменял "Int" на "Float" , но как то особой разницы не вижу, кроме шести цифр после запятой! Может в скетче что то поменять?
/ Получаем температуру от датчиков серии DS18x20 / // Поддерживаемые датчики
// Линия 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 );
}
кроме шести цифр после запятой!
криво я его собрал. скачайте релиз еще раз.
на счет того, что ничего не изменилось. пишите так:
....
// Отделяем целые от дробных чисел
float fWhole = Tc_100 / 100.0;
// Если на улице дубак напишем минус перед цифрами :)
if (SignBit)
svisual::addFloatValue("temp", -fWhole );
else
svisual::addFloatValue("temp", fWhole);
Огромное спасибо! Сейчас получилось то, что было нужно! Ещё небольшая просьба что бы на 32 битной системе можно юзать (Планшетный ПК 32 бит система.) А на большом компе (64 бит) всё работает хорошо! Спасибо!
В описании к программе написано, что всё для работы с Ардуино есть в архиве с программой. Но как связать её с Ардуино Иде? Мне нужно контролировать датчик температуры ds18b20. В ардуино Иде скачал библиотеку для датчика и в сериал порт температуру отдаю, а как вывести её на гарфик?