Просто маленький термометр/барометр/гигрометр на BME280 и Attiny85
Питается от батареек CR2032, в спящем режиме потребление 7 мкА, в режиме отображения <10мА
Отображение включается кнопкой, и поочередно сменяются значения в течении 38 секунд


001 | #include <TinyOzOLED.h> |
002 | #include <TinyWireM.h> |
003 | #include <avr/sleep.h> |
004 | #define BME280_ADDRESS 0x76 |
005 | unsigned long int hum_raw, temp_raw, pres_raw; |
006 | signed long int t_fine; |
028 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
031 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
035 | #define PB0_OUT sbi(DDRB,PB0) |
036 | #define PB0_IN cbi(DDRB,PB0) |
037 | #define PB0_HIGH sbi(PORTB,PB0) |
038 | #define PB0_LOW cbi(PORTB,PB0) |
040 | #define PB1_OUT sbi(DDRB,PB1) |
041 | #define PB1_IN cbi(DDRB,PB1) |
042 | #define PB1_HIGH sbi(PORTB,PB1) |
043 | #define PB1_LOW cbi(PORTB,PB1) |
045 | #define PB2_OUT sbi(DDRB,PB2) |
046 | #define PB2_IN cbi(DDRB,PB2) |
047 | #define PB2_HIGH sbi(PORTB,PB2) |
048 | #define PB2_LOW cbi(PORTB,PB2) |
050 | #define PB3_OUT sbi(DDRB,PB3) |
051 | #define PB3_IN cbi(DDRB,PB3) |
052 | #define PB3_HIGH sbi(PORTB,PB3) |
053 | #define PB3_LOW cbi(PORTB,PB3) |
054 | #define PB3_READ bitRead(PINB,PB3) |
056 | #define PB4_OUT sbi(DDRB,PB4) |
057 | #define PB4_IN cbi(DDRB,PB4) |
058 | #define PB4_HIGH sbi(PORTB,PB4) |
059 | #define PB4_LOW cbi(PORTB,PB4) |
062 | unsigned long showTimer; |
063 | unsigned long wakeUpTimer; |
067 | void writeReg(uint8_t reg_address, uint8_t data) { |
068 | TinyWireM.beginTransmission(BME280_ADDRESS); |
069 | TinyWireM.write(reg_address); |
070 | TinyWireM.write(data); |
071 | TinyWireM.endTransmission(); |
083 | uint8_t spi3w_en = 0; |
085 | uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; |
086 | uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; |
087 | uint8_t ctrl_hum_reg = osrs_h; |
088 | writeReg(0xF2, ctrl_hum_reg); |
089 | writeReg(0xF4, ctrl_meas_reg); |
090 | writeReg(0xF5, config_reg); |
095 | writeReg(0xE0, 0xB6); |
098 | signed long int calibration_T(signed long int adc_T) |
101 | signed long int var1, var2, T; |
102 | var1 = ((((adc_T >> 3) - ((signed long int )dig_T1 << 1))) * ((signed long int )dig_T2)) >> 11; |
103 | var2 = (((((adc_T >> 4) - ((signed long int )dig_T1)) * ((adc_T >> 4) - ((signed long int )dig_T1))) >> 12) * ((signed long int )dig_T3)) >> 14; |
105 | t_fine = var1 + var2; |
106 | T = (t_fine * 5 + 128) >> 8; |
111 | uint8_t data[32], i = 0; |
112 | TinyWireM.beginTransmission(BME280_ADDRESS); |
113 | TinyWireM.write(0x88); |
114 | TinyWireM.endTransmission(); |
115 | TinyWireM.requestFrom(BME280_ADDRESS, 24); |
116 | while (TinyWireM.available()) { |
117 | data[i] = TinyWireM.read(); |
121 | TinyWireM.beginTransmission(BME280_ADDRESS); |
122 | TinyWireM.write(0xA1); |
123 | TinyWireM.endTransmission(); |
124 | TinyWireM.requestFrom(BME280_ADDRESS, 1); |
125 | data[i] = TinyWireM.read(); |
128 | TinyWireM.beginTransmission(BME280_ADDRESS); |
129 | TinyWireM.write(0xE1); |
130 | TinyWireM.endTransmission(); |
131 | TinyWireM.requestFrom(BME280_ADDRESS, 7); |
132 | while (TinyWireM.available()) { |
133 | data[i] = TinyWireM.read(); |
136 | dig_T1 = (data[1] << 8) | data[0]; |
137 | dig_T2 = (data[3] << 8) | data[2]; |
138 | dig_T3 = (data[5] << 8) | data[4]; |
139 | dig_P1 = (data[7] << 8) | data[6]; |
140 | dig_P2 = (data[9] << 8) | data[8]; |
141 | dig_P3 = (data[11] << 8) | data[10]; |
142 | dig_P4 = (data[13] << 8) | data[12]; |
143 | dig_P5 = (data[15] << 8) | data[14]; |
144 | dig_P6 = (data[17] << 8) | data[16]; |
145 | dig_P7 = (data[19] << 8) | data[18]; |
146 | dig_P8 = (data[21] << 8) | data[20]; |
147 | dig_P9 = (data[23] << 8) | data[22]; |
149 | dig_H2 = (data[26] << 8) | data[25]; |
151 | dig_H4 = (data[28] << 4) | (0x0F & data[29]); |
152 | dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); |
173 | set_sleep_mode (SLEEP_MODE_PWR_DOWN); |
188 | TinyWireM.beginTransmission(BME280_ADDRESS); |
189 | TinyWireM.write(0xF7); |
190 | TinyWireM.endTransmission(); |
191 | TinyWireM.requestFrom(BME280_ADDRESS, 8); |
192 | while (TinyWireM.available()) { |
193 | data[i] = TinyWireM.read(); |
196 | pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); |
197 | temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); |
198 | hum_raw = (data[6] << 8) | data[7]; |
199 | temp_raw = calibration_T(temp_raw); |
200 | pres_raw = (calibration_P(pres_raw) / 133.32) - 5; |
201 | hum_raw = calibration_H(hum_raw) / 1024; |
205 | unsigned long curr_millis = millis(); |
209 | wakeUpTimer = curr_millis; |
211 | showTimer = curr_millis; |
218 | OzOled.setNormalDisplay(); |
219 | OzOled.setPageMode(); |
220 | OzOled.sendCommand(0xA1); |
221 | OzOled.sendCommand(0xC8); |
224 | if ((curr_millis - showTimer) >= 4000UL) { |
225 | showTimer = curr_millis; |
233 | OzOled.clearDisplay(); |
237 | str[0] = (pres_raw / 100) + 0x30; |
238 | str[1] = (pres_raw % 100) / 10 + 0x30; |
239 | str[2] = (pres_raw % 100) % 10 + 0x30; |
241 | OzOled.printBigNumber(str, 3, 0); |
253 | str[0] = hum_raw / 10 + 0x30; |
254 | str[1] = hum_raw % 10 + 0x30; |
256 | OzOled.printBigNumber(str, 6, 0); |
261 | str[0] = (temp_raw / 1000) + 0x30; |
262 | str[1] = (temp_raw % 1000) / 100 + 0x30; |
264 | str[3] = ((temp_raw % 1000) % 100) / 10 + 0x30; |
265 | str[4] = ((temp_raw % 1000) % 100) % 10 + 0x30; |
267 | OzOled.printBigNumber(str, 0, 0); |
273 | if ((curr_millis - wakeUpTimer) >= 39000UL) { |
276 | OzOled.setPowerOff(); |
281 | unsigned long int calibration_P(signed long int adc_P) { |
282 | signed long int var1, var2; |
284 | var1 = (((signed long int )t_fine) >> 1) - (signed long int )64000; |
285 | var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((signed long int )dig_P6); |
286 | var2 = var2 + ((var1 * ((signed long int )dig_P5)) << 1); |
287 | var2 = (var2 >> 2) + (((signed long int )dig_P4) << 16); |
288 | var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((((signed long int )dig_P2) * var1) >> 1)) >> 18; |
289 | var1 = ((((32768 + var1)) * ((signed long int )dig_P1)) >> 15); |
294 | P = (((unsigned long int )(((signed long int )1048576) - adc_P) - (var2 >> 12))) * 3125; |
297 | P = (P << 1) / ((unsigned long int ) var1); |
301 | P = (P / (unsigned long int )var1) * 2; |
303 | var1 = (((signed long int )dig_P9) * ((signed long int )(((P >> 3) * (P >> 3)) >> 13))) >> 12; |
304 | var2 = (((signed long int )(P >> 2)) * ((signed long int )dig_P8)) >> 13; |
305 | P = (unsigned long int )((signed long int )P + ((var1 + var2 + dig_P7) >> 4)); |
309 | unsigned long int calibration_H(signed long int adc_H) { |
310 | signed long int v_x1; |
312 | v_x1 = (t_fine - ((signed long int )76800)); |
313 | v_x1 = (((((adc_H << 14) - (((signed long int )dig_H4) << 20) - (((signed long int )dig_H5) * v_x1)) + |
314 | ((signed long int )16384)) >> 15) * (((((((v_x1 * ((signed long int )dig_H6)) >> 10) * |
315 | (((v_x1 * ((signed long int )dig_H3)) >> 11) + ((signed long int ) 32768))) >> 10) + (( signed long int )2097152)) * |
316 | ((signed long int ) dig_H2) + 8192) >> 14)); |
317 | v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int )dig_H1)) >> 4)); |
318 | v_x1 = (v_x1 < 0 ? 0 : v_x1); |
319 | v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); |
320 | return (unsigned long int )(v_x1 >> 12); |
Классный проект, нужный. У мня такой жэ, маленько проще, на 27 строчек кода. И тока мой на улице валяеца. С баторейкой на 9 Вольт. И жена пилит, когда я буквы побольше сделаю. А мне лень. :)
дома тупо термометра и барометра нет - вот и собрал из того что было, осталось в спичесный коробок засунуть
поторопился я выкладывать :( - нашел серъезную ошибку, исправленый текст ниже.
влажность показывает странную - 33...34% но мне она не нужна , потому не разбирался.
также с моим OLED дисплеем из Китая не заработала стандартная библиотека TinyOzOLED - пришлось ее корректировать - если кого заинтересует - выложу.
001
#include <TinyOzOLED.h>
002
#include <TinyWireM.h>
003
#include <avr/sleep.h>
004
#define BME280_ADDRESS 0x76
005
unsigned
long
int
hum_raw, temp_raw, pres_raw;
006
signed
long
int
t_fine;
007
008
uint16_t dig_T1;
009
int16_t dig_T2;
010
int16_t dig_T3;
011
uint16_t dig_P1;
012
int16_t dig_P2;
013
int16_t dig_P3;
014
int16_t dig_P4;
015
int16_t dig_P5;
016
int16_t dig_P6;
017
int16_t dig_P7;
018
int16_t dig_P8;
019
int16_t dig_P9;
020
int8_t dig_H1;
021
int16_t dig_H2;
022
int8_t dig_H3;
023
int16_t dig_H4;
024
int16_t dig_H5;
025
int8_t dig_H6;
026
027
#ifndef cbi
028
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
029
#endif
030
#ifndef sbi
031
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
032
#endif
033
034
// PB0 pin 5 - SDA
035
#define PB0_OUT sbi(DDRB,PB0)
036
#define PB0_IN cbi(DDRB,PB0)
037
#define PB0_HIGH sbi(PORTB,PB0)
038
#define PB0_LOW cbi(PORTB,PB0)
039
// PB1 pin 6
040
#define PB1_OUT sbi(DDRB,PB1)
041
#define PB1_IN cbi(DDRB,PB1)
042
#define PB1_HIGH sbi(PORTB,PB1)
043
#define PB1_LOW cbi(PORTB,PB1)
044
// PB2 pin 7 - SCL
045
#define PB2_OUT sbi(DDRB,PB2)
046
#define PB2_IN cbi(DDRB,PB2)
047
#define PB2_HIGH sbi(PORTB,PB2)
048
#define PB2_LOW cbi(PORTB,PB2)
049
// PB3 pin 2 - WakeUp KEY
050
#define PB3_OUT sbi(DDRB,PB3)
051
#define PB3_IN cbi(DDRB,PB3)
052
#define PB3_HIGH sbi(PORTB,PB3)
053
#define PB3_LOW cbi(PORTB,PB3)
054
#define PB3_READ bitRead(PINB,PB3)
055
// PB4 pin 3
056
#define PB4_OUT sbi(DDRB,PB4)
057
#define PB4_IN cbi(DDRB,PB4)
058
#define PB4_HIGH sbi(PORTB,PB4)
059
#define PB4_LOW cbi(PORTB,PB4)
060
061
boolean firstStart;
062
unsigned
long
showTimer;
063
unsigned
long
wakeUpTimer;
064
byte
showMode;
// 0-temp 1-pres 2-hum
065
boolean changeMode;
066
067
void
writeReg(uint8_t reg_address, uint8_t data) {
068
TinyWireM.beginTransmission(BME280_ADDRESS);
069
TinyWireM.write(reg_address);
070
TinyWireM.write(data);
071
TinyWireM.endTransmission();
072
}
073
074
void
initBME280() {
075
076
uint8_t osrs_t = 1;
//Temperature oversampling x 1
077
uint8_t osrs_p = 1;
//Pressure oversampling x 1
078
uint8_t osrs_h = 2;
//Humidity oversampling x 1
079
uint8_t mode = 3;
//Normal mode
080
uint8_t t_sb = 5;
//Tstandby 1000ms
081
uint8_t filter = 0;
//Filter off
082
uint8_t spi3w_en = 0;
//3-wire SPI Disable
083
084
uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode;
085
uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en;
086
uint8_t ctrl_hum_reg = osrs_h;
087
writeReg(0xF2, ctrl_hum_reg);
088
writeReg(0xF4, ctrl_meas_reg);
089
writeReg(0xF5, config_reg);
090
readTrim();
091
}
092
093
ISR(PCINT0_vect) {
094
if
(PB3_READ == 0) {
// LOW level KEY
095
sleep_disable();
096
cbi(GIMSK, PCIE);
097
cbi(PCMSK, PCINT3);
098
}
099
}
100
101
void
toSleep() {
102
// pins mode
103
PB0_IN; PB0_LOW;
104
PB1_OUT; PB1_LOW;
105
PB2_IN; PB2_LOW;
106
PB3_IN; PB3_HIGH;
// LOW = OFF res, if HIGH level KEY
107
PB4_OUT; PB4_LOW;
108
// sleep
109
cbi(ADCSRA, ADEN);
110
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
111
sleep_enable();
112
sbi(GIMSK, PCIE);
113
sbi(PCMSK, PCINT3);
114
sleep_mode();
115
}
116
117
void
setup
() {
118
firstStart =
true
;
119
TinyWireM.begin();
120
initBME280();
121
}
122
123
void
readData()
124
{
125
int
i = 0;
126
uint32_t data[8];
127
TinyWireM.beginTransmission(BME280_ADDRESS);
128
TinyWireM.write(0xF7);
129
TinyWireM.endTransmission();
130
TinyWireM.requestFrom(BME280_ADDRESS, 8);
131
while
(TinyWireM.available()) {
132
data[i] = TinyWireM.read();
133
i++;
134
}
135
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
136
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4);
137
hum_raw = (data[6] << 8) | data[7];
138
temp_raw = calibration_T(temp_raw);
139
pres_raw = (calibration_P(pres_raw) / 133.32) - 5;
140
hum_raw = calibration_H(hum_raw) / 1024;
141
}
142
143
void
loop
() {
144
unsigned
long
curr_millis = millis();
145
if
(firstStart) {
146
toSleep();
147
firstStart =
false
;
148
wakeUpTimer = curr_millis;
149
showMode = 0;
150
showTimer = curr_millis;
151
changeMode =
true
;
152
// get data from BME280
153
TinyWireM.begin();
154
t_fine = 0;
155
readData();
156
OzOled.init();
//инициализация дисплей
157
OzOled.setNormalDisplay();
//нормальный режим
158
OzOled.setPageMode();
//адресация страничная
159
OzOled.sendCommand(0xA1);
//выбор ориентации сверху - вниз
160
OzOled.sendCommand(0xC8);
//слева - направо
161
}
162
// work
163
if
((curr_millis - showTimer) >= 4000UL) {
// change disp every 4 sec
164
showTimer = curr_millis;
165
changeMode =
true
;
166
++showMode;
167
if
(showMode > 2) {
168
showMode = 0;
169
}
170
}
171
if
(changeMode) {
172
OzOled.clearDisplay();
//очистка дисплея
173
switch
(showMode) {
174
case
1: {
175
char
str[4] =
""
;
176
str[0] = (pres_raw / 100) + 0x30;
177
str[1] = (pres_raw % 100) / 10 + 0x30;
178
str[2] = (pres_raw % 100) % 10 + 0x30;
179
str[3] = 0x00;
180
OzOled.printBigNumber(str, 3, 0);
181
break
;
182
}
183
case
2: {
184
char
str[3] =
""
;
185
str[0] = hum_raw / 10 + 0x30;
186
str[1] = hum_raw % 10 + 0x30;
187
str[2] = 0x00;
188
OzOled.printBigNumber(str, 6, 0);
189
break
;
190
}
191
default
: {
// show temp
192
char
str[6] =
""
;
193
str[0] = (temp_raw / 1000) + 0x30;
194
str[1] = (temp_raw % 1000) / 100 + 0x30;
195
str[2] =
'.'
;
196
str[3] = ((temp_raw % 1000) % 100) / 10 + 0x30;
197
str[4] = ((temp_raw % 1000) % 100) % 10 + 0x30;
198
str[5] = 0x00;
199
OzOled.printBigNumber(str, 0, 0);
200
}
201
}
202
changeMode =
false
;
203
}
204
// OFF show data
205
if
((curr_millis - wakeUpTimer) >= 40000UL) {
206
firstStart =
true
;
207
// OFF display
208
OzOled.setPowerOff();
209
}
210
}
211
212
unsigned
long
int
calibration_P(signed
long
int
adc_P) {
213
signed
long
int
var1, var2;
214
unsigned
long
int
P;
215
var1 = (((signed
long
int
)t_fine) >> 1) - (signed
long
int
)64000;
216
var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((signed
long
int
)dig_P6);
217
var2 = var2 + ((var1 * ((signed
long
int
)dig_P5)) << 1);
218
var2 = (var2 >> 2) + (((signed
long
int
)dig_P4) << 16);
219
var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((((signed
long
int
)dig_P2) * var1) >> 1)) >> 18;
220
var1 = ((((32768 + var1)) * ((signed
long
int
)dig_P1)) >> 15);
221
if
(var1 == 0)
222
{
223
return
0;
224
}
225
P = (((unsigned
long
int
)(((signed
long
int
)1048576) - adc_P) - (var2 >> 12))) * 3125;
226
if
(P < 0x80000000)
227
{
228
P = (P << 1) / ((unsigned
long
int
) var1);
229
}
230
else
231
{
232
P = (P / (unsigned
long
int
)var1) * 2;
233
}
234
var1 = (((signed
long
int
)dig_P9) * ((signed
long
int
)(((P >> 3) * (P >> 3)) >> 13))) >> 12;
235
var2 = (((signed
long
int
)(P >> 2)) * ((signed
long
int
)dig_P8)) >> 13;
236
P = (unsigned
long
int
)((signed
long
int
)P + ((var1 + var2 + dig_P7) >> 4));
237
return
P;
238
}
239
240
unsigned
long
int
calibration_H(signed
long
int
adc_H) {
241
signed
long
int
v_x1;
242
243
v_x1 = (t_fine - ((signed
long
int
)76800));
244
v_x1 = (((((adc_H << 14) - (((signed
long
int
)dig_H4) << 20) - (((signed
long
int
)dig_H5) * v_x1)) +
245
((signed
long
int
)16384)) >> 15) * (((((((v_x1 * ((signed
long
int
)dig_H6)) >> 10) *
246
(((v_x1 * ((signed
long
int
)dig_H3)) >> 11) + ((signed
long
int
) 32768))) >> 10) + (( signed
long
int
)2097152)) *
247
((signed
long
int
) dig_H2) + 8192) >> 14));
248
v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed
long
int
)dig_H1)) >> 4));
249
v_x1 = (v_x1 < 0 ? 0 : v_x1);
250
v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
251
return
(unsigned
long
int
)(v_x1 >> 12);
252
}
253
254
void
resetBME280() {
255
writeReg(0xE0, 0xB6);
256
}
257
258
signed
long
int
calibration_T(signed
long
int
adc_T)
259
{
260
261
signed
long
int
var1, var2, T;
262
var1 = ((((adc_T >> 3) - ((signed
long
int
)dig_T1 << 1))) * ((signed
long
int
)dig_T2)) >> 11;
263
var2 = (((((adc_T >> 4) - ((signed
long
int
)dig_T1)) * ((adc_T >> 4) - ((signed
long
int
)dig_T1))) >> 12) * ((signed
long
int
)dig_T3)) >> 14;
264
265
t_fine = var1 + var2;
266
T = (t_fine * 5 + 128) >> 8;
267
return
T;
268
}
269
270
void
readTrim() {
271
uint8_t data[32], i = 0;
272
TinyWireM.beginTransmission(BME280_ADDRESS);
273
TinyWireM.write(0x88);
274
TinyWireM.endTransmission();
275
TinyWireM.requestFrom(BME280_ADDRESS, 24);
276
while
(TinyWireM.available()) {
277
data[i] = TinyWireM.read();
278
i++;
279
}
280
281
TinyWireM.beginTransmission(BME280_ADDRESS);
282
TinyWireM.write(0xA1);
283
TinyWireM.endTransmission();
284
TinyWireM.requestFrom(BME280_ADDRESS, 1);
285
data[i] = TinyWireM.read();
286
i++;
287
288
TinyWireM.beginTransmission(BME280_ADDRESS);
289
TinyWireM.write(0xE1);
290
TinyWireM.endTransmission();
291
TinyWireM.requestFrom(BME280_ADDRESS, 7);
292
while
(TinyWireM.available()) {
293
data[i] = TinyWireM.read();
294
i++;
295
}
296
dig_T1 = (data[1] << 8) | data[0];
297
dig_T2 = (data[3] << 8) | data[2];
298
dig_T3 = (data[5] << 8) | data[4];
299
dig_P1 = (data[7] << 8) | data[6];
300
dig_P2 = (data[9] << 8) | data[8];
301
dig_P3 = (data[11] << 8) | data[10];
302
dig_P4 = (data[13] << 8) | data[12];
303
dig_P5 = (data[15] << 8) | data[14];
304
dig_P6 = (data[17] << 8) | data[16];
305
dig_P7 = (data[19] << 8) | data[18];
306
dig_P8 = (data[21] << 8) | data[20];
307
dig_P9 = (data[23] << 8) | data[22];
308
dig_H1 = data[24];
309
dig_H2 = (data[26] << 8) | data[25];
310
dig_H3 = data[27];
311
dig_H4 = (data[28] << 4) | (0x0F & data[29]);
312
dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F);
313
dig_H6 = data[31];
314
}
Надо попробовать повторить :) а какую плату вы выбираете в иде?
ATtiny85 @ 1 MHz (internal oscillator; BOD disabled)
Понятно ... что-то с библиотеками ... буду разбираться
Понятно ... что-то с библиотеками ... буду разбираться
в смысле? там все просто - распаковывайте архив с tiny библиотеками в hardware и все, поищите поиском Arduino as ISP для ATtiny
Микроконтроллер я уже установил, ругается на бибилиотеку для барометра, возможно я не самую свежую скачал
Микроконтроллер я уже установил, ругается на бибилиотеку для барометра, возможно я не самую свежую скачал
Текст ошибки чтоль показали бы....
1
Да ошибка понятна ...
2
Clock_andycat:277: error:
'class USI_TWI'
has no member named
'read'
3
4
data[i] = TinyWireM.read();
5
^
6
Clock_andycat:282: error:
'class USI_TWI'
has no member named
'write'
7
8
TinyWireM.write(0xA1);
1
Да ошибка понятна ...
2
Clock_andycat:277: error:
'class USI_TWI'
has no member named
'read'
3
4
data[i] = TinyWireM.read();
5
^
6
Clock_andycat:282: error:
'class USI_TWI'
has no member named
'write'
7
8
TinyWireM.write(0xA1);
это ошибка библиотеки барометра? вы собираетесь барометр BME280 из библиотеки использовать? не хочу вас расстраивать - ничего не получиться - памяти МК не хватит - только напрямую командами - на ГитХабе масса примеров, мой скетч в основном отттуда.
ЗЫ. хотел добавить мелкий текст - тпа градусов цельсия или мм рт столба - не влезло, сейчас занимает 94 % памяти контроллера.
Так как вы тогда компилировали то, что выложили? Ладно, спасибо, разберемся ... еще индикатор нужно заказать в китае ... просто на будущее
Так как вы тогда компилировали то, что выложили? Ладно, спасибо, разберемся ... еще индикатор нужно заказать в китае ... просто на будущее
не понял вопроса, так и компилировал - в ардуино ИДЕ выбрал меню загрузить через программатор - он загрузил в Attiny85
Если при компиляции возникают ошибки, как же можно загрузить в мк?
Если при компиляции возникают ошибки, как же можно загрузить в мк?
у меня не было ошибок :)
итак по пунктам:
1 скачиваете с гитраб библиотеку Tinywirem - устанавливаете
2. аналогично TinyOzOled
3. выбираете плату Attiny85
все должно скомпилироваться, если нет - как то не правильно все поставили
Все, обновил бибилиотеку, скомпилировалось без ошибок ....
91% программная память
91% программная память
у меня TinyOzOled библиотека исправлена, потому и размер другой, если с вашим дисплеем (128*32) будет аналогичная проблема как у меня (знаки сплюснуты были) - тогда скину исправленную.
Ок ... ну осталось дело за малым, чтобы по коду не рисовать схему, возможно позволите на нее взглянуть :)
а у меня нет схемы :)
и с стоках 034..058 все же написано, там тупо три контакта МК только использовано
я так и думал ... :) ладно, нарисую сам
Здравствуйте!
Не подскажете, как полусенные Вами измерения отправить на RF передатчик 433Мгц ?
Для экономии памяти тиньки можно было бы отправить *_raw данные, а на стороне приемника их уже причесать.
Спасибо!
http://arduino.ru/forum/ishchu-ispolnitelya/proshu-pomoshchi-s-kodom-dly...
Спасибо огромное!
01
#include <DigisparkOLED.h>
02
#include <Wire.h>
03
04
05
06
void
setup
() {
07
oled.begin();
08
oled.clear();
09
oled.setCursor(0, 0);
10
oled.setFont(FONT8X16);
11
oled.print(F(
"Hello, world!"
));
12
}
13
14
void
loop
() {
15
16
17
}
http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8
Не?
http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8
Не?
Куча ошибок при загрузке в 85
Не Digispark
у меня TinyOzOled библиотека исправлена, если с вашим дисплеем (128*32) будет аналогичная проблема как у меня (знаки сплюснуты были) - тогда скину исправленную.
Собрал, заработало и таки да сплюснуто. Как бы получить исправленную версию библиотеки TinyOzOled?
к сожалению не уверен что это конечная версия, проверить не на чем, файл TinyOzOLED.cpp
001
/*
002
OzOLED.cpp - 0.96' I2C 128x64 OLED Driver Library
003
2014 Copyright (c) OscarLiang.net All right reserved.
004
005
Author: Oscar Liang
006
007
This library is free software; you can redistribute it and/or
008
modify it under the terms of the GNU Lesser General Public
009
License as published by the Free Software Foundation; either
010
version 2.1 of the License, or (at your option) any later version.
011
012
This library is distributed in the hope that it will be useful,
013
but WITHOUT ANY WARRANTY; without even the implied warranty of
014
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015
Lesser General Public License for more details.
016
017
Uses TinyWireM instead of Wire llibrary. For Attiny processors
018
Change done by Andreas Spiess, <a href="mailto:sensorsiot@gmail.com">sensorsiot@gmail.com</a>
019
020
*/
021
022
023
024
025
#include "TinyOzOLED.h"
026
#include <TinyWireM.h>
027
#include <avr/pgmspace.h>
028
029
030
// 8x8 Font ASCII 32 - 127 Implemented
031
// Users can modify this to support more characters(glyphs)
032
// BasicFont is placed in code memory.
033
034
// This font be freely used without any restriction(It is placed in public domain)
035
const
byte
BasicFont[][8] PROGMEM = {
036
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
037
{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
038
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
039
{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
040
{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
041
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
042
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
043
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
044
{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
045
{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
046
{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
047
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
048
{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
049
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
050
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
051
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
052
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
053
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
054
{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
055
{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
056
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
057
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
058
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
059
{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
060
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
061
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
062
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
063
{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
064
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
065
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
066
{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
067
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
068
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
069
{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
070
{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
071
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
072
{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
073
{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
074
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
075
{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
076
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
077
{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
078
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
079
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
080
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
081
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
082
{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
083
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
084
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
085
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
086
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
087
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
088
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
089
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
090
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
091
{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
092
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
093
{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
094
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
095
{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
096
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
097
{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
098
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
099
{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
100
{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
101
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
102
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
103
{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
104
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
105
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
106
{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
107
{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
108
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
109
{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
110
{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
111
{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
112
{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
113
{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
114
{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
115
{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
116
{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
117
{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
118
{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
119
{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
120
{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
121
{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
122
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
123
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
124
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
125
{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
126
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
127
{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
128
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
129
{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
130
{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
131
{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}
132
};
133
134
135
// Big numbers font, from 0 to 9 - 96 bytes each.
136
const
byte
bigNumbers [][96] PROGMEM = {
137
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142
0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
143
144
{0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
145
0xF0, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
146
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
147
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148
0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x0F,
149
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00},
150
151
{0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
152
0xF0, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
153
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
154
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155
0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x0F,
156
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00},
157
158
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0,
159
0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
162
0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
164
165
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
166
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xC1, 0xC0, 0xC0, 0xC0,
167
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
168
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
169
0x03, 0x03, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x0F, 0x0F,
170
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
171
172
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
173
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xC1, 0xC0, 0xC0, 0xC0,
174
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
175
0x00, 0x00, 0x00, 0x81, 0x83, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x87,
176
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x0F, 0x0F,
177
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
178
179
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
180
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
181
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
182
0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
183
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
185
186
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
187
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
188
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0x81, 0x00, 0x00, 0x00, 0x00,
189
0x00, 0x00, 0x00, 0x81, 0x83, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x87,
190
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x0F, 0x0F,
191
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
192
193
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
194
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
195
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC1, 0x81, 0x00, 0x00, 0x00, 0x00,
196
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x87,
197
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x0F, 0x0F,
198
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
199
200
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
201
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
202
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
203
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
206
207
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
208
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE1,
209
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00,
210
0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x87, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x87,
211
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x0F, 0x0F,
212
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
213
214
{0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
215
0xF0, 0xF0, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
216
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
217
0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
218
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x00},
220
221
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223
0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0x00,
225
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
227
};
228
229
// ====================== LOW LEVEL =========================
230
void
OzOLED::sendCommand(
byte
command){
231
TinyWireM.beginTransmission(OLED_ADDRESS);
// begin transmitting
232
TinyWireM.send(OzOLED_COMMAND_MODE);
//data mode
233
TinyWireM.send(command);
234
TinyWireM.endTransmission();
// stop transmitting
235
}
236
237
void
OzOLED::sendData(
byte
data){
238
TinyWireM.beginTransmission(OLED_ADDRESS);
// begin transmitting
239
TinyWireM.send(OzOLED_DATA_MODE);
//data mode
240
TinyWireM.send(data);
241
TinyWireM.endTransmission();
// stop transmitting
242
}
243
244
void
OzOLED::printChar(
char
C,
byte
X,
byte
Y){
245
if
( X < 128 )
246
setCursorXY(X, Y);
247
//Ignore unused ASCII characters. Modified the range to support multilingual characters.
248
if
(C < 32 || C > 127)
249
C=
'*'
;
//star - indicate characters that can't be displayed
250
byte
src_b, b_out, b_tmp;
251
for
(
byte
i=0; i<8; i++) {
252
src_b = pgm_read_byte(&BasicFont[C-32][i]);
253
b_out = (src_b & 0x01) << 1;
254
b_tmp = (src_b & 0x02) << 2;
255
b_out |= b_tmp;
256
b_tmp = (src_b & 0x04) << 3;
257
b_out |= b_tmp;
258
b_tmp = (src_b & 0x08) << 4;
259
b_out |= b_tmp;
260
//read bytes from code memory
261
sendData(b_out);
//font array starts at 0, ASCII starts at 32. Hence the translation
262
}
263
setCursorXY(X, ++Y);
264
for
(
byte
i=0; i<8; i++) {
265
src_b = pgm_read_byte(&BasicFont[C-32][i]);
266
b_out = (src_b & 0x10) >> 3;
267
b_tmp = (src_b & 0x20) >> 2;
268
b_out |= b_tmp;
269
b_tmp = (src_b & 0x40) >> 1;
270
b_out |= b_tmp;
271
b_tmp = (src_b & 0x80);
272
b_out |= b_tmp;
273
//read bytes from code memory
274
sendData(b_out);
//font array starts at 0, ASCII starts at 32. Hence the translation
275
}
276
}
277
278
void
OzOLED::printString(
const
char
*String,
byte
X,
byte
Y,
byte
numChar){
279
if
( X < 128 )
280
setCursorXY(X, Y);
281
byte
count=0;
282
while
(String[count] && count<numChar){
283
printChar(String[count++],X,Y);
284
++X;
285
}
286
}
287
288
byte
OzOLED::printNumber(
long
long_num,
byte
X,
byte
Y){
289
if
( X < 128 )
290
setCursorXY(X, Y);
291
byte
char_buffer[10] =
""
;
292
byte
i = 0;
293
byte
f = 0;
// number of characters
294
if
(long_num < 0) {
295
f++;
296
printChar(
'-'
,X,Y);
297
long_num = -long_num;
298
}
299
else
if
(long_num == 0) {
300
f++;
301
printChar(
'0'
,X,Y);
302
return
f;
303
}
304
while
(long_num > 0) {
305
char_buffer[i++] = long_num % 10;
306
long_num /= 10;
307
}
308
f += i;
309
for
(; i > 0; i--) {
310
printChar(
'0'
+ char_buffer[i - 1],(X+(f-i)),Y);
311
}
312
return
f;
313
}
314
315
byte
OzOLED::printNumber(
float
float_num,
byte
prec,
byte
X,
byte
Y){
316
if
( X < 128 )
317
setCursorXY(X, Y);
318
// prec - 6 maximum
319
byte
num_int = 0;
320
byte
num_frac = 0;
321
byte
num_extra = 0;
322
long
d = float_num;
// get the integer part
323
float
f = float_num - d;
// get the fractional part
324
if
(d == 0 && f < 0.0){
325
printChar(
'-'
,X,Y);
326
++X;
327
num_extra++;
328
printChar(
'0'
,X,Y);
329
++X;
330
num_extra++;
331
f *= -1;
332
}
333
else
if
(d < 0 && f < 0.0){
334
num_int = printNumber(d,X,Y);
// count how many digits in integer part
335
X += num_int;
336
f *= -1;
337
}
338
else
{
339
num_int = printNumber(d,X,Y);
// count how many digits in integer part
340
X += num_int;
341
}
342
// only when fractional part > 0, we show decimal point
343
if
(f > 0.0){
344
printChar(
'.'
,X,Y);
345
++X;
346
num_extra++;
347
long
f_shift = 1;
348
if
(num_int + prec > 8)
349
prec = 8 - num_int;
350
for
(
byte
j=0; j<prec; j++){
351
f_shift *= 10;
352
}
353
num_frac = printNumber((
long
)(f*f_shift),X,Y);
// count how many digits in fractional part
354
}
355
return
num_int + num_frac + num_extra;
356
}
357
358
void
OzOLED::printBigNumber(
const
char
*number,
byte
X,
byte
Y,
byte
numChar){
359
// big number pixels: 24 x 32
360
// Y - page
361
byte
column = 0;
362
byte
count = 0;
363
byte
onech[96];
364
while
(number[count] && count<numChar){
365
setCursorXY(X, Y);
366
// update for China OLED display 128*32
367
byte
src_b, b_out, b_tmp;
368
for
(
byte
i=0; i<4; ++i) {
369
byte
j;
370
for
(j=0; j<24; ++j) {
371
if
(number[count] < 46 || number[count] > 58)
372
sendData(0);
373
else
{
374
src_b = pgm_read_byte(&bigNumbers[number[count]-46][(i*24)+j]);
375
onech[(i*24)+j] = src_b;
376
b_out = (src_b & 0x01) << 1;
377
b_tmp = (src_b & 0x02) << 2;
378
b_out |= b_tmp;
379
b_tmp = (src_b & 0x04) << 3;
380
b_out |= b_tmp;
381
b_tmp = (src_b & 0x08) << 4;
382
b_out |= b_tmp;
383
sendData(b_out);
384
}
385
}
386
column = 0;
387
setCursorXY(X, ++Y);
388
for
(j=0; j<24; ++j) {
389
if
(number[count] < 46 || number[count] > 58)
390
sendData(0);
391
else
{
392
//src_b = pgm_read_byte(&bigNumbers[number[count]-46][(i*24)+j]);
393
src_b = onech[(i*24)+j];
394
b_out = (src_b & 0x10) >> 3;
395
b_tmp = (src_b & 0x20) >> 2;
396
b_out |= b_tmp;
397
b_tmp = (src_b & 0x40) >> 1;
398
b_out |= b_tmp;
399
b_tmp = (src_b & 0x80);
400
b_out |= b_tmp;
401
sendData(b_out);
402
}
403
}
404
column = 0;
405
setCursorXY(X, ++Y);
406
}
407
count++;
408
X = X + 3;
409
Y = Y - 8;
410
}
411
}
412
413
void
OzOLED::drawBitmap(
const
byte
*bitmaparray,
byte
X,
byte
Y,
byte
width,
byte
height){
414
// max width = 16
415
// max height = 8
416
setCursorXY( X, Y );
417
byte
column = 0;
418
for
(
int
i=0; i<width*8*height; i++) {
419
sendData(pgm_read_byte(&bitmaparray[i]));
420
if
(++column == width*8) {
421
column = 0;
422
setCursorXY( X, ++Y );
423
}
424
}
425
}
426
427
// =================== High Level ===========================
428
429
void
OzOLED::init(){
430
TinyWireM.begin();
431
/* // upgrade to 400KHz! (only use when your other i2c device support this speed)
432
if (I2C_400KHZ){
433
// save I2C bitrate (default 100Khz)
434
byte twbrbackup = TWBR;
435
TWBR = 12;
436
//TWBR = twbrbackup;
437
//Serial.println(TWBR, DEC);
438
//Serial.println(TWSR & 0x3, DEC);
439
}*/
440
setPowerOff();
//display off
441
delay(10);
442
setPowerOn();
//display on
443
delay(10);
444
setNormalDisplay();
//default Set Normal Display
445
setPageMode();
// default addressing mode
446
clearDisplay();
447
setCursorXY(0,0);
448
sendCommand(0x8d);
//Charge Pump
449
sendCommand(0x14);
450
}
451
452
void
OzOLED::setCursorXY(
byte
X,
byte
Y){
453
// Y - 1 unit = 1 page (8 pixel rows)
454
// X - 1 unit = 8 pixel columns
455
sendCommand(0x00 + (8*X & 0x0F));
//set column lower address
456
sendCommand(0x10 + ((8*X>>4)&0x0F));
//set column higher address
457
sendCommand(0xB0 + Y);
//set page address
458
}
459
460
461
void
OzOLED::clearDisplay() {
462
for
(
byte
page=0; page<8; page++) {
463
setCursorXY(0, page);
464
for
(
byte
column=0; column<128; column++){
//clear all columns
465
sendData(0x00);
466
}
467
}
468
setCursorXY(0,0);
469
}
470
471
/*
472
void OzOLED::clearPage(byte page) {
473
// clear page and set cursor at beginning of that page
474
475
setCursorXY(0, page);
476
for(byte column=0; column<128; column++){ //clear all columns
477
sendData(0x00);
478
}
479
480
}
481
*/
482
483
484
void
OzOLED::setInverseDisplay(){
485
sendCommand(OzOLED_CMD_INVERSE_DISPLAY);
486
}
487
488
void
OzOLED::setNormalDisplay(){
489
sendCommand(OzOLED_CMD_NORMAL_DISPLAY);
490
}
491
492
void
OzOLED::setPowerOff(){
493
sendCommand(OzOLED_CMD_DISPLAY_OFF);
494
}
495
496
void
OzOLED::setPowerOn(){
497
sendCommand(OzOLED_CMD_DISPLAY_ON);
498
}
499
500
void
OzOLED::setBrightness(
byte
Brightness){
501
sendCommand(OzOLED_CMD_SET_BRIGHTNESS);
502
sendCommand(Brightness);
503
}
504
505
void
OzOLED::setPageMode(){
506
addressingMode = PAGE_ADDRESSING;
507
sendCommand(0x20);
//set addressing mode
508
sendCommand(PAGE_ADDRESSING);
//set page addressing mode
509
}
510
511
void
OzOLED::setHorizontalMode(){
512
addressingMode = HORIZONTAL_ADDRESSING;
513
sendCommand(0x20);
//set addressing mode
514
sendCommand(HORIZONTAL_ADDRESSING);
//set page addressing mode
515
}
516
517
// startscrollright
518
// Activate a right handed scroll for rows start through stop
519
// Hint, the display is 16 rows tall. To scroll the whole display, run:
520
// scrollRight(0x00, 0x0F) - start - stop
521
void
OzOLED::scrollRight(
byte
start,
byte
end,
byte
speed){
522
sendCommand(OzOLED_RIGHT_SCROLL);
//Horizontal Scroll Setup
523
sendCommand(0x00);
// dummy byte
524
sendCommand(start);
// start page address
525
sendCommand(speed);
// set time interval between each scroll
526
sendCommand(end);
// end page address
527
sendCommand(0x01);
528
sendCommand(0xFF);
529
sendCommand(0x2f);
//active scrolling
530
}
531
532
// startscrollleft
533
// Activate a right handed scroll for rows start through stop
534
// Hint, the display is 16 rows tall. To scroll the whole display, run:
535
// display.scrollright(0x00, 0x0F) - start - stop
536
void
OzOLED::scrollLeft(
byte
start,
byte
end,
byte
speed){
537
sendCommand(OzOLED_LEFT_SCROLL);
//Horizontal Scroll Setup
538
sendCommand(0x00);
// dummy byte
539
sendCommand(start);
// start page address
540
sendCommand(speed);
// set time interval between each scroll
541
sendCommand(end);
// end page address
542
sendCommand(0x01);
543
sendCommand(0xFF);
544
sendCommand(0x2f);
//active scrolling
545
}
546
547
// startscrolldiagright
548
// Activate a diagonal scroll for rows start through stop
549
// Hint, the display is 16 rows tall. To scroll the whole display, run:
550
// display.scrollright(0x00, 0x0F)
551
void
OzOLED::scrollDiagRight(){
552
sendCommand(OzOLED_SET_VERTICAL_SCROLL_AREA);
553
sendCommand(0X00);
554
sendCommand(OzOLED_Max_Y);
555
sendCommand(OzOLED_VERTICAL_RIGHT_SCROLL);
//Vertical and Horizontal Scroll Setup
556
sendCommand(0X00);
//dummy byte
557
sendCommand(0x00);
//define page0 as startpage address
558
sendCommand(0X00);
//set time interval between each scroll ste as 6 frames
559
sendCommand(0x07);
//define page7 as endpage address
560
sendCommand(0X01);
//set vertical scrolling offset as 1 row
561
sendCommand(OzOLED_CMD_ACTIVATE_SCROLL);
//active scrolling
562
}
563
564
void
OzOLED::scrollDiagLeft(){
565
sendCommand(OzOLED_SET_VERTICAL_SCROLL_AREA);
566
sendCommand(0X00);
567
sendCommand(OzOLED_Max_Y);
568
sendCommand(OzOLED_VERTICAL_LEFT_SCROLL);
//Vertical and Horizontal Scroll Setup
569
sendCommand(0X00);
//dummy byte
570
sendCommand(0x00);
//define page0 as startpage address
571
sendCommand(0X00);
//set time interval between each scroll ste as 6 frames
572
sendCommand(0x07);
//define page7 as endpage address
573
sendCommand(0X01);
//set vertical scrolling offset as 1 row
574
sendCommand(OzOLED_CMD_ACTIVATE_SCROLL);
//active scrolling
575
}
576
577
578
void
OzOLED::setActivateScroll(
byte
direction,
byte
startPage,
byte
endPage,
byte
scrollSpeed){
579
/*
580
This function is still not complete, we need more testing also.
581
Use the following defines for 'direction' :
582
Scroll_Left
583
Scroll_Right
584
For Scroll_vericle, still need to debug more...
585
Use the following defines for 'scrollSpeed' :
586
Scroll_2Frames
587
Scroll_3Frames
588
Scroll_4Frames
589
Scroll_5Frames
590
Scroll_25Frames
591
Scroll_64Frames
592
Scroll_128Frames
593
Scroll_256Frames
594
*/
595
if
(direction == Scroll_Right) {
596
//Scroll Right
597
sendCommand(0x26);
598
}
599
else
{
600
//Scroll Left
601
sendCommand(0x27);
602
}
603
/*
604
else if (direction == Scroll_Up ){
605
//Scroll Up
606
sendCommand(0x29);
607
}
608
else{
609
//Scroll Down
610
sendCommand(0x2A);
611
}
612
*/
613
sendCommand(0x00);
//dummy byte
614
sendCommand(startPage);
615
sendCommand(scrollSpeed);
616
sendCommand(endPage);
// for verticle scrolling, use 0x29 as command, endPage should = start page = 0
617
/*
618
if(direction == Scroll_Up) {
619
sendCommand(0x01);
620
}
621
*/
622
sendCommand(OzOLED_CMD_ACTIVATE_SCROLL);
623
}
624
625
void
OzOLED::setDeactivateScroll(){
626
sendCommand(OzOLED_CMD_DEACTIVATE_SCROLL);
627
}
628
629
OzOLED OzOled;
// Preinstantiate Objects
- исправлена одна функция
01
void
OzOLED::printBigNumber(
const
char
*number,
byte
X,
byte
Y,
byte
numChar){
02
// big number pixels: 24 x 32
03
// Y - page
04
byte
column = 0;
05
byte
count = 0;
06
byte
onech[96];
07
while
(number[count] && count<numChar){
08
setCursorXY(X, Y);
09
// update for China OLED display 128*32
10
byte
src_b, b_out, b_tmp;
11
for
(
byte
i=0; i<4; ++i) {
12
byte
j;
13
for
(j=0; j<24; ++j) {
14
if
(number[count] < 46 || number[count] > 58)
15
sendData(0);
16
else
{
17
src_b = pgm_read_byte(&bigNumbers[number[count]-46][(i*24)+j]);
18
onech[(i*24)+j] = src_b;
19
b_out = (src_b & 0x01) << 1;
20
b_tmp = (src_b & 0x02) << 2;
21
b_out |= b_tmp;
22
b_tmp = (src_b & 0x04) << 3;
23
b_out |= b_tmp;
24
b_tmp = (src_b & 0x08) << 4;
25
b_out |= b_tmp;
26
sendData(b_out);
27
}
28
}
29
column = 0;
30
setCursorXY(X, ++Y);
31
for
(j=0; j<24; ++j) {
32
if
(number[count] < 46 || number[count] > 58)
33
sendData(0);
34
else
{
35
//src_b = pgm_read_byte(&bigNumbers[number[count]-46][(i*24)+j]);
36
src_b = onech[(i*24)+j];
37
b_out = (src_b & 0x10) >> 3;
38
b_tmp = (src_b & 0x20) >> 2;
39
b_out |= b_tmp;
40
b_tmp = (src_b & 0x40) >> 1;
41
b_out |= b_tmp;
42
b_tmp = (src_b & 0x80);
43
b_out |= b_tmp;
44
sendData(b_out);
45
}
46
}
47
column = 0;
48
setCursorXY(X, ++Y);
49
}
50
count++;
51
X = X + 3;
52
Y = Y - 8;
53
}
54
}
Спасибо. Сейчас проверю.
UPD. Да все корректно отображается. Погрел, подышал - показания с задержкой меняются адекватно. Я делал метеостанцию на BME280, 1602 и tiny85, но ваш проект более компактный, это и понравилось.
Взял ваш проект переделал в Atmel Studio C++, вроде как работает, но давление почему то плюс минул трамвайная остановка... Детально... прошил, работает и вроде как адекватные показания давление показывает. Скидываю питание опять включаю, и все... 702, скину опять может быть 735, или 768, но никак не реальные 740. Температура и влажность чуть завышены на 1-2 градуса, влажность 1-5%. Я так понимаю это просто переписанная библиотека MyBME280.h
1) как у вас получилось 1Mhz частота МК, у вас делитель стоит на 8? У меня все завелось на 8MHz
И подскажите на что смотреть, глянул по лог.анализатору ни чего не увидел криминального... может переделать считывание калибровочных регистров 0x88...0xA1 и 0xE1...0xE7...
Здравствуйте. Какая самая последняя идеально рабочая версия прошивки?
Здравствуйте. У меня нет никаких версий прошивок, сделал, поставил и забыл, каждый день смотрю данные.
Тогда какой скетч использовать?
http://arduino.ru/forum/proekty/miniatyurnyi-komnatnyi-termometr-na-atti...
Можете еще, пожалуйста, сбросить еще вашу библиотеку TinyOzOLED.
И обвязка есть на tiny85?
Батарейка CR2032 1 или 2 последовательно?
Библиотека на гитхабе, исправленный файл тут
http://arduino.ru/forum/proekty/miniatyurnyi-komnatnyi-termometr-na-atti...
Из обвязки только резистор 10 ком между reset и питанием, ну можно ещё конденсатор на 100...300 мкФ на питание.
Одна батарейка cr2032 или 2 параллельно, если подключите последовательно - сгорит МК и bme280.
В первом сообщении темы фото, там виден только резистор, больше ничего нет.
Куда подключаются пины 3 и 6?
на пине 2 кнопка, 5 и 7 шина i2C, 4 земля и 8 плюс питания. Остальные пины свободны. можете reset (пин1) резистором подтянуть к плюсу, у меня и без этого работает.
Возможно температуру отображать с одним знаком после комы?
На символы градуса и влажности памяти не хватает?
Пины 3 и 6 никуда не подключается.
Как сказал один мой давний друг "сделать можно все", но мне это не надо, времени на испробовать у меня нет, поэтому все в ваших руках, исправляйте как хочется.
По поводу памяти - все зависит от рукожопости программиста - можно многое реализовать.
Питание на дисплей и датчик идет постоянно ???
да, все загоняется в спящий режим, поэтому одной батарейки CR2032 хватает минимум на 8 месяцев
Пытаюсь повторить ваш проект. Не работает дисплей OLED128x32. Подключаю его к ардуине нано, закачиваю скетч SSD1306, дисплей все прекрасно отрабатывает. Подключаю к ATTINY85- экран черный. Питание есть. Может библиотека не подходит? Ядро ATTINYCORE без загрузчика.
На ядре ATTINYCORE с платой в настройках ATtiny48/85 (Optiboot) все работает сейчас у меня. Прошивал через USBasp с программы
Подключаю к ATTINY85- экран черный. Питание есть. Может библиотека не подходит? Ядро ATTINYCORE без загрузчика.
Чем шьете Tiny?
Зашивайте хекс по ссылке - точно рабочий.
https://disk.yandex.ru/d/L6yfAyrfEfuA2w
Пытаюсь повторить ваш проект. Не работает дисплей OLED128x32. Подключаю его к ардуине нано, закачиваю скетч SSD1306, дисплей все прекрасно отрабатывает. Подключаю к ATTINY85- экран черный. Питание есть. Может библиотека не подходит? Ядро ATTINYCORE без загрузчика.
В инициализации дисплея в библиотеке есть ошибка, тут на форуме было очень давно, при включении питания дисплей не работает, при сбросе МК и соответственно повторной инициализации все взлетало :(
Что самое инересное: недавно помер от старости индикатор oled уличной температуры, заказал новый и этот косяк исчез, т е китайцы что то подкрутили.
Собрал,все работает) Спасибо за проект. Но вот влажность показывает нулевую. Температуру хочется выводить с одним знаком после запятой( не сообразил как это сделать).Так и должно быть, в комнате 24гр, показывает 24гр, кладу к окну,там 4гр, а этот показывает 24гр, при след.нажатии на кнопку показания уменьшаются на 0.2-0.4гр, еще раз нажимаем-еще на 0.2-0.5гр, а то и на пару сотых. По идее температура должна уменьшаться сразу, ну пусть с небольшой задержкой., но не так же, она изменяется только после нажатия кнопки и то совcем по чуть чуть.
И еще цикл индикации длится не 38сек, а каких то 5-6сек( частота 1МГц). При частоте 8МГц индикация продолжается 38сек.Но температура не меняется пока этот цикл не завершится. Получается что этот термометр не нужен, так как он слишком инертный.
А так, да, всё работает. :)))
А так, да, всё работает. :)))
Ну работает, может и так как автор хотел. Но в моем понимании термометр хотя бы должен в течении 30сек выдать точную температуру, а он по несколько десятых изменяет и то при нажатии на кнопку.