Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пт ноя 17, 2017 19:35:12

Ребята, добрый вечер, может кто окажет помощь в правке скетча, сам не могу врубиться (ни в зуб ногой!). Понравились одни из часиков( именно простой анимацией), слепил, все работает кроме измерения температуры, видно в скетче, что нет мат описания измерения, нашел в другом скетче, а как вставить...? что бы измерялась температура
Вложения
Moi_Czasy-1.txt
сам скетч
(118.92 KiB) Скачиваний: 220

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

Пт ноя 17, 2017 19:57:30

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

2. Как тут что то можно подправить ? :
СпойлерИзображение
2017-11-17_20-57-01.png
(154.91 KiB) Скачиваний: 56

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

Пт ноя 17, 2017 20:53:42

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

2. Как тут что то можно подправить ?

*nix- овые окончания строк, ничего вроде необычного. Код типично ардуинский, это да)

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

Пт ноя 17, 2017 20:56:10

Если можно температуру показывать, почему нет? (Ардуино НАНО+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) и ... получится скетч. Как то так.

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

Вс ноя 19, 2017 09:24:26

Так понимаю, грамотных много, а помочь...? :cry:

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

Вс ноя 19, 2017 10:26:14

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

У Вас в руках железо, так что пробуйте, вставляйте, меняйте, ... Появятся вопросы (именно вопросы, а не просьбы сделать всё за Вас) - обращайтесь, тут всегда помогут тем, кто делает сам и на чём-то конкретном затыкается.

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

Вс ноя 19, 2017 13:07:35

Спасибо, что не отказали, смог бы-не обращался. А что надо вставить и куда я и сам как-то допер, что-то не хочет только.

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

Чт ноя 23, 2017 03:46:54

Добрый день подскажите в С как нибудь можно в цикле по полям структуры пройтись? и проверить их скажем на больше меньше числа. А в 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;

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

Чт ноя 23, 2017 07:07:46

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

в цикле можно пройтись только по массиву

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

Чт ноя 23, 2017 08:16:46

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;
}
, но это, опять же, только если все элементы структуры одного размера.

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

Чт ноя 23, 2017 08:52:54

WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.

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

Чт ноя 23, 2017 08:58:13

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

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

Чт ноя 23, 2017 14:07:30

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

не надо так делать :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){
      .....
   }
}

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

Пт ноя 24, 2017 06:33:24

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;
}

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

Пт ноя 24, 2017 07:36:52

pokk писал(а):да я сделал похоже, но в лоб
как с моей точки зрения, так вы сделали плохо, я бы даже сказал недопустимо, если бы мне не было все равно :))) кто вам помешал сделать нормально?
Код:
typedef enum{
   STATUS_OK,
   STATUS_FAIL,
   STATUS_ALARM
}status_t;

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

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

Пт ноя 24, 2017 11:49:15

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);

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

Пт ноя 24, 2017 12:01:13

я конечно, не профессиональный программист, и всех тонкостей не знаю... но вот это меня удивило:
Код:
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;
}
как обычно все и делают...

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

Пт ноя 24, 2017 12:39:45

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

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

Пт ноя 24, 2017 14:23:34

как обычно все и делают

для единичных статусов да, а для множественных - таки обычно маски.

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

Пт ноя 24, 2017 16:00:03

WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.

Не знаю, берет ли компилятор, но можно ему задать выравнивание перед объявлением структуры:
Код:
#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 байт обращаемся как к массиву. Даже если будут разные типы, мы же знаем их
размер, но будет чуть сложнее.
Ответить