Re: attiny13
Уважаемый liman324 что в скетче для ATtiny13 + 4-х разрядный 7-сегментный индикатор на MAX7219 0,56′ изменить чтобы не отображался не значущий ноль в десятках градусов
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Разное → attiny13
Уважаемый liman324 что в скетче для ATtiny13 + 4-х разрядный 7-сегментный индикатор на MAX7219 0,56′ изменить чтобы не отображался не значущий ноль в десятках градусов
Опубликуйте скетч
Ага. Самое сложное - это программа с графиком. Интересно ж видеть пики и реальный ток.
Учитывая что длительность тока низкая, вот тут мне кажется проблемы, вплоть до невозможности на имеющихся МК.
Надо что б измерения и вывод информации были быстрее 0,1сек (0,1 - это минимальное время импульса).
Сможете помочь с этим? Интересно ли это Вам?
Если, конечно, это вообще возможно на lgt8f328p.
P. S. Что подумал. Ведь можно измерять не 24/7 а после упрааляющего сигнала. Например, пришёл сигнал - начали измерение и делаем его в течении 2-5 сек. Потом в график.
Я подумаю над этим вопросом
А как опубликовать код? вот ссылка-Термометр DS18B20-http://rcl-radio.ru/?p=132443
WriteBit16(3, temp/10%10+0xf0);
WriteBit16(4, temp%10);
>>>
WriteBit16(3, temp/10%10);
WriteBit16(4, 10);
Доброго время суток, liman324 С наступившим 2025 годом Не могли бы вы подсказать что исправить в скетче Термометр на Attiny13+DS18B20 и OLED ссылка http://rcl-radio.ru/?p=112955 чтобы и минусовую температуру показывал. Заранее благодарю
Karl2233 пишет:
Ага. Самое сложное - это программа с графиком. Интересно ж видеть пики и реальный ток.
Учитывая что длительность тока низкая, вот тут мне кажется проблемы, вплоть до невозможности на имеющихся МК.
Надо что б измерения и вывод информации были быстрее 0,1сек (0,1 - это минимальное время импульса).
Сможете помочь с этим? Интересно ли это Вам?
Если, конечно, это вообще возможно на lgt8f328p.
P. S. Что подумал. Ведь можно измерять не 24/7 а после упрааляющего сигнала. Например, пришёл сигнал - начали измерение и делаем его в течении 2-5 сек. Потом в график.
Пока просто тест, измерение с интервалом 0,1 с, с выводом графика
#include <Wire.h>
#include <U8glib.h> // https://github.com/olikraus/u8glib/
// U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
int analogRead_A0,i1,z;
int data_arr[128],data_arr1[128];
bool c=0;
void setup() {
delay(200);
Wire.begin();
analogReadResolution(10);
analogReference(DEFAULT);
pinMode(A0,INPUT);
u8g.setFont(u8g_font_profont12r);
}
void loop() {
analogRead_A0 = map(analogRead(A0), 0, 1023, 0, 48);// ограничение по высоте
i1++;
if(i1<128){data_arr[i1]= analogRead_A0;}
if(i1>=127){data_arr[127]=analogRead_A0;
for(int i=0;i<=127;i++){data_arr1[i-1]=data_arr[i];}
for(int i=0;i<=127;i++){data_arr[i]= data_arr1[i];}
}
u8g.firstPage();
do {
u8g.drawStr(0,12,"I");u8g.setPrintPos(12, 12);u8g.print(float(analogRead_A0)/10.0,1);u8g.drawStr(40,12,"A");
for(int i=0;i<128;i++){
u8g.drawLine(i, 63, i, 63-data_arr[i]);
}
} while( u8g.nextPage() );
delay(100);
}
Измеритель тока и напряжение с выводом графика тока.
Измерение напряжения - вывод на дисплей среднее значение 10 измерений
// LGT8F328
#define INPUT_I A0
#define INPUT_U A2
#define KALL_I 0.98 // калибровка тока (множитель)
#define KALL_U 225 // калибровка напряжения (делитель)
#include <Wire.h>
#include <U8glib.h> // https://github.com/olikraus/u8glib/
// U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
int analogRead_A0,i1,ind_i,ind_u;
int data_arr[128],data_arr1[128];
unsigned long times1;
int m;
long u_sum;
float u_iz;
void setup() {
Serial.begin(9600);
delay(200);
Wire.begin();
analogReadResolution(10);
analogReference(DEFAULT);
pinMode(INPUT_I,INPUT);
pinMode(INPUT_U,INPUT);
u8g.setFont(u8g_font_profont12r);
}
void loop() {
ind_i = analogRead(INPUT_I);
ind_u = analogRead(INPUT_U);
u_sum = u_sum+ind_u;
m++;if(m>9){m=0;u_iz=u_sum/10;u_sum=0;}
analogRead_A0 = map(ind_i, 0, 1023, 0, 48);
i1++;
if(i1<128){data_arr[i1]= analogRead_A0;}
if(i1>=127){data_arr[127]=analogRead_A0;
for(int i=0;i<=127;i++){data_arr1[i-1]=data_arr[i];}
for(int i=0;i<=127;i++){data_arr[i]= data_arr1[i];}
}
u8g.firstPage();
do {
u8g.drawStr(0,12,"I");u8g.setPrintPos(15, 12);u8g.print(ind_i*KALL_I,0);u8g.drawStr(40,12,"A");
u8g.drawStr(65,12,"U");u8g.setPrintPos(80, 12);u8g.print(float(u_iz)/KALL_U,2);u8g.drawStr(115,12,"V");
for(int i=0;i<128;i++){
u8g.drawLine(i, 63, i, 63-data_arr[i]);
}
} while( u8g.nextPage() );
delay(50); // интервал измерений
}
// LGT8F328
#define INPUT_I A0
#define INPUT_U A2
#define KALL_I 0.98 // калибровка тока (множитель)
#define KALL_U 225 // калибровка напряжения (делитель)
#include <Wire.h>
#include <U8glib.h> // https://github.com/olikraus/u8glib/
// U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
int analogRead_A0,i1,ind_i,ind_u;
int data_arr[128],data_arr1[128];
unsigned long times1;
int m;
long u_sum;
float u_iz;
void setup() {
Serial.begin(9600);
delay(200);
Wire.begin();
analogReadResolution(10);
analogReference(DEFAULT);
pinMode(INPUT_I,INPUT);
pinMode(INPUT_U,INPUT);
u8g.setFont(u8g_font_profont12r);
}
void loop() {
ind_i = analogRead(INPUT_I);
ind_u = analogRead(INPUT_U);
u_sum = u_sum+ind_u;
m++;if(m>9){m=0;u_iz=u_sum/10;u_sum=0;}
analogRead_A0 = map(ind_i, 0, 1023, 0, 48);
i1++;
i1=200;
if(i1<128){data_arr[i1]= analogRead_A0;}
if(i1>=127){data_arr[127]=analogRead_A0;
for(int i=0;i<=127;i++){data_arr1[i-1]=data_arr[i];}
for(int i=0;i<=127;i++){data_arr[i]= data_arr1[i];}
}
u8g.firstPage();
do {
u8g.drawStr(0,12,"I");u8g.setPrintPos(15, 12);u8g.print(ind_i*KALL_I,0);u8g.drawStr(40,12,"A");
u8g.drawStr(65,12,"U");u8g.setPrintPos(80, 12);u8g.print(float(u_iz)/KALL_U,2);u8g.drawStr(115,12,"V");
for(int i=0;i<128;i++){
u8g.drawLine(i, 63, i, 63-data_arr[i]);
}
} while( u8g.nextPage() );
delay(50); // интервал измерений
}
Движение графика в другую сторону
// LGT8F328
#define INPUT_I A0
#define INPUT_U A2
#define KALL_I 0.98 // калибровка тока (множитель)
#define KALL_U 225 // калибровка напряжения (делитель)
#include <Wire.h>
#include <U8glib.h> // https://github.com/olikraus/u8glib/
// U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
int analogRead_A0,i1,ind_i,ind_u;
int data_arr[128],data_arr1[128];
unsigned long times1;
int m;
long u_sum;
float u_iz;
void setup() {
Serial.begin(9600);
delay(200);
Wire.begin();
analogReadResolution(10);
analogReference(DEFAULT);
pinMode(INPUT_I,INPUT);
pinMode(INPUT_U,INPUT);
u8g.setFont(u8g_font_profont12r);
}
void loop() {
ind_i = analogRead(INPUT_I);
ind_u = analogRead(INPUT_U);
u_sum = u_sum+ind_u;
m++;if(m>9){m=0;u_iz=u_sum/10;u_sum=0;}
analogRead_A0 = map(ind_i, 0, 1023, 0, 48);
data_arr[0]=analogRead_A0;
for(int i=0;i<=127;i++){data_arr1[i+1]=data_arr[i];}
for(int i=0;i<=127;i++){data_arr[i]= data_arr1[i];}
u8g.firstPage();
do {
u8g.drawStr(0,12,"I");u8g.setPrintPos(15, 12);u8g.print(ind_i*KALL_I,0);u8g.drawStr(40,12,"A");
u8g.drawStr(65,12,"U");u8g.setPrintPos(80, 12);u8g.print(float(u_iz)/KALL_U,2);u8g.drawStr(115,12,"V");
for(int i=0;i<128;i++){
u8g.drawLine(i, 63, i, 63-data_arr[i]);
}
} while( u8g.nextPage() );
delay(50); // интервал измерений
}
Доброго время суток, liman324 С наступившим 2025 годом Не могли бы вы подсказать что исправить в скетче Термометр на Attiny13+DS18B20 и OLED ссылка http://rcl-radio.ru/?p=112955 чтобы и минусовую температуру показывал. Заранее благодарю
#include <avr/io.h>
#include <util/delay.h>
// Project Files (Github): https://github.com/wagiminator/ATtiny13-TinyOLEDdemo
// License: http://creativecommons.org/licenses/by-sa/3.0/
#define I2C_SDA PB3
#define I2C_SCL PB4
#define TEMP PB0
#define BUTTON PB2
#define I2C_SDA_HIGH() DDRB &= ~(1<<I2C_SDA)
#define I2C_SDA_LOW() DDRB |= (1<<I2C_SDA)
#define I2C_SCL_HIGH() DDRB &= ~(1<<I2C_SCL)
#define I2C_SCL_LOW() DDRB |= (1<<I2C_SCL)
const char Message1[] PROGMEM = "TEMPERATURE";
int main(void) {
PORTB |=(1 << BUTTON);
OLED_init();
// OLED_clear();
while(1) {
if(((PINB >> BUTTON) & 1) == 0){
int temp = read_temp();
OLED_cursor(28, 0);
OLED_printP(Message1);
OLED_cursor(45, 2);
if(temp<0){temp=abs(temp);OLED_num(-3);}
byte a0 = temp/100;
OLED_num(a0);
a0 = temp/10%10;
OLED_num(a0);
OLED_num(-2);
a0 = temp%10;
OLED_num(((PINB >> BUTTON) & 1));
OLED_num(-9);
OLED_num(19);
_delay_ms(10000);}
OLED_clear();
}}
///// I2C ///////////////////////////////////////////////////////
void I2C_init(void) {DDRB &= ~((1<<I2C_SDA)|(1<<I2C_SCL)); PORTB &= ~((1<<I2C_SDA)|(1<<I2C_SCL));}
void I2C_write(uint8_t data) {
for(uint8_t i = 8; i; i--) {I2C_SDA_LOW();
if (data & 0x80) I2C_SDA_HIGH();I2C_SCL_HIGH();data<<=1;I2C_SCL_LOW();}
I2C_SDA_HIGH();I2C_SCL_HIGH();asm("nop");I2C_SCL_LOW();
}
void I2C_start(uint8_t addr) {I2C_SDA_LOW();I2C_SCL_LOW();I2C_write(addr);}
void I2C_stop(void) {I2C_SDA_LOW();I2C_SCL_HIGH();I2C_SDA_HIGH();}
///// OLED ///////////////////////////////////
#define OLED_ADDR 0x78
#define OLED_CMD_MODE 0x00
#define OLED_DAT_MODE 0x40
#define OLED_INIT_LEN 12
// OLED init settings
const uint8_t OLED_INIT_CMD[] PROGMEM = {
0xA8, 0x1F, // 0x1F for 128x32, 0x3F for 128x64
0x22, 0x00, 0x03,
0x20, 0x00,
0xDA, 0x02,
0x8D, 0x14,
0xAF,
0xA1, 0xC8
};
// Standard ASCII 5x8 font (adapted from Neven Boyanov and Stephen Denne)
const uint8_t OLED_FONT[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, // 0
0x00, 0x1c, 0x22, 0x41, 0x00, // ( 8
0x00, 0x41, 0x22, 0x1c, 0x00, // ) 9
0x14, 0x08, 0x3E, 0x08, 0x14, // * 10
0x08, 0x08, 0x3E, 0x08, 0x08, // + 11
0x00, 0x00, 0xA0, 0x60, 0x00, // , 12
0x08, 0x08, 0x08, 0x08, 0x08, // - 13
0x00, 0x60, 0x60, 0x00, 0x00, // . 14
0x20, 0x10, 0x08, 0x04, 0x02, // / 15
0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 16
0x00, 0x42, 0x7F, 0x40, 0x00, // 1 17
0x42, 0x61, 0x51, 0x49, 0x46, // 2 18
0x21, 0x41, 0x45, 0x4B, 0x31, // 3 19
0x18, 0x14, 0x12, 0x7F, 0x10, // 4 20
0x27, 0x45, 0x45, 0x45, 0x39, // 5 21
0x3C, 0x4A, 0x49, 0x49, 0x30, // 6 22
0x01, 0x71, 0x09, 0x05, 0x03, // 7 23
0x36, 0x49, 0x49, 0x49, 0x36, // 8 24
0x06, 0x49, 0x49, 0x29, 0x1E, // 9 25
0x00, 0x36, 0x36, 0x00, 0x00, // : 26
0x00, 0x56, 0x36, 0x00, 0x00, // ; 27
0x08, 0x14, 0x22, 0x41, 0x00, // < 28
0x14, 0x14, 0x14, 0x14, 0x14, // = 29
0x00, 0x41, 0x22, 0x14, 0x08, // > 30
0x02, 0x01, 0x51, 0x09, 0x06, // ? 31
0x32, 0x49, 0x59, 0x51, 0x3E, // @ 32
0x7C, 0x12, 0x11, 0x12, 0x7C, // A 33
0x7F, 0x49, 0x49, 0x49, 0x36, // B 34
0x3E, 0x41, 0x41, 0x41, 0x22, // C 35
0x7F, 0x41, 0x41, 0x22, 0x1C, // D 36
0x7F, 0x49, 0x49, 0x49, 0x41, // E 37
0x7F, 0x09, 0x09, 0x09, 0x01, // F 38
0x3E, 0x41, 0x49, 0x49, 0x7A, // G 39
0x7F, 0x08, 0x08, 0x08, 0x7F, // H 40
0x00, 0x41, 0x7F, 0x41, 0x00, // I 41
0x20, 0x40, 0x41, 0x3F, 0x01, // J 42
0x7F, 0x08, 0x14, 0x22, 0x41, // K 43
0x7F, 0x40, 0x40, 0x40, 0x40, // L 44
0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 45
0x7F, 0x04, 0x08, 0x10, 0x7F, // N 46
0x3E, 0x41, 0x41, 0x41, 0x3E, // O 47
0x7F, 0x09, 0x09, 0x09, 0x06, // P 48
0x3E, 0x41, 0x51, 0x21, 0x5E, // Q 49
0x7F, 0x09, 0x19, 0x29, 0x46, // R 50
0x46, 0x49, 0x49, 0x49, 0x31, // S 51
0x01, 0x01, 0x7F, 0x01, 0x01, // T 52
0x3F, 0x40, 0x40, 0x40, 0x3F, // U 53
0x1F, 0x20, 0x40, 0x20, 0x1F, // V 54
0x3F, 0x40, 0x38, 0x40, 0x3F, // W 55
0x63, 0x14, 0x08, 0x14, 0x63, // X 56
0x07, 0x08, 0x70, 0x08, 0x07, // Y 57
0x61, 0x51, 0x49, 0x45, 0x43, // Z 58
};
void OLED_init(void) {
I2C_init();
I2C_start(OLED_ADDR);
I2C_write(OLED_CMD_MODE);
for (uint8_t i = 0; i < OLED_INIT_LEN; i++) I2C_write(pgm_read_byte(&OLED_INIT_CMD[i]));
I2C_stop();
}
void OLED_printC(char ch) {
uint16_t offset = ch - 32 -7;
offset += offset << 2;
I2C_write(0x00);
for(uint8_t i=5; i; i--) I2C_write(pgm_read_byte(&OLED_FONT[offset++]));
}
void OLED_printP(const char* p) {
I2C_start(OLED_ADDR);
I2C_write(OLED_DAT_MODE);
char ch = pgm_read_byte(p);
while (ch != 0){OLED_printC(ch);ch = pgm_read_byte(++p);}
I2C_stop();
}
void OLED_cursor(uint8_t xpos, uint8_t ypos) {
I2C_start(OLED_ADDR);
I2C_write(OLED_CMD_MODE);
I2C_write(xpos & 0x0F);
I2C_write(0x10 | (xpos >> 4));
I2C_write(0xB0 | (ypos & 0x07));
I2C_stop();
}
void OLED_clear(void) {
OLED_cursor(0, 0);
I2C_start(OLED_ADDR);
I2C_write(OLED_DAT_MODE);
for(uint16_t i=512; i; i--) I2C_write(0x00);
I2C_stop();
}
void OLED_num(byte num){
I2C_start(OLED_ADDR);
I2C_write(OLED_DAT_MODE);
OLED_printC(num+48);
I2C_stop();
}
//// DS18B20 //////////////////////////////////////
uint8_t therm_reset(){
uint8_t i;
PORTB &= ~(1 << TEMP);
DDRB |= (1 << TEMP);
_delay_us(480);
DDRB &= ~(1 << TEMP);
_delay_us(60);
i=((PINB >> TEMP) & 1);
_delay_us(420);
return i;
}
void therm_write_bit(uint8_t bit){
DDRB |= (1 << TEMP);
if(bit) DDRB &= ~(1 << TEMP);
_delay_us(60);
DDRB &= ~(1 << TEMP);
}
uint8_t therm_read_bit(void){
uint8_t bit=0;
DDRB |= (1 << TEMP);
DDRB &= ~(1 << TEMP);
_delay_us(14);
if(PINB & (1 << TEMP)) bit=1;
_delay_us(45);
return bit;
}
uint8_t therm_read_byte(void){
uint8_t i=8, n=0;
while(i--){n>>=1;n|=(therm_read_bit()<<7);}
return n;
}
void therm_write_byte(uint8_t byte){
uint8_t i=8;
while(i--){therm_write_bit(byte&1);byte >>= 1;
}}
int read_temp(){
uint8_t temperature[2];
int temper;
therm_reset();
therm_write_byte(0xCC);
therm_write_byte(0x44);
while(!therm_read_bit());
therm_reset();
therm_write_byte(0xCC);
therm_write_byte(0xBE);
temperature[0]=therm_read_byte();
temperature[1]=therm_read_byte();
therm_reset();
return temper = (temperature[1] << 8 | temperature[0])*10/16;
}
Доброе время суток liman324, все супер СПАСИБО за отрицательные температуры, но извините за назойливость, я скетчи только пытаюсь освоить, можно бы убрать не значущий ноль при температурах меньше 10.
byte a0 = temp/100;
OLED_num(a0);
>>>
byte a0 = temp/100;
if(a0>0){OLED_num(a0);}
liman324 что-то не получается
liman324 Спасибо, я почему то так и думал.
В коде вроде как ошибка
замените
OLED_num(((PINB >> BUTTON) & 1));
на
OLED_num(a0);
liman324 Заменил, плюсовые точь в точь, а минусовые на 0.1 меньше
Александр спасибо!
Скетч из сообщения 109 работает как надо.
Это я пальцем наводки создаю.
Жалко нет 1,3 двухцветных.
Пара вопросов - в какой строке можно изменить интервал измерения?
И я ж буду переменку мерять, как-то надо вычислять RMS? Если не сложно, можете учесть этот нюанс?
Вот что подумал. Напряжения очень маленькие будут: 0-5В. В случае с делителем и диодом, точность очень низкая будет. Конечно, в данном применении точность напряжения не так и важна но...
Может есть смысл внешний АЦП или что-то подобное использовать?
Вот, наткнулся http://easyelectronics.ru/zamer-set … eniya.html на модуль для Ардуино.
з.ы. заказал ТТ. Соберу сварочник, отпишусь.
Для OLED1.3
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
delay(50); // интервал измерений
Да, я заметил универсальность в коде.
Спасибо за предусмотрительность.
Я про двухцветность: если б 1,3 были двухцветные - размер больше и верхняя строка другим цветом.
Александр, про измерение переменки - нет ли мыслей?
На крайний случай поставлю диод и в программе коэффициент подберу.
На крайний случай поставлю диод и в программе коэффициент подберу.
Если к точности нет особых требований, то можно просто диод и фильтрующий конденсатор поставить.
forum.rcl-radio.ru → Разное → attiny13
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|