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

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

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

Сообщение koroleves »

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

#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
Лейтенант
Сообщения: 576
Зарегистрирован: 19 дек 2016, 20:07
Откуда: Днепропетровск
Имя: Алексей
Поблагодарили: 1 раз

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

Сообщение RedSky »

Как будет происходить опрос? По uart или аналоговому?
Вот блок с опросом по uart, нужно испытывать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

Блок в проекте.
Опрос по uart или по аналоговому входу выбирается параметром.
CH2O sensor.flp
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64. FLProg Portable.
Изображение
koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30 апр 2021, 06:04
Имя: егор

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

Сообщение koroleves »

RedSky писал(а): 11 авг 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 авг 2021, 22:53 RedSky » Вчера{, 22:53}
Как будет происходить опрос? По uart или аналоговому?
Вот блок с опросом по uart, нужно испытывать.

Спасибо огромное за помощь на основании вашего блока модифицировал свой - но по сравнению с исходным кодом значения не меняются((
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

koroleves писал(а): 12 авг 2021, 22:03 модифицировал свой
Поправил, проверяйте.
ZE08-CH2O test.flp
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64. FLProg Portable.
Изображение
koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30 апр 2021, 06:04
Имя: егор

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

Сообщение koroleves »

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

Отправлено спустя 5 часов 24 минуты 43 секунды:
похоже это проблема с самим датчиком, блок нормальный
У вас нет необходимых прав для просмотра вложений в этом сообщении.
aidar_i
Полковник
Сообщения: 3360
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

С оригинальным скетчем работает нормально?
koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30 апр 2021, 06:04
Имя: егор

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

Сообщение koroleves »

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

правильно работает вот этот скетч 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 авг 2021, 09:28, всего редактировалось 2 раза.
aidar_i
Полковник
Сообщения: 3360
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

koroleves писал(а): 14 авг 2021, 08:44 Да с оригинальным работает нормально
Со старым скетчем
ZE08-CH2O test_1.flp
У вас нет необходимых прав для просмотра вложений в этом сообщении.
koroleves
Рядовой
Сообщения: 26
Зарегистрирован: 30 апр 2021, 06:04
Имя: егор

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

Сообщение koroleves »

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

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

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

Сообщение Anydy »

[ref]koroleves[/ref], Ребята...код прячем или под спойлер или есть же специальная кнопка - код.....зачем эти портянки тут?
И капсом писать не совсем хорошая манера...
aidar_i
Полковник
Сообщения: 3360
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей