- Вложения
-
- Moi_Czasy-1.txt
- сам скетч
- (118.92 КБ) 253 скачивания
Вопросы по С/С++ (СИ)
- Сообщения: 31
- Зарегистрирован: Ср сен 20, 2017 16:02:20
Ребята, добрый вечер, может кто окажет помощь в правке скетча, сам не могу врубиться (ни в зуб ногой!). Понравились одни из часиков( именно простой анимацией), слепил, все работает кроме измерения температуры, видно в скетче, что нет мат описания измерения, нашел в другом скетче, а как вставить...? что бы измерялась температура
- Реклама
1. Зачем в часах температура ?
На сколько мне известно, часы показывают время
2. Как тут что то можно подправить ? :
На сколько мне известно, часы показывают время
2. Как тут что то можно подправить ? :
Спойлер
что и откуда вставить?
чем вы собрались температуру мерять и когда показывать?
телепатов нет, пишите подробно.
[uquote="Аlex",url="/forum/viewtopic.php?p=3235657#p3235657"]2. Как тут что то можно подправить ?[/uquote]
*nix- овые окончания строк, ничего вроде необычного. Код типично ардуинский, это да)
чем вы собрались температуру мерять и когда показывать?
телепатов нет, пишите подробно.
[uquote="Аlex",url="/forum/viewtopic.php?p=3235657#p3235657"]2. Как тут что то можно подправить ?[/uquote]
*nix- овые окончания строк, ничего вроде необычного. Код типично ардуинский, это да)
- Сообщения: 31
- Зарегистрирован: Ср сен 20, 2017 16:02:20
Если можно температуру показывать, почему нет? (Ардуино НАНО+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) и ... получится скетч. Как то так.
- Сообщения: 31
- Зарегистрирован: Ср сен 20, 2017 16:02:20
- Реклама
А самому попробовать ? Нужно же всего-лишь "её вставить в сетч".
Вставить то мы тоже сможем, но что получится после этого ? Как проверять ? Как отлаживать, если что-то не заработает ?
У Вас в руках железо, так что пробуйте, вставляйте, меняйте, ... Появятся вопросы (именно вопросы, а не просьбы сделать всё за Вас) - обращайтесь, тут всегда помогут тем, кто делает сам и на чём-то конкретном затыкается.
Вставить то мы тоже сможем, но что получится после этого ? Как проверять ? Как отлаживать, если что-то не заработает ?
У Вас в руках железо, так что пробуйте, вставляйте, меняйте, ... Появятся вопросы (именно вопросы, а не просьбы сделать всё за Вас) - обращайтесь, тут всегда помогут тем, кто делает сам и на чём-то конкретном затыкается.
- Сообщения: 31
- Зарегистрирован: Ср сен 20, 2017 16:02:20
Спасибо, что не отказали, смог бы-не обращался. А что надо вставить и куда я и сам как-то допер, что-то не хочет только.
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
Добрый день подскажите в С как нибудь можно в цикле по полям структуры пройтись? и проверить их скажем на больше меньше числа. А в 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;
нельзяpokk писал(а):в С как нибудь можно в цикле по полям структуры пройтись?
вот так и делатьpokk писал(а):// Вот это как сделать по феншую ?
в цикле можно пройтись только по массиву
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
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;
}- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
WiseLord:
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.
О за вариант с union спасибо, я примерно так же работал с массивом, только приходилось define элементы обзывать что бы не запутаться, а теперь как-то это надоело.
А про вариант, без union я уже думал, но как-то страшно, фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать.
ну и зачем вам эти грабли? ну нельзя в Си перебирать поля структуры в цикле... смиритесь. все костыли вам боком выйдут.pokk писал(а):фиг его знает как компилятор структуру упакует. И при портретировании такого когда сложности могут возникать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
на всякий случай, не касаясь собственно структур
[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){
.....
}
}- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
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;
}как с моей точки зрения, так вы сделали плохо, я бы даже сказал недопустимо, если бы мне не было все равноpokk писал(а):да я сделал похоже, но в лоб
Код: Выделить всё
typedef enum{
STATUS_OK,
STATUS_FAIL,
STATUS_ALARM
}status_t;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
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);
я конечно, не профессиональный программист, и всех тонкостей не знаю... но вот это меня удивило:это вот что должно означать? на месте компилятора я бы эту функцию выкинул, как бессмыленно-бесполезную. для обработки состояния лично я бы написал так:как обычно все и делают...
Код: Выделить всё
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;
}если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
Ну да, я обычно так и делаю все на case, это я так в блокноте накидал для примера, но в любом случае, кучу проверок дальше это не отменяет, что бы перепроверить все эти переменные, для зажигании лампочки авария.
[uquote="ARV",url="/forum/viewtopic.php?p=3241502#p3241502"]как обычно все и делают[/uquote]
для единичных статусов да, а для множественных - таки обычно маски.
для единичных статусов да, а для множественных - таки обычно маски.
[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__));
размер, но будет чуть сложнее.


