Derzeit versuche ich, ein Byte von meinem dht11-Sensor zu lesen und in das virtuelle Terminal zu schreiben, aber ich konnte kein einfaches Datenblatt für Anfänger finden. Ich fand einen etwas komplizierten mikroC-Code und eine Einrichtung mit pic16f628a und lcd. Sie können es hier finden. Das funktioniert, aber wenn ich ein virtuelles Terminal hinzufüge. Auf dem virtuellen Terminal wird nichts angezeigt, selbst wenn ich die erforderlichen mikroC-Codes hinzufüge. Während meines zweiten Versuchs, ich ersetze meinen Mikrocontroller durch pic16f877a, kann ich diesen Text auf dem virtuellen Terminal "Keine Antwort vom Sensor" sehen, was die Fehlermeldung meines mikroC-Codes ist.
Hier sind einige Informationen über dht11; DHT11 verwendet eine vereinfachte Single-Bus-Kommunikation. Einzelbus, der nur eine Datenleitung, das System des Datenaustauschs, Steuerung durch einen einzigen Bus zu vervollständigen. Es sendet ein 40-Bit-Datenformat: Die ganzzahligen 8-Bit-Luftfeuchtigkeitsdaten + 8-Bit-Dezimaldaten der Luftfeuchtigkeit +8-Bit-Ganzzahl-Temperaturdaten + 8-Bit-Teiltemperaturdaten +8-Bit-Paritätsbit. Sie finden das Datenblatt auch von: hier
Vor ein paar Wochen wollte ich eine einfache Schaltung aufbauen, die Feuchtigkeit und Temperatur in der Luft messen soll. Wenn ich anfange zu recherchieren, habe ich keine Kenntnisse darüber, wie man eine Schaltung einrichtet oder wie ich einen Code in eine Mikrocontrollereinheit einbetten kann und viele ähnliche Fragen.
Im Folgenden erkläre ich meine kleine Herausforderung Schritt für Schritt. Ich hoffe, es wird hilfreich sein. Bevor wir anfangen, sollten Sie Ihre Tassen auffüllen, es könnte etwas lang dauern.
Hier ist nun meine Komponentenliste;
Bild 16F877A (40-Pin) Quarz 4,0 MHz 22pF Kondensator 100nJ Kondensator (0,1uF) 330nJ Kondensator (0,3uF) DHT11 (Feuchtigkeits- und Temperatursensor) 1uF Kondensator (1 Mikrof) 10uF Kondensator max232 RS232 DB9 Anschluss 9V Batterie & Batterieverschluss
Einrichten;
1) Steckbrett
Einige Arten von Steckbrettern haben eine positive oder negative Leitung durch die Platine, auf der anderen Seite können die Strom- und Erdungsleitungen der anderen Typen in zwei Teile geteilt werden. Sie können dies herausfinden, indem Sie sich die roten und blauen Linien auf dem Steckbrett ansehen. Und im Inneren gibt es Buchstaben und Zahlen. Zahlen repräsentieren die Säulen, die miteinander verbunden sind. Wenn ich also 5 V an A-0 anschließe, haben B-0, C-0, D-0 und E-0 die gleiche Spannung.
2) 7805 Regler (9V bis 5V)
Wenn Sie die Datenblätter von pic16f877a und dht11 gelesen haben, haben Sie erfahren, dass sie mit 5 V arbeiten, unsere Batterie jedoch 9 V hat.
Wie Sie oben sehen können, können Sie Ihre Spannung leicht regulieren. Jetzt können Sie Ihre positiven Klemmen vom Ausgang des Reglers speisen.
3) DHT11 (Sensor)
Dies ist ein günstiger, digitaler Feuchtigkeits- und Temperatursensor mit 4 Pins. Hier ist ein schönes Datenblatt (aufgrund meines guten Rufs konnte ich nicht mehr als 2 Links posten. Sie können es bei Google finden, wenn Sie es finden, werfen Sie einen Blick auf zwei oder mehr Datenblätter, da einige davon möglicherweise nicht klar genug sind). wichtig, um zu verstehen, wie dht11 funktioniert. Während Sie an elektronischen Projekten arbeiten, werden Sie in einer wirklich kurzen Erklärung auf Vcc-, Vdd-, Vss- und Vee-Pins stoßen. Vcc und Vdd sind eine positive Spannungsversorgung, Vee und Vss sind eine negative Masseversorgung. Sie können also davon ausgehen, dass Vcc und Vdd für die folgenden Bilder gleich sind.
4) Bild 16F877A (40-polig)
Dies ist eine bekannte Mikrocontrollereinheit, die leicht zu finden ist und genug Bein für mein Projekt hat, deshalb bevorzuge ich dieses Bild. Hier ist das Datenblatt: (Leider konnte ich aufgrund meines Rufs nicht mehr als 2 Links posten. Sie finden es auf der Webseite von Mikrochip) Das Datenblatt zeigt Ihnen das Pin-Diagramm. Im Diagramm sehen Sie Zahlen von 1 bis 40. Auf dem folgenden Bild sehen Sie den kleinen eingestürzten Punkt. Es repräsentiert das Hinspiel.
5) Kristall (Uhr)
Wie jeder Prozessor muss auch der 877a takten. Bitte beachten Sie nicht die Kristall-Mhz des Schemas, unsere Schaltung arbeitet mit 4-MHz-Quarzkristall mit 22-pF-Kondensatoren.
6) Max232
Ok, wie gesagt, dieses Projekt wird Temperatur und Luftfeuchtigkeit messen und diese Werte an den Computer senden. Um diese Werte von unserer Schaltung zum PC zu bekommen, müssen wir an dieser Stelle einen seriellen Kommunikationsteil bauen. Haben Sie keine Angst vor Telekommunikationswörtern, mit Hilfe des RS-232-Kabels ist alles ganz einfach. Bevor Sie das Kabel anschließen, sollten Sie das folgende Schema erstellen. Auf dem Bild sehen Sie TTL Serial TX und RX, diese beiden Kabel werden mit den Pins 25 (TX) und 26 (RX) des Bildes verbunden.
Das obige Schema kann verwirrend sein, wenn Sie sich vorstellen, dass am unteren Rand des Bildes eine Masse und vier schwarze Knoten (die sich nahe am unteren Rand befinden) mit Masse verbunden sind.
Für ein vollständiges Proteus-Tutorial finden Sie mein Video unten, aber vergessen Sie nicht, dass Proteus nur eine Simulation ist und das nicht garantiert, dass Ihre Hardware richtig funktioniert. Vor allem die Frequenz kann einige Probleme verursachen. Hier ist
Im mikroC-Code stelle ich die LEDs entsprechend der Luftfeuchtigkeit ein, wenn sie größer als 20% ist, schaltet sich die obere LED ein, und wenn die Luftfeuchtigkeit 30% überschreitet, schaltet sich auch die 2. LED ein.
MikroC-Code;
sbit Data at RB0_bit;
sbit DataDir at TRISB0_bit;
unsigned short k;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
char temp[] = "Temperature is 00.0 C";
char hum[] = "Humidity is 00.0 %";
void DHT11StartSignal(){
DataDir = 0;
Data = 0;
Delay_ms(25);
Data = 1;
Delay_us(30);
DataDir = 1;
}
unsigned short DHT11CheckResponse(){
k = 150;
while(!Data){
Delay_us(2);
k--;
if(k<1) return 0; // time out
}
k = 150;
while(Data){
Delay_us(2);
k--;
if(k<1) return 0; // time out
}
return 1;
}
unsigned short DHT11ReadByte(){
int i;
unsigned short num = 0;
DataDir = 1;
for (i=0; i<8; i++){
while(!Data);
Delay_us(40);
if(Data) num |= 1<<(7-i);
while(Data);
}
return num;
}
void main() {
UART1_Init(9600);
TRISC.RC0 = 0;
TRISC.RC1 = 0;
TRISC.RC2 = 0;
while(1){
DHT11StartSignal();
if(!DHT11CheckResponse()) continue;
RH_Byte1 = DHT11ReadByte();
RH_Byte2 = DHT11ReadByte();
T_Byte1 = DHT11ReadByte();
T_Byte2 = DHT11ReadByte();
DHT11ReadByte(); /* Checksum */
// Set temp
temp[15] = T_Byte1/10 + 48;
temp[16] = T_Byte1%10 + 48;
temp[18] = T_Byte2/10 + 48;
UART1_Write_Text(temp);
UART1_Write(10);
UART1_Write(13);
// Set hum
hum[12] = RH_Byte1/10 + 48;
hum[13] = RH_Byte1%10 + 48;
hum[15] = RH_Byte2/10 + 48;
UART1_Write_Text(hum);
UART1_Write(10);
UART1_Write(13);
UART1_Write(10);
UART1_Write(13);
PORTC.RC0 = (RH_Byte1) >= 20;
PORTC.RC1 = (RH_Byte1) >= 30;
PORTC.RC2 = (RH_Byte1) >= 40;
// Wait
Delay_ms(1000);
}
}
Und letzter Teil:
Code in die MPU einbetten;
DHT11 ATMEGA8 MikroC Programmierung...
sbit Data at PORTC5_Bit;
sbit Data_In at PINC5_Bit;
sbit DataDir at DDC5_bit;
unsigned short k,l;
unsigned int T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
char temp[] = "Temperature is 00.0 C";
char hum[] = "Humidity is 00.0 %";
void DHT11StartSignal(){
DataDir = 1;
Data = 0;
Delay_ms(18);
Data = 1;
Delay_us(40);
//Data = 0;
DataDir = 0;
}
int DHT11CheckResponse(){
k = 150;
while(!Data_In)
{
Delay_us(10);
k--;
if(k<=1)
{
UART1_Write('D');
return 0; // time out
}
}
k = 150;
while(Data_In)
{
Delay_us(20);
k--;
if(k<=1)
{
UART1_Write('T');
return 0; // time out
}
}
return 1;
}
unsigned int DHT11ReadByte(){
int i;
unsigned short num = 0;
DataDir = 0;
for (i=0; i<8; i++){
while(!Data_In);
Delay_us(25);
if(Data_In) num |= 1<<(7-i);
while(Data_In);
}
return num;
}
void main() {
UART1_Init(9600);
while(1){
again:
DHT11StartSignal();
if(!DHT11CheckResponse()) continue;
RH_Byte1 = DHT11ReadByte();
RH_Byte2 = DHT11ReadByte();
T_Byte1 = DHT11ReadByte();
T_Byte2 = DHT11ReadByte();
DHT11ReadByte(); /* Checksum */
// Set temp
temp[15] = T_Byte1/10 + 48;
temp[16] = T_Byte1%10 + 48;
temp[18] = T_Byte2/10 + 48;
UART1_Write_Text(temp);
UART1_Write(10);
UART1_Write(13);
// Set hum
hum[12] = RH_Byte1/10 + 48;
hum[13] = RH_Byte1%10 + 48;
hum[15] = RH_Byte2/10 + 48;
UART1_Write_Text(hum);
UART1_Write(10);
UART1_Write(13);
UART1_Write(10);
UART1_Write(13);
// Wait
Delay_ms(1000);
}
}
Benutzer59829
Sanberk