Вопросы по С/С++ (СИ)
Re: Ардуино часы
Ребята, добрый вечер, может кто окажет помощь в правке скетча, сам не могу врубиться (ни в зуб ногой!). Понравились одни из часиков( именно простой анимацией), слепил, все работает кроме измерения температуры, видно в скетче, что нет мат описания измерения, нашел в другом скетче, а как вставить...? что бы измерялась температура
- Вложения
-
- Moi_Czasy-1.txt
- сам скетч
- (118.92 КБ) 252 скачивания
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
1. Зачем в часах температура ?
На сколько мне известно, часы показывают время
2. Как тут что то можно подправить ? :
На сколько мне известно, часы показывают время
2. Как тут что то можно подправить ? :
Спойлер
Re: Вопросы по С/С++ (СИ)
что и откуда вставить?
чем вы собрались температуру мерять и когда показывать?
телепатов нет, пишите подробно.
[uquote="Аlex",url="/forum/viewtopic.php?p=3235657#p3235657"]2. Как тут что то можно подправить ?[/uquote]
*nix- овые окончания строк, ничего вроде необычного. Код типично ардуинский, это да)
чем вы собрались температуру мерять и когда показывать?
телепатов нет, пишите подробно.
[uquote="Аlex",url="/forum/viewtopic.php?p=3235657#p3235657"]2. Как тут что то можно подправить ?[/uquote]
*nix- овые окончания строк, ничего вроде необычного. Код типично ардуинский, это да)
Re: Вопросы по С/С++ (СИ)
Если можно температуру показывать, почему нет? (Ардуино НАНО+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.
+ 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.
+ 32.0)); // выводим показание 1 датчика в фаренгейтах
delay(1000); // ждем 1 секунду
}(, и ее надо вставить в скетч.С расширением ino. файл не передать, изменить расширение(txt-ino) и ... получится скетч. Как то так.
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.
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.
delay(1000); // ждем 1 секунду
}(, и ее надо вставить в скетч.С расширением ino. файл не передать, изменить расширение(txt-ino) и ... получится скетч. Как то так.
Re: Вопросы по С/С++ (СИ)
Так понимаю, грамотных много, а помочь...? 
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А самому попробовать ? Нужно же всего-лишь "её вставить в сетч".
Вставить то мы тоже сможем, но что получится после этого ? Как проверять ? Как отлаживать, если что-то не заработает ?
У Вас в руках железо, так что пробуйте, вставляйте, меняйте, ... Появятся вопросы (именно вопросы, а не просьбы сделать всё за Вас) - обращайтесь, тут всегда помогут тем, кто делает сам и на чём-то конкретном затыкается.
Вставить то мы тоже сможем, но что получится после этого ? Как проверять ? Как отлаживать, если что-то не заработает ?
У Вас в руках железо, так что пробуйте, вставляйте, меняйте, ... Появятся вопросы (именно вопросы, а не просьбы сделать всё за Вас) - обращайтесь, тут всегда помогут тем, кто делает сам и на чём-то конкретном затыкается.
Re: Вопросы по С/С++ (СИ)
Спасибо, что не отказали, смог бы-не обращался. А что надо вставить и куда я и сам как-то допер, что-то не хочет только.
Re: Вопросы по С/С++ (СИ)
Добрый день подскажите в С как нибудь можно в цикле по полям структуры пройтись? и проверить их скажем на больше меньше числа. А в C ++ ?
Допустим как-то так, и надо выявить какая именно авария произошла.
Или перекопировать из одной переменной Type_error в другую с таким же типом , только несколько полей скажем все кроме одного.
Допустим как-то так, и надо выявить какая именно авария произошла.
Код: Выделить всё
typedef struct{
uint8_t error1;
uint8_t error2;
uint8_t error3;
uint8_t error4;
}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: Вопросы по С/С++ (СИ)
нельзяpokk писал(а):в С как нибудь можно в цикле по полям структуры пройтись?
вот так и делатьpokk писал(а):// Вот это как сделать по феншую ?
в цикле можно пройтись только по массиву
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
pokk:
Если все поля одного типа, как у Вас в примере, можно для такого дела завести:Тогда можно и по полям обращаться, как раньше, и по индексам массива.
В принципе, можно и как в оригинале было, без union:, но это, опять же, только если все элементы структуры одного размера.
Если все поля одного типа, как у Вас в примере, можно для такого дела завести:
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
ну и зачем вам эти грабли? ну нельзя в Си перебирать поля структуры в цикле... смиритесь. все костыли вам боком выйдут.pokk писал(а):фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
на всякий случай, не касаясь собственно структур
[uquote="pokk",url="/forum/viewtopic.php?p=3240362#p3240362"]Допустим как-то так, и надо выявить какая именно авария произошла.[/uquote]
не надо так делать
если нужно регистрировать множество различных и возможно одновременных ошибок, удобнее битовые маски
[uquote="pokk",url="/forum/viewtopic.php?p=3240362#p3240362"]Допустим как-то так, и надо выявить какая именно авария произошла.[/uquote]
не надо так делать
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
как с моей точки зрения, так вы сделали плохо, я бы даже сказал недопустимо, если бы мне не было все равноpokk писал(а):да я сделал похоже, но в лоб
Код: Выделить всё
typedef enum{
STATUS_OK,
STATUS_FAIL,
STATUS_ALARM
}status_t;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
я конечно, не профессиональный программист, и всех тонкостей не знаю... но вот это меня удивило:это вот что должно означать? на месте компилятора я бы эту функцию выкинул, как бессмыленно-бесполезную. для обработки состояния лично я бы написал так:как обычно все и делают...
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
Ну да, я обычно так и делаю все на case, это я так в блокноте накидал для примера, но в любом случае, кучу проверок дальше это не отменяет, что бы перепроверить все эти переменные, для зажигании лампочки авария.
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3241502#p3241502"]как обычно все и делают[/uquote]
для единичных статусов да, а для множественных - таки обычно маски.
для единичных статусов да, а для множественных - таки обычно маски.
Re: Вопросы по С/С++ (СИ)
[uquote="pokk",url="/forum/viewtopic.php?p=3240450#p3240450"]WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.[/uquote]
Не знаю, берет ли компилятор, но можно ему задать выравнивание перед объявлением структуры:
Если GCC, то можно попробовать так:
И дальше, зная что каждое поле занимает 1 байт обращаемся как к массиву. Даже если будут разные типы, мы же знаем их
размер, но будет чуть сложнее.
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.[/uquote]
Не знаю, берет ли компилятор, но можно ему задать выравнивание перед объявлением структуры:
Код: Выделить всё
#pragma pack(push, 1)
struct {
uint8_t error1;
uint8_t error2;
uint8_t error3;
uint8_t error4;
};
#pragma pack(pop)
Код: Выделить всё
struct {
uint8_t error1;
uint8_t error2;
uint8_t error3;
uint8_t error4;
} __attribute__ ((__packed__));
размер, но будет чуть сложнее.


