Тема: ATtiny2313 + DHT11 (Arduino IDE)
Помогите подружить Тиньку с датчиком DHT21
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Переделки → ATtiny2313 + DHT11 (Arduino IDE)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Помогите подружить Тиньку с датчиком DHT21
Опрос DHT21 аналогичен DHT11, только DHT11 не содержит некоторых данных.
Массив data_dht[] имеет 5 значений data_dht[0] влажность целое data_dht[1] влажность после запятой ,
data_dht[2] температура целое data_dht[3] температура после запятой.
Может поможете Sketch изменить у меня Sketch с сайта показывает t 55, H 53.
Хотя с этим датчиком ардуинка показывает нормальные данные t 23, H 20.
Должно получится что то типа этого:
byte data_dht[5];
void setup(){}
void loop() {
dht_read();
delay(3000);
print_time(data_dht[2]*10|data_dht[3],2,7,1);
delay(3000);
print_time(data_dht[0]*10|data_dht[1],2,7,0);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << 0);del();
if (dig & 0x01)
DDRB &= ~(1 << 1);
else
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
dig = dig >> 1;
}
DDRB |= (1 << 0);
DDRB &= ~(1 << 1);del();
DDRB &= ~(1 << 0);del();
if (((PINB >> 1) & 1) == 0)
DDRB |= (1 << 1);del();
DDRB |= (1 << 0);del();
}
void tm_stop(){
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
DDRB &= ~(1 << 1);del();
}
void tm_start(){
DDRB |= (1 << 1);del();
}
void print_time(int t, byte pd_t, int br, bool mn){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0;
if(mn == 1){data0 = 11;}else{data0 = 12;}
int data1 = 10;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01111000;break; // t
case 12: data = 0b01110110;break; // H
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
switch(pd_t){
case 1 : data2 = data2+0b10000000;break;
case 2 : data1 = data1+0b10000000;break;
case 3 : data0 = data0+0b10000000;break;
}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2);
delay(1);
PORTB |= (1 << 2);
delayMicroseconds(60);
DDRB &= ~(1 << 2);
delayMicroseconds(80);
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(30);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
Попробуйте этот код:
byte data_dht[5];
void setup(){}
void loop() {
dht_read();
delay(3000);
print_time(data_dht[2]*10|data_dht[3],0,0,0);
delay(3000);
print_time(data_dht[0]*10|data_dht[1],0,0,0);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << 0);del();
if (dig & 0x01)
DDRB &= ~(1 << 1);
else
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
dig = dig >> 1;
}
DDRB |= (1 << 0);
DDRB &= ~(1 << 1);del();
DDRB &= ~(1 << 0);del();
if (((PINB >> 1) & 1) == 0)
DDRB |= (1 << 1);del();
DDRB |= (1 << 0);del();
}
void tm_stop(){
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
DDRB &= ~(1 << 1);del();
}
void tm_start(){
DDRB |= (1 << 1);del();
}
void print_time(int t, byte pd_t, int br, bool mn){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0;
if(mn == 1){data0 = 11;}else{data0 = 12;}
int data1 = 10;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01111000;break; // t
case 12: data = 0b01110110;break; // H
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
switch(pd_t){
case 1 : data2 = data2+0b10000000;break;
case 2 : data1 = data1+0b10000000;break;
case 3 : data0 = data0+0b10000000;break;
}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2);
delay(1);
PORTB |= (1 << 2);
delayMicroseconds(60);
DDRB &= ~(1 << 2);
delayMicroseconds(80);
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(30);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
Может это поможет
float DHT::readTemperature(bool S, bool force) {
float f = NAN;
if (read(force)) {
switch (_type) {
case DHT11:
f = data[2];
if (data[3] & 0x80) {
f = -1 - f;
}
f += (data[3] & 0x0f) * 0.1;
if (S) {
f = convertCtoF(f);
}
break;
case DHT12:
f = data[2];
f += (data[3] & 0x0f) * 0.1;
if (data[2] & 0x80) {
f *= -1;
}
if (S) {
f = convertCtoF(f);
}
break;
case DHT22:
case DHT21:
f = ((word)(data[2] & 0x7F)) << 8 | data[3];
f *= 0.1;
if (data[2] & 0x80) {
f *= -1;
}
if (S) {
f = convertCtoF(f);
}
break;
}
}
return f;
Последняя попытка:
byte data_dht[5];
void setup(){}
void loop() {
dht_read();
delay(3000);
print_time(data_dht[2]*10|data_dht[3],0,7,1);
delay(3000);
print_time(data_dht[0]*10|data_dht[1],0,7,0);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << 0);del();
if (dig & 0x01)
DDRB &= ~(1 << 1);
else
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
dig = dig >> 1;
}
DDRB |= (1 << 0);
DDRB &= ~(1 << 1);del();
DDRB &= ~(1 << 0);del();
if (((PINB >> 1) & 1) == 0)
DDRB |= (1 << 1);del();
DDRB |= (1 << 0);del();
}
void tm_stop(){
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
DDRB &= ~(1 << 1);del();
}
void tm_start(){
DDRB |= (1 << 1);del();
}
void print_time(int t, byte pd_t, int br, bool mn){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0;
if(mn == 1){data0 = 11;}else{data0 = 12;}
int data1 = t /100;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01111000;break; // t
case 12: data = 0b01110110;break; // H
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
switch(pd_t){
case 1 : data2 = data2+0b10000000;break;
case 2 : data1 = data1+0b10000000;break;
case 3 : data0 = data0+0b10000000;break;
}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2);
delay(1);
PORTB |= (1 << 2);
delayMicroseconds(60);
DDRB &= ~(1 << 2);
delayMicroseconds(80);
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(30);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
Мне в чужом коде очень трудно разобраться
Загрузите этот код чтобы проверить индикатор
byte data_dht[5];
void setup(){}
void loop() {
// dht_read();
delay(3000);
print_time(255,0,7,1);
delay(3000);
print_time(255,0,7,0);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << 0);del();
if (dig & 0x01)
DDRB &= ~(1 << 1);
else
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
dig = dig >> 1;
}
DDRB |= (1 << 0);
DDRB &= ~(1 << 1);del();
DDRB &= ~(1 << 0);del();
if (((PINB >> 1) & 1) == 0)
DDRB |= (1 << 1);del();
DDRB |= (1 << 0);del();
}
void tm_stop(){
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
DDRB &= ~(1 << 1);del();
}
void tm_start(){
DDRB |= (1 << 1);del();
}
void print_time(int t, byte pd_t, int br, bool mn){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0;
if(mn == 1){data0 = 11;}else{data0 = 12;}
int data1 = t /100;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01111000;break; // t
case 12: data = 0b01110110;break; // H
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
switch(pd_t){
case 1 : data2 = data2+0b10000000;break;
case 2 : data1 = data1+0b10000000;break;
case 3 : data0 = data0+0b10000000;break;
}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2);
delay(1);
PORTB |= (1 << 2);
delayMicroseconds(60);
DDRB &= ~(1 << 2);
delayMicroseconds(80);
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(30);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
может проц поменять или изменить ногу проца для датчика,только я не знаю как
Я неправильно собираю байт:
Сейчас попробую собрать как положено
На экране Н меняется на t?
byte data_dht[5];
void setup(){}
void loop() {
dht_read();
delay(3000);
print_time(data_dht[2]*256+data_dht[3],0,7,1);
delay(3000);
print_time(data_dht[0]*256+data_dht[1],0,7,0);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << 0);del();
if (dig & 0x01)
DDRB &= ~(1 << 1);
else
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
dig = dig >> 1;
}
DDRB |= (1 << 0);
DDRB &= ~(1 << 1);del();
DDRB &= ~(1 << 0);del();
if (((PINB >> 1) & 1) == 0)
DDRB |= (1 << 1);del();
DDRB |= (1 << 0);del();
}
void tm_stop(){
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
DDRB &= ~(1 << 1);del();
}
void tm_start(){
DDRB |= (1 << 1);del();
}
void print_time(int t, byte pd_t, int br, bool mn){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0;
if(mn == 1){data0 = 11;}else{data0 = 12;}
int data1 = t /100;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01111000;break; // t
case 12: data = 0b01110110;break; // H
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
switch(pd_t){
case 1 : data2 = data2+0b10000000;break;
case 2 : data1 = data1+0b10000000;break;
case 3 : data0 = data0+0b10000000;break;
}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2);
delay(1);
PORTB |= (1 << 2);
delayMicroseconds(100);
DDRB &= ~(1 << 2);
delayMicroseconds(80);
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(30);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
Жаль что у меня нет такого датчика, хотелось разобраться как его запускать.
В даташите есть картинка
По коду:
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2); // делаю низкий уровень
delay(1); // жду 1 мс
PORTB |= (1 << 2); // делаю высокий уровень
delayMicroseconds(100); // жду 100 мкс пропуская паузу в 20 мкс и 80 мкс
DDRB &= ~(1 << 2); // делаю пин как вход
delayMicroseconds(80); // жду последние 80 мкс до начала данных
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(26);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
Вроде все верно, единственной замените строку:
delayMicroseconds(30);
на
delayMicroseconds(26);
так как на картинке указано что не более 26 мкс
Если не получится, то все, не имея модуля на руках я не смогу его запустить.
Тоже самое, жаль удобный датчик с корпусом
Спасибо за помощь
byte data_dht[5];
void setup(){
}
void loop() {
dht_read();
delay(3000);
print_time(data_dht[2]*256+data_dht[3],0,7,1);
delay(3000);
print_time(data_dht[0]*256+data_dht[1],0,7,0);
}
void tm_dec(byte dig){
for(int i = 0; i < 8; i++) {
DDRB |= (1 << 0);del();
if (dig & 0x01)
DDRB &= ~(1 << 1);
else
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
dig = dig >> 1;
}
DDRB |= (1 << 0);
DDRB &= ~(1 << 1);del();
DDRB &= ~(1 << 0);del();
if (((PINB >> 1) & 1) == 0)
DDRB |= (1 << 1);del();
DDRB |= (1 << 0);del();
}
void tm_stop(){
DDRB |= (1 << 1);del();
DDRB &= ~(1 << 0);del();
DDRB &= ~(1 << 1);del();
}
void tm_start(){
DDRB |= (1 << 1);del();
}
void print_time(int t, byte pd_t, int br, bool mn){
tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
tm_dec(0x40);tm_stop();tm_start();
int data0;
if(mn == 1){data0 = 11;}else{data0 = 12;}
int data1 = t /100;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
case 10: data = 0b00000000;break; // пусто
case 11: data = 0b01111000;break; // t
case 12: data = 0b01110110;break; // H
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
switch(pd_t){
case 1 : data2 = data2+0b10000000;break;
case 2 : data1 = data1+0b10000000;break;
case 3 : data0 = data0+0b10000000;break;
}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delayMicroseconds(200);}
int dht_read(){
byte i = 0,i1 = 0;
for(i = 0;i < 5;i++){data_dht[i] = 0;}
DDRB |=(1 << 2);
PORTB &= ~(1 << 2);
delay(1);
PORTB |= (1 << 2);
delayMicroseconds(80);
DDRB &= ~(1 << 2);
delayMicroseconds(60);
while(PINB & (1 << 2));
for (i = 0; i < 5; i++){
data_dht[i]=0;
for (i1=0; i1<8; i1++){
while(!(PINB & (1 << 2)));
delayMicroseconds(26);
if (PINB & (1 << 2)){data_dht[i] |= 1 << (7-i1);}
while(PINB & (1 << 2));
}}return 1;}
t008 h008 не изменилась.
После нового года DHT22 приедет с ним попробую
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
forum.rcl-radio.ru → Переделки → ATtiny2313 + DHT11 (Arduino IDE)
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|