Создание класса
- Войдите на сайт для отправки комментариев
Добрый день товарищи, может кто подскажет мне решение моей проблемы, ну или хотя бы наведет на путь истинный)
в общем появилась задача получить давление с датчика, использую внешний АЦП, захотел разделить все свое мракобесие по классам, что бы порядок в коде был более или менее, ну и к тому же проще создавать объекты датчиков( у каждого свои поля, и методы), но в итоге наткнулся на грабли с этим самым внешним АЦП. надо его инициализировать в основном файле скетча, а если мне нужно его методы заиспользовать в классе который я создаю, как быть то тогда? Надеюсь объяснил более менее доступно, я начинающий, поэтому некоторые моменты мне тяжело даются, но я стараюсь)
Код класса который я хочу написать
#pragma once #include <Arduino.h> #include <Adafruit_ADS1X15.h> class PressureSensor { public: PressureSensor(Adafruit_ADS1115 ads, uint8_t sensorPin, int16_t sensorMaxRange); float getPressureInPsi(); float getPressureInBar(); private: uint8_t _sensorPin; int16_t _sensorMaxRange; // PSI uint16_t _sensorAtmosphereADC; Adafruit_ADS1115 &_ads; void colibrationSensors(); uint16_t getADCPressure(); }; PressureSensor::PressureSensor(Adafruit_ADS1115 ads, uint8_t sensorPin, int16_t sensorMaxRangeInPSI) { _sensorPin = sensorPin; _sensorMaxRange = sensorMaxRangeInPSI; _ads = ads; colibrationSensors(); } uint16_t PressureSensor::getADCPressure() { uint8_t numSamples = 10; // количество образцов для массива uint16_t arrSensorSamples[numSamples]; // создаем массив хранения значений АЦП uint16_t ResultADC = 0; // переменная значений АЦП датчика низкого давления /*заполяем массив данных АЦП*/ for (uint8_t i = 0; i < numSamples; i++) //счетчик заполнения массива АЦП { arrSensorSamples[i] = _ads.readADC_SingleEnded(_sensorPin); //считывание данных АЦП } /*находим среднее значение в массиве*/ for (uint8_t i = 0; i < numSamples; i++) //счетчик суммирования значений массива АЦП { ResultADC += arrSensorSamples[i]; // суммирование значений массива } ResultADC /= numSamples; // выводим среднее значение массива АЦП датчика низкого давления return ResultADC; } void PressureSensor::colibrationSensors() { _sensorAtmosphereADC = getADCPressure(); } float PressureSensor::getPressureInPsi() { float pressure = (float)((int16_t)(getADCPressure() - _sensorAtmosphereADC)) * _sensorMaxRange / (24000 - _sensorAtmosphereADC); // 24000 ADC == 4,5V max range of sensor return pressure; } float PressureSensor::getPressureInBar() { return 0.06895 * getPressureInPsi(); }
Основной класс программы
А почему нельзя а) инициализировать объект ads в классе (у вас вроде так и есть)? б) передать объект в класс по указателю?
этот код, который я предоставил, не работает, точнее он компилируется, заливается, но ничего не происходит.
а если мне нужно его методы заиспользовать в классе который я создаю, как быть то тогда?
Тогда используй методы в классе.
Я дико извиняюсь, но я слегка не понимаю о чем вы сейчас, могли бы хотя бы как то намекнуть это написав кусочек того, о чем думаете в виде кода)
этот код, который я предоставил, не работает, точнее он компилируется, заливается, но ничего не происходит.
Этот и не должен работать. Начиная с конструктора
б) передать объект в класс по указателю
я хотел попробовать что то подобное, я просто изучаю Java, и побочно пытаюсь воевать с ардуино, в Java с этим как то попроще, в С++ и указатели и ссылки... хз что ) ну в общем постараюсь сейчас что-нибудь вычитать в инете, мало ли получится, спасибо за совет
Путь а: https://ravesli.com/urok-117-spisok-initsializatsii-chlenov-klassa/#toc-3
Путь б: https://ravesli.com/urok-90-operator-dostupa-k-chlenam-cherez-ukazatel/
А что код основной программы нормально вставить не судьба? Вставлялка поломалась? Или таки вставите? Сделайте уж милость! А то ни к себе скопировать, ни на номер строки сослаться.
На то, что Вы пишете я могу ответить так
Но Вы же не этого ждёте.
Вставьте правильно код и попытайтесь внятно сформулировать свою проблему.
И проблему объясните, а то я реально не понимаю в чём она.
А! догадался. Вы в восьмой строке & пропустили между Adafruit_ADS1115 и ads
Как вставите, не забудьте и про 21-ую - они с восьмой в связке - должно быть одинаково.
Извиняюсь за то что заставил Вас нервничать своим разгильдяйством)) код вроде исправил
в общем проблема такая, постараюсь объяснить как могу
у меня есть два датчика давления, 0.5...4.5 в, один -1...185 PSI, второй 0...500 PSI
для более точного измерения давления, приобрел внешний ацп ads1115, так как встроенного в ардуино не хватало.
скачал библиотеку AdaFruit_ADS1x15.h и написал все в процедурном стиле, все работает, показания снимаются.
Задумался о том, чтобы написать что-то на подобии библиотеки для своих датчиков, где все необходимые для работы поля будут храниться внутри класса, ну а я в создав два объекта этого класса в основном файле программы(где функция setup(), и loop()) буду использовать только пару методов для получения давления в PSI и в Bar, выводить на дислей.
Так вот, столкнулся я с такой проблемой, что в методе
необходимо использовать метод объекта класса AdaFruit_ADS1x15, он же _ads.readADC_SingleEnded(_sensorPin)
так вот, создав объект AdaFruit_ADS1115 _ads; внутри своего класса Class PressureSensor не могу получать показания по понятным причинам, потому что внешний ацп имеет еще два метода для инициализации
вопрос заключается в следующем, как лучше поступить? создать объект внутри моего класса, так не прокатило, я даже создавал отдельный метод для инициализации
и далее его вставлял в метод setup(); в основном классе, ничего не помогло.
дали совет передать ссылку, но я пока немного не пойму как это правильно описать в коде, постараюсь вычитать, разобраться, если конечно получится.
Надеюсь сейчас объяснил более или менее, стараюсь как могу, я не программист, и заранее прошу прощения за некомпетентность
так должно быть?
так должно быть?
Простите, Вы программист и просто троллите нас?
Другим я не могу объяснить Вашего поведения.
В строке №15 кода из первого поста было правильно написано
Adafruit_ADS1115 &_ads;
а что написано в строке №17 этого кода? Я Вам подсказал куда нужно добавить амперсанд, Вы добавили а оттуда, где он был - убрали? Зачем? У Вас дефицит амперсандов? Или троллите?
Другое дело, что так оно не будет компилироваться, Вам нужно
ИЛИ инициализировать ссылку прямо в объявлении конструктора через двоеточие (как подсказал коллега чуть выше)
ИЛИ отказаться от ссылки и использовать указатель.
Да не троллю я вас, уже пихал я амперсанты уже во все места)) и все равно ничего не работает)
ну вот по вашему я так понимаю должно получится, и ничего не работает, я уже и добавлял их и убирал, и что то не срастается.
и я же говорю, я не программист, изучаю Java, он похож на c++, но далеко не во всем, так что не ругайтесь.
и я же говорю, я не программист, изучаю Java, он похож на c++, но далеко не во всем, так что не ругайтесь.
вы этим заявлением что хотите вызвать, сочувствие?
Как можно относится к человеку, который пытается создавать классы С++, изучая Яву? По-моему это просто издевательство над здраым смыслом.
Если уж полезли в улучшательство, переписывая работающий процедурный код на классы (зачем?) - то хотя бы почитайте книжки, как это делать правильно, а не суйте "амперсанды во все места"
Всем спасибо, буду разбираться дальше
За это исправление спасибо, попробовал, все работает, правда не совсем понял как))
Всем спасибо, буду разбираться дальше
разбирайтесь. Код в #17 опять неправильный. Внимательно читайте ответ Евгения в #16 - там изложено два варианта решения.
Ну амперсанд & и звездочку * люди иногда путают, особенно если они выполняют не математические действия.
Ну амперсанд & и звездочку * люди иногда путают, особенно если
...особенно когда не понимают, что они означают...
Ну амперсанд & и звездочку * люди иногда путают, особенно если
...особенно когда не понимают, что они означают...
Уважаемые ЕвгенийП и rkit, спасибо вам огромное за то что направили, и извиняюсь если вдруг заставил вас позлиться)) все вчера поправил, как вы сказали, и все заработало, убрал из конструктора функцию colibration(); вынес ее в setup(); чтобы колибровка датчиков происходила после инициализации модуля АЦП, в ином случае все зависало, поэтому я и не сразу понял в чем дело.
Всем остальным, кто тут вставил свои 5 копеек абы что то сказать, желаю вам обмочиться на людях;)
Всем остальным, кто тут вставил свои 5 копеек абы что то сказать, желаю вам обмочиться на людях;)
Пойду людей искать.
Вам тоже спасибо, я выше вам оставлял благодарность за ваше исправление в моем коде.
"За это исправление спасибо, попробовал, все работает, правда не совсем понял как))"
этот комментарий был для Вас, просто как то не сослался
Всем остальным, кто тут вставил свои 5 копеек абы что то сказать, желаю вам обмочиться на людях;)
ну раз приглашаешь...
"колибровка" - это что-то про маленьких птичек, как бишь их... колибри?
исправил, на "А", дабы вы не нервничали
кАлибровка*
calibration();
тока тип ResultADC смени на uint32_t, иначе на больших значениях работать будет непраильна
Да да ,я поменял, понял что там переполнение будет
https://ravesli.com/urok-190-ssylki-r-value/
Путь а: https://ravesli.com/urok-117-spisok-initsializatsii-chlenov-klassa/#toc-3
Путь б: https://ravesli.com/urok-90-operator-dostupa-k-chlenam-cherez-ukazatel/
Большое спасибо! )