Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
victors60
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Ср сен 20, 2017 16:02:20

Re: Ардуино часы

Сообщение victors60 »

Ребята, добрый вечер, может кто окажет помощь в правке скетча, сам не могу врубиться (ни в зуб ногой!). Понравились одни из часиков( именно простой анимацией), слепил, все работает кроме измерения температуры, видно в скетче, что нет мат описания измерения, нашел в другом скетче, а как вставить...? что бы измерялась температура
Вложения
Moi_Czasy-1.txt
сам скетч
(118.92 КБ) 252 скачивания
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

1. Зачем в часах температура ? :o
На сколько мне известно, часы показывают время :dont_know:

2. Как тут что то можно подправить ? :
СпойлерИзображение
2017-11-17_20-57-01.png
(154.91 КБ) 82 скачивания
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

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

[uquote="Аlex",url="/forum/viewtopic.php?p=3235657#p3235657"]2. Как тут что то можно подправить ?[/uquote]
*nix- овые окончания строк, ничего вроде необычного. Код типично ардуинский, это да)
victors60
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Ср сен 20, 2017 16:02:20

Re: Вопросы по С/С++ (СИ)

Сообщение victors60 »

Если можно температуру показывать, почему нет? (Ардуино НАНО+MAX7219)Температура измеряется термистором на А0. Есть библиотечка "math.h" , я ее нашел#include <math.h> // библиотека для выполнения простых математических операций

double Thermister(int RawADC) {
double Temp;
Temp = log(((10240000/RawADC) - 10000));
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15; // Kelvin to Celcius
//Temp = (Temp * 9.0)/ 5.0 + 32.0; // 1 способ Convert Celcius to Fahrenheit
//Temp = (Temp * 1.8) + 32.0; // 2 способ Convert Celcius to Fahrenheit
return Temp;
}

void setup() {
Serial.begin(9600); // открывает последовательный порт, на скорости 9600 бит/c
}

void loop() {
Serial.print("Sensor_1: ");
Serial.println(float(Thermister(analogRead(0))), 1); // выводим показание 1 датчика
//Serial.print("Sensor_2: ");
//Serial.println(float(Thermister(analogRead(1))), 1); // выводим показание 2 датчика
//Serial.println(int(Thermister((analogRead(0))* 1.8) + 32.0)); // выводим показание 1 датчика в фаренгейтах
delay(1000); // ждем 1 секунду
}(, и ее надо вставить в скетч.С расширением ino. файл не передать, изменить расширение(txt-ino) и ... получится скетч. Как то так.
Реклама
Эиком - электронные компоненты и радиодетали
victors60
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Ср сен 20, 2017 16:02:20

Re: Вопросы по С/С++ (СИ)

Сообщение victors60 »

Так понимаю, грамотных много, а помочь...? :cry:
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

А самому попробовать ? Нужно же всего-лишь "её вставить в сетч".
Вставить то мы тоже сможем, но что получится после этого ? Как проверять ? Как отлаживать, если что-то не заработает ?

У Вас в руках железо, так что пробуйте, вставляйте, меняйте, ... Появятся вопросы (именно вопросы, а не просьбы сделать всё за Вас) - обращайтесь, тут всегда помогут тем, кто делает сам и на чём-то конкретном затыкается.
Реклама
victors60
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Ср сен 20, 2017 16:02:20

Re: Вопросы по С/С++ (СИ)

Сообщение victors60 »

Спасибо, что не отказали, смог бы-не обращался. А что надо вставить и куда я и сам как-то допер, что-то не хочет только.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

Добрый день подскажите в С как нибудь можно в цикле по полям структуры пройтись? и проверить их скажем на больше меньше числа. А в C ++ ?

Допустим как-то так, и надо выявить какая именно авария произошла.

Код: Выделить всё

typedef struct{
	uint8_t error1;
	uint8_t error2;
	uint8_t error3;
	uint8_t error4;
}Type_error;
Или перекопировать из одной переменной Type_error в другую с таким же типом , только несколько полей скажем все кроме одного.

Код: Выделить всё

Type_error  Err1;
Type_error  Err2;
Err1.error1=Err2.error1;  // Вот это как сделать по феншую ?
Err1.error2=Err2.error2;
Err1.error3=Err2.error3;
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

pokk писал(а):в С как нибудь можно в цикле по полям структуры пройтись?
нельзя
pokk писал(а):// Вот это как сделать по феншую ?
вот так и делать

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

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

pokk:
Если все поля одного типа, как у Вас в примере, можно для такого дела завести:

Код: Выделить всё

typedef union {
  struct {
    uint8_t error1;
    uint8_t error2;
    uint8_t error3;
    uint8_t error4;
  };
  uint8_t error[4];
} Type_error;
...
Type_error te;
for (uint8_t i = 0; i < sizeof(Type_error); i++) {
  te.error[i] = 3;
}
Тогда можно и по полям обращаться, как раньше, и по индексам массива.

В принципе, можно и как в оригинале было, без union:

Код: Выделить всё

struct {
  uint8_t error1;
  uint8_t error2;
  uint8_t error3;
  uint8_t error4;
} Type_error ;
...
Type_error te;
for (uint8_t i = 0; i < sizeof(Type_error); i++) {
  *(uint8_t*)(&te + i) = 3;
}
, но это, опять же, только если все элементы структуры одного размера.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

pokk писал(а):фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать
ну и зачем вам эти грабли? ну нельзя в Си перебирать поля структуры в цикле... смиритесь. все костыли вам боком выйдут.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

на всякий случай, не касаясь собственно структур
[uquote="pokk",url="/forum/viewtopic.php?p=3240362#p3240362"]Допустим как-то так, и надо выявить какая именно авария произошла.[/uquote]
не надо так делать :dont_know: если нужно регистрировать множество различных и возможно одновременных ошибок, удобнее битовые маски

Код: Выделить всё

uint32_t errors;

typedef enum {
   ERR_FOO = (uint32_t) 0x000001,
   ERR_BAR = (uint32_t) 0x000002,
   ERR_AAAAAAAAA = (uint32_t) 0x000004,
   ERR_ZOMBIEAPOCALYPSE = (uint32_t) 0x000008
} error_event_t;

....
errors = 0;
....
errors |= ERR_FOO;
....
if(errors){
   if(errors & ERR_FOO){
      .....
   }
}
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

arkhnchul, да я сделал похоже, но в лоб(про умножение на 2), некоторые флаги достигают трех состояний.

Код: Выделить всё

//==========================
/*
	* @Описание:	Устанавливаем статусные биты(норма,предупреждение,авария).
	* @Параметр:
	* @Возврат:		Нету
*/
void SetStatus(uint8_t data,uint32_t Var){
	MatchVall.StatusAll&=(~(3<<Var*2));		//очистить место под установку битов(стереть предыдушее значение)
	MatchVall.StatusAll|= (data<<(Var*2));
}
//==========================
/*
	* @Описание:	Функция возврашает статус запрашиваемого параметра.
	* @Параметр:
	* @Возврат:		Нету
*/
uint8_t GetStatus(uint32_t Var){
uint32_t temp;
	temp=MatchVall.StatusAll&(3<<Var*2);
	temp=temp>>(Var*2);
	return temp;
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

pokk писал(а):да я сделал похоже, но в лоб
как с моей точки зрения, так вы сделали плохо, я бы даже сказал недопустимо, если бы мне не было все равно :))) кто вам помешал сделать нормально?

Код: Выделить всё

typedef enum{
   STATUS_OK,
   STATUS_FAIL,
   STATUS_ALARM
}status_t;
и затем в структуре объявить поле этого типа, в функциях сравнивать значение этого поля с константами, задавать константами его значение и т.п.? ну то есть как обычно все делают?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

ARV, имеете ввиду как-то так ?Да выглядит красивее, но мне дальше надо было проверять, какой либо из параметров в аварии, и не охото было условий 6-7 ставить.

Код: Выделить всё

typedef enum{
   STATUS_OK,
   STATUS_FAIL,
   STATUS_ALARM
}status_t;

typedef struct{
	status_t T;
	status_t AC;
	status_t Erorr3;
	status_t Erorr4;
}T_error_t;
T_error_t Error;

void SetStatus123(status_t data,status_t Var){
	if(data==STATUS_OK){Var=STATUS_OK;}
	if(data==STATUS_FAIL){Var=STATUS_OK;}
	if(data==STATUS_ALARM){Var=STATUS_OK;}
}

SetStatus123(STATUS_ALARM,Error.AC);
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

я конечно, не профессиональный программист, и всех тонкостей не знаю... но вот это меня удивило:

Код: Выделить всё

void SetStatus123(status_t data,status_t Var){
   if(data==STATUS_OK){Var=STATUS_OK;}
   if(data==STATUS_FAIL){Var=STATUS_OK;}
   if(data==STATUS_ALARM){Var=STATUS_OK;}
}
это вот что должно означать? на месте компилятора я бы эту функцию выкинул, как бессмыленно-бесполезную. для обработки состояния лично я бы написал так:

Код: Выделить всё

status_t status;
...
switch(status){
case STATUS_OK:
   ...
   break;
case STATUS_FAIL:
   ...
   break;
case STATUS_ALARM:
   ...
   break;
}
как обычно все и делают...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

Ну да, я обычно так и делаю все на case, это я так в блокноте накидал для примера, но в любом случае, кучу проверок дальше это не отменяет, что бы перепроверить все эти переменные, для зажигании лампочки авария.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

[uquote="ARV",url="/forum/viewtopic.php?p=3241502#p3241502"]как обычно все и делают[/uquote]
для единичных статусов да, а для множественных - таки обычно маски.
Аватара пользователя
Zat
Встал на лапы
Сообщения: 119
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Откуда: С-Пб

Re: Вопросы по С/С++ (СИ)

Сообщение Zat »

[uquote="pokk",url="/forum/viewtopic.php?p=3240450#p3240450"]WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.[/uquote]
Не знаю, берет ли компилятор, но можно ему задать выравнивание перед объявлением структуры:

Код: Выделить всё

#pragma pack(push, 1)
  struct {
    uint8_t error1;
    uint8_t error2;
    uint8_t error3;
    uint8_t error4;
  };
#pragma pack(pop)
Если GCC, то можно попробовать так:

Код: Выделить всё

  struct {
    uint8_t error1;
    uint8_t error2;
    uint8_t error3;
    uint8_t error4;
  } __attribute__ ((__packed__));
И дальше, зная что каждое поле занимает 1 байт обращаемся как к массиву. Даже если будут разные типы, мы же знаем их
размер, но будет чуть сложнее.
Ответить

Вернуться в «Разные вопросы по МК»