помогите перенести код в пользовательский блок

не хватет знаний((

Вопросы от новичков
Ответить
koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30.04.2021{, 06:04}
Репутация: 0
Имя: егор

помогите перенести код в пользовательский блок

#1

Сообщение koroleves » 11.08.2021{, 21:30}

Добрый день! Помогите перенести код в пользовательский блок. В "базовом" варианте, код компилируется, но при попытке дописать разрешение на работу и таймер задержки опроса, то возникает ошибка в функции выделенным желтым цветом. Код ниже предоставлен:

#include "arduino.h"
#include "SoftwareSerial.h"
#define MAXLENGTH 9

SoftwareSerial mySerial(10, 11);

byte receivedCommandStack[MAXLENGTH];
byte checkSum(byte array[], byte length);
boolean receivedFlag;

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

void loop() {
ze08_PPM();
}

byte checkSum(byte array[], byte length) {
byte sum = 0;
for (int i = 1; i < length - 1; i ++) {
sum += array;
}
sum = (~sum) + 1;
return sum;
}

boolean available1() { //new data was recevied
while (mySerial.available()) {
for (byte index = 0; index < MAXLENGTH - 1; index++) {
receivedCommandStack[index] = receivedCommandStack[index + 1];
}
receivedCommandStack[MAXLENGTH - 1] = mySerial.read();

byte sumNum = checkSum(receivedCommandStack, MAXLENGTH);
if ( (receivedCommandStack[0] == 0xFF) && (receivedCommandStack[1] == 0x17) && (receivedCommandStack[2] == 0x04) && (receivedCommandStack[MAXLENGTH - 1] == sumNum) ) { //head bit and sum are all right
receivedFlag = 1; //new data received
return receivedFlag;
} else {
receivedFlag = 0; //data loss or error
return receivedFlag;
}
}
return receivedFlag;
}

float ze08_PPM() {
if (available1() == 1) {
receivedFlag = 0;

float ppb = (unsigned int) (receivedCommandStack[4] * 256) + receivedCommandStack[5]; // bit 4: ppm high 8-bit; bit 5: ppm low 8-bit
float ppm = ppb / 1000; // 1ppb = 1000ppm
return ppm;
}
}

При попытке переноса у меня возникала проблема с функцией помеченной желтым цветом, что-то я там не правильно писал
адрес источника https://chocoball.tistory.com/entry/Har ... nsor-using

Аватара пользователя
RedSky
Лейтенант
Сообщения: 574
Зарегистрирован: 19.12.2016{, 20:07}
Репутация: 72
Откуда: Днепропетровск
Имя: Алексей

помогите перенести код в пользовательский блок

#2

Сообщение RedSky » 11.08.2021{, 22:53}

Как будет происходить опрос? По uart или аналоговому?
Вот блок с опросом по uart, нужно испытывать.
Вложения
CH2O_sensor_(Code_-_Professional).ubi
(193.58 КБ) 16 скачиваний

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

помогите перенести код в пользовательский блок

#3

Сообщение Naladchik » 12.08.2021{, 21:17}

Блок в проекте.
Опрос по uart или по аналоговому входу выбирается параметром.
CH2O sensor.flp
(282.75 КБ) 41 скачивание
Win10-64. FLProg Portable.
Изображение

koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30.04.2021{, 06:04}
Репутация: 0
Имя: егор

помогите перенести код в пользовательский блок

#4

Сообщение koroleves » 12.08.2021{, 21:46}

RedSky писал(а):
11.08.2021{, 22:53}
ак будет происходить опрос? По uart или аналоговому?
Вот блок с опросом по uart, нужно испытывать.
Наладчик - ОГРОМНОЕ спасибо!! Блок компилируется - но значения не меняются по сравнению с исходным кодом
#include "arduino.h"
#include "SoftwareSerial.h"

#define MAXLENGTH 9


SoftwareSerial mySerial(2, 3);

byte receivedCommandStack[MAXLENGTH];
byte checkSum(byte array[], byte length);
boolean receivedFlag;

void setup() {
// put your setup code here, to run once
mySerial.begin(9600);
Serial.begin(9600);
}

void loop() {
ze08_PPM();
}

byte checkSum(byte array[], byte length) {
byte sum = 0;
for (int i = 1; i < length - 1; i ++) {
sum += array;
}
sum = (~sum) + 1;
return sum;
}

boolean available1() { //new data was recevied
while (mySerial.available()) {
for (byte index = 0; index < MAXLENGTH - 1; index++) {
receivedCommandStack[index] = receivedCommandStack[index + 1];
}
receivedCommandStack[MAXLENGTH - 1] = mySerial.read();

byte sumNum = checkSum(receivedCommandStack, MAXLENGTH);
if ( (receivedCommandStack[0] == 0xFF) && (receivedCommandStack[1] == 0x17) && (receivedCommandStack[2] == 0x04) && (receivedCommandStack[MAXLENGTH - 1] == sumNum) ) { //head bit and sum are all right
receivedFlag = 1; //new data received
return receivedFlag;
} else {
receivedFlag = 0; //data loss or error
return receivedFlag;
}
}
return receivedFlag;
}

float ze08_PPM() {
if (available1() == 1) {
receivedFlag = 0;

float ppb = (unsigned int) (receivedCommandStack[4] * 256) + receivedCommandStack[5]; // bit 4: ppm high 8-bit; bit 5: ppm low 8-bit
float ppm = ppb / 1000; // 1ppb = 1000ppm
delay (1000);
Serial.print("Formalin ppm == ");
Serial.println(ppm);
return ppm;
}
}


출처: https://chocoball.tistory.com/entry/Har ... nsor-using [초코볼의 inside Tech]

Я сделал попытку добавить входы на разрешение работы и время опроса - комплируется но значения не меняются ((( не понимаю в чем дело

Отправлено спустя 5 минут 39 секунд:
RedSky писал(а):
11.08.2021{, 22:53}
RedSky » Вчера{, 22:53}
Как будет происходить опрос? По uart или аналоговому?
Вот блок с опросом по uart, нужно испытывать.

Спасибо огромное за помощь на основании вашего блока модифицировал свой - но по сравнению с исходным кодом значения не меняются((
Вложения
ZE08-CH2O_soft_En_(Code_-_Professional).ubi
(245.04 КБ) 17 скачиваний
ZE08-CH2O test.flp
(366.23 КБ) 46 скачиваний

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

помогите перенести код в пользовательский блок

#5

Сообщение Naladchik » 13.08.2021{, 06:46}

koroleves писал(а):
12.08.2021{, 22:03}
модифицировал свой
Поправил, проверяйте.
ZE08-CH2O test.flp
(332.49 КБ) 23 скачивания
Win10-64. FLProg Portable.
Изображение

koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30.04.2021{, 06:04}
Репутация: 0
Имя: егор

помогите перенести код в пользовательский блок

#6

Сообщение koroleves » 13.08.2021{, 19:25}

не работает, то есть не отравляет значения. Это видно на скриншотах Вывел еще 2 скетча - один это оригинал, второй flproga.

Отправлено спустя 5 часов 24 минуты 43 секунды:
похоже это проблема с самим датчиком, блок нормальный
Вложения
ze08-cho2_1.ino
(1.76 КБ) 18 скачиваний
ZE08-CH2O test.flp
(332.49 КБ) 17 скачиваний
test.ino
(2.94 КБ) 18 скачиваний
2021-08-13_19-14-02.png
2021-08-13_19-16-44.png

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

помогите перенести код в пользовательский блок

#7

Сообщение aidar_i » 14.08.2021{, 04:59}

С оригинальным скетчем работает нормально?

koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30.04.2021{, 06:04}
Репутация: 0
Имя: егор

помогите перенести код в пользовательский блок

#8

Сообщение koroleves » 14.08.2021{, 08:44}

Да с оригинальным работает...... ненормально я брал за основу не тот скетч, протестировав я понял
Я окончательно деморализован((((

правильно работает вот этот скетч http://arduino.ru/forum/obshchii/winsen-ze08-ch2o

#include <SoftwareSerial.h>

// Activate debug messages output
#define DEBUG_ON

#define WINSEN_ZE08_CH2O_UART_TX_PIN (2)
#define WINSEN_ZE08_CH2O_UART_SPEED (9600)
#define WINSEN_ZE08_CH2O_UART_DEFAULT_READ_TIMEOUT (2500UL)
#define WINSEN_ZE08_CH2O_UART_START_BYTE (0xFF)
#define WINSEN_ZE08_CH2O_UART_GAS_NAME (0x17)
#define WINSEN_ZE08_CH2O_UART_GAS_UNIT (0x04)

// We can use 0xFFFF as error code because sensor's ppb range is 0x00...0x1388 (0...5000)
#define WINSEN_ZE08_CH2O_READ_ERROR_CODE (0xFFFF)

// Store all metric's value in the pretty struct
typedef struct {
uint8_t gasName;
uint8_t gasUnit;
uint8_t noDecimalByte;
uint8_t concentrationHighByte, concentrationLowByte;
uint8_t fullRangeHighByte, fullRangeLowByte;
uint8_t checkSum;
} Ze08Ch2OData_t;


uint16_t getZe08Ch2OMetric(const uint8_t _rxPin, const uint8_t _txPin) {
uint8_t headerDetected = false,
writePos = 0x00,
checkSum = 0x00;
uint16_t rc = WINSEN_ZE08_CH2O_READ_ERROR_CODE;
uint32_t readStartTime;;

Ze08Ch2OData_t Ze08Ch2OData;
uint8_t* ptrRawBuffer = (uint8_t*) &Ze08Ch2OData;

SoftwareSerial swSerial(_rxPin, _txPin);
swSerial.begin(WINSEN_ZE08_CH2O_UART_SPEED);
readStartTime = millis();
while ((sizeof(Ze08Ch2OData) > writePos) && (WINSEN_ZE08_CH2O_UART_DEFAULT_READ_TIMEOUT > millis() - readStartTime)) {
if (!swSerial.available()) {
continue;
}
ptrRawBuffer[writePos] = swSerial.read();
#if defined(DEBUG_ON)
//Serial.print("currentChar (# "); Serial.print(writePos); Serial.print(") => 0x"); Serial.println((byte) ptrRawBuffer[writePos], HEX);
#endif
if (!headerDetected) {
headerDetected = (WINSEN_ZE08_CH2O_UART_START_BYTE == ptrRawBuffer[0x00]);
} else {
writePos++;
}
}
// Reading is not finished sucessfully: not all bytes recieved or wrong Gas ID / Unit ID contained in the packet
if (writePos < sizeof(Ze08Ch2OData) ||
WINSEN_ZE08_CH2O_UART_GAS_NAME != Ze08Ch2OData.gasName ||
WINSEN_ZE08_CH2O_UART_GAS_UNIT != Ze08Ch2OData.gasUnit) {
goto finish;
}
// Calculate checksum.
//Start byte & recieved checksum is not taken in account. The first one is dropped in the read procedure and the second one just will skipped in calculation
for (uint8_t i = 0x00; i < sizeof(Ze08Ch2OData) - 1; i++) {
checkSum += ptrRawBuffer;
#if defined(DEBUG_ON)
Serial.print(" 0x"); Serial.print(ptrRawBuffer, HEX);
#endif
}
checkSum = (~checkSum) + 1;
#if defined(DEBUG_ON)
Serial.print("\nRecieved / calculated checksum: 0x");
Serial.print(Ze08Ch2OData.checkSum, HEX); Serial.print(" / 0x"); Serial.println(checkSum, HEX);
#endif
if (checkSum == Ze08Ch2OData.checkSum) {
#if defined(DEBUG_ON)
// rc = (Ze08Ch2OData.fullRangeHighByte << 0x08) + Ze08Ch2OData.fullRangeLowByte; Serial.print("Full range (ppb): "); Serial.println(rc);
#endif
rc = (Ze08Ch2OData.concentrationHighByte << 0x08) + Ze08Ch2OData.concentrationLowByte;
}

finish:
swSerial.~SoftwareSerial();
return rc;
}

void setup() {
Serial.begin(115200);
Serial.println("Winsen ZE08-CH2O sensor reading demo (UART, active mode)"); ;
}

void loop() {
delay(2000);
uint16_t ch2O = getZe08Ch2OMetric(WINSEN_ZE08_CH2O_UART_TX_PIN, WINSEN_ZE08_CH2O_UART_TX_PIN);
Serial.print("["); Serial.print(millis()); Serial.print("] CH2O: ");

if (WINSEN_ZE08_CH2O_READ_ERROR_CODE != ch2O) {
Serial.print(ch2O); Serial.print(" ppb, \t"); Serial.print(ch2O / 1000.0, 3); Serial.println(" ppm");
} else {
Serial.println("read error");
}
}

но собрать с ним блок я пока не могу
Последний раз редактировалось koroleves 14.08.2021{, 09:28}, всего редактировалось 2 раза.

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

помогите перенести код в пользовательский блок

#9

Сообщение aidar_i » 14.08.2021{, 09:23}

koroleves писал(а):
14.08.2021{, 08:44}
Да с оригинальным работает нормально
Со старым скетчем
ZE08-CH2O test_1.flp
(317.63 КБ) 35 скачиваний

koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30.04.2021{, 06:04}
Репутация: 0
Имя: егор

помогите перенести код в пользовательский блок

#10

Сообщение koroleves » 14.08.2021{, 09:59}

aidar_i писал(а):
14.08.2021{, 09:23}
koroleves писал(а):
14.08.2021{, 08:44}
Да с оригинальным работает нормально
ZE08-CH2O test_1.flp

ОТЛИЧНО, ЗАРАБОТАЛО - ВЫ ГЕНИЙ!!!!
НЕМЕНРЕННОЕ СПАСИБО ВСЕМ ЗА ПОМОЩЬ!!!

Anydy

помогите перенести код в пользовательский блок

#11

Сообщение Anydy » 14.08.2021{, 10:05}

koroleves, Ребята...код прячем или под спойлер или есть же специальная кнопка - код.....зачем эти портянки тут?
И капсом писать не совсем хорошая манера...

aidar_i
Полковник
Сообщения: 3122
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 675
Откуда: Уфа
Имя: Айдар
Контактная информация:

помогите перенести код в пользовательский блок

#12

Сообщение aidar_i » 14.08.2021{, 10:52}

koroleves писал(а):
14.08.2021{, 09:59}
ОТЛИЧНО, ЗАРАБОТАЛО - ВЫ ГЕНИЙ!!!!
НЕМЕНРЕННОЕ СПАСИБО ВСЕМ ЗА ПОМОЩЬ!!!
Anydy писал(а):
14.08.2021{, 10:05}
koroleves, Ребята...код прячем или под спойлер или есть же специальная кнопка - код.....зачем эти портянки тут?
И капсом писать не совсем хорошая манера...
Да, и чтобы благодарить, есть кнопка "палец вверх" и там можно писать комментарии..

Ответить

Вернуться в «Начинающим»