Новичок. Вопросы и помощь.

Lin-air
Offline
Зарегистрирован: 22.02.2018

Я совершенно НЕ прошу сделать это мне. Я прошу помочь понять с чего начать и хотя бы исходя из плана ткнуть пальцем на железки которые необходимо заказать. Если б я знал какие здесь все недосягаемые высшие умы и не сунулся бы.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Lin-air пишет:

Я совершенно НЕ прошу сделать это мне. Я прошу помочь понять с чего начать и хотя бы исходя из плана ткнуть пальцем на железки которые необходимо заказать. Если б я знал какие здесь все недосягаемые высшие умы и не сунулся бы.

Железок полно на али, есть готовые метеостанции с блэкджеком и..., т.е. с флюгерами и анемометрами и прочими датчиками, которые выдают инфу по RS-485. Стоят не так дорого - в пределах десятки, зато никакого геморроя и секаса.

Может, оно вам не надо, и проще готовое купить? ;) Вот такое, например: https://ru.aliexpress.com/item/RS485-10/32844407554.html?spm=a2g0v.10010108.1000014.23.75745e4doFSntV&traffic_analysisId=recommend_3035_null_null_null&scm=1007.13338.80878.000000000000000&pvid=1171e2fa-c8e2-43c1-ae4d-2bc62d48ed14&tpp=1

Алексей Н
Offline
Зарегистрирован: 02.01.2016

DIYMan пишет:

Lin-air пишет:

Я прошу помочь понять с чего начать и хотя бы исходя из плана ткнуть пальцем на железки которые необходимо заказать.

 Может, оно вам не надо, и проще готовое купить? ;)

А я поддержу. Вы потратите кучу времени, чтобы разобраться с программированием и электроникой. И по деньгам Вы вряд ли много выиграете, если будете покупать отдельные детали. ИМХО на ардуине стоит что-то делать, только в двух случаях: если готового девайса не существует в природе, и если он существует, но стоит непомерно дорого.

Метеостанция, которуую Вы хотите достаточно сложная. Это совсем не то, что Вы показали на первой картинке, где есть только датчики температуры и давления. Анемометр, флюгер, датчик освещенности это стоит денег и потребует достаточно продвинутых знаний в программировании. Передача данных по WiFi отдельная тема, отдельные модули и отдельный геморрой. В общем, я бы тоже купил готовый прибор.

Но если очень хочется самому сделать подобную метеостанцию, вперед. Начните с того, что Ваша метеостанция должна делать. Что-то типа техзадания. Отсюда можно будет уже и прикидывать какие железки покупать и как их соединять друг с другом.

Lin-air
Offline
Зарегистрирован: 22.02.2018

Спасибо за ваш ответ!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Алексей Н пишет:

ИМХО на ардуине стоит что-то делать, только в двух случаях: если готового девайса не существует в природе, и если он существует, но стоит непомерно дорого.

Я бы сказал несколько иначе: на ардуине стоит что-то делать, только в двух случаях: если готового девайса не существует в природе, или если сам процесс изготовления приносит удовольствие*.

Потому как hand made не может стоить дешевле, чем серийное производство. Либо по сумме самоделка окажется дороже промышленного образца, либо вся экономия выйдет за счет качества.

 

* Примечание: а за удовольствие, как известнео, нужно платить.

croan
Offline
Зарегистрирован: 21.02.2018

здравствуйте. пытаюсь разобраться с элементарным - указатели и ссылки.

просмотрел несколько уроков по с++ , почитал литературу - вроде все понятно.

решил вывести адрес ссылки переменной в монитор порта. в с++ все просто и работает, на в ардуино компилятор не хочет компилировать скетч.

#include <SoftwareSerial.h>
void setup() {
   Serial.begin(9600); 

int a = 10;
Serial.println(&a);

}

или я что-то упустил или чего - то не понимаю. указанный ниже код работает.

#include <SoftwareSerial.h>
void setup() {
   Serial.begin(9600); 

int a = 10;
int *x = &a;
Serial.println(*x);

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тип надо преобразовывать

6 Serial.println(uint16_t(&a));

выведется адрес переменной а

croan
Offline
Зарегистрирован: 21.02.2018

DetSimen пишет:

Тип надо преобразовывать

6 Serial.println(uint16_t(&a));

выведется адрес переменной а

еще больше запутался)

в уроках на с++ выводилось значение в формате 0х00000000,  здесь же выводится число 2298. как так ? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тогда надо выводить с форматированием. Через функцию sprintf, формат %4X

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

C++ на компе и на дуне слегка отличаются. 

croan
Offline
Зарегистрирован: 21.02.2018

спасибо! буду дальше разбираться)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

char buf[7];

sprintf(buf, "0x%4X",uint16_t(&a));

Serial.printf(buf);

croan
Offline
Зарегистрирован: 21.02.2018

DetSimen пишет:

char buf[7];

sprintf(buf, "0x%4X",uint16_t(&a));

Serial.printf(buf); //ошибка println должно быть ?

кажется у вас ошибка ?

int a = 10;

char buf[3];

sprintf(buf, "0x%08X",uint32_t(&a));

Serial.println(buf);

иными словами мы получаем некоторое число (являющееся адресом) uint32_t(&a), приводим его к шеснадцатиричному виду 0х%08х, кидаем полученное значение в переменную buf и выводим. 

а теперь вопрос: почему при изменении buf[3] на buf['s'] и a = 10 на a = 11 адрес остается одинаковым? неужели автоматически компилятор заносит эти числа постоянно на один и тот же адрес ?

0x000008FA
 
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

да, у меня ошибка, должно быть 

Serial.println(buf); 

в ардуине указатели занимают 2 байта, uint32_t избыточен, соотвецтвенно надо 

sprintf(buf, "0x%04X",uint16_t(&a));

и не забывать, что buf[] хранит результирующую строку длиной как минимум 6 символов, поэтому памяти под нее надо отвести достаточно. 6+завершающий ноль = 7 символов.  Что и было написано 

char buf[7];

 

Я пердуперждал, реализация C++ в Дуне отличается от Visual Studio.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

croan пишет:

а теперь вопрос: почему при изменении buf[3] на buf['s'] и a = 10 на a = 11 адрес остается одинаковым? неужели автоматически компилятор заносит эти числа постоянно на один и тот же адрес ?

 
и a и buf являются локальными переменными, их адрес может быть каким угодно, но одинаковым в одних и тех же условиях.  Поменяй местами определение buf и a и убедись, что адрес а тоже изменился. 
sadman41
Offline
Зарегистрирован: 19.10.2016

snprintf() - чтобы буфер не порвало.