Vorwort
Der Kursdesignbericht, die IAR-Datei und der C#-Hostcomputer befinden sich am Ende des Artikels.
1. Designinhalte und -anforderungen
ZigBee ist in einen Koordinator und ein Terminal unterteilt. Das Terminal sendet die vom Sensor gesammelten Daten an den Koordinator, und der Koordinator sendet die Daten an den Host-Computer. Der Host-Computer zeigt die Daten in Echtzeit an, um den Zweck der Wasserüberwachung zu erreichen Qualität.
2. System-Hardware-Design
- Der Übertragungsknoten ist CC2530, einer als Koordinator und zwei als Terminals
-
DS18B20 (Temperatursensor): Wird zur Messung der Wassertemperatur verwendet
-
TSW-30 (Trübungssensor): Wird zur Messung der Wassertrübung verwendet
2.1 CC2530
Abbildung 2-1 CC2530-Pindiagramm
2.2 DS18B20
Abbildung 2-2 DS18B20-Hardware-Verdrahtungsplan
Pin-Name |
Funktion |
GND |
Erdungskabel |
DQ |
Single-Bus-Kommunikationsschnittstelle, Stromversorgungsanschluss im parasitären Modus |
VDD |
Stromleitung (bei 2-Draht-Kommunikation geerdet, um eine korrekte Identifizierung des VDD-Zustands im Chip sicherzustellen) |
Tabelle 2-1 DS18B20-Pin-Beschreibung
DS18B20 Temperatur-Lesefunktionscode-Segment, digitale Lesung
void Temp_test(void) //温度读取函数
{
uint8 V1,V2;
Ds18b20Initial();
Ds18b20Write(0xcc);
Ds18b20Write(0x44);
Ds18b20Initial();
Ds18b20Write(0xcc);
Ds18b20Write(0xbe);
V1 = Ds18b20Read();
V2 = Ds18b20Read();
temp = ((V1 >> 4)+((V2 & 0x07)*16));
}
2.3 TSW-30
Pin-Definition |
Funktionsbeschreibung |
Anmerkung |
VCC |
Positive Versorgungsspannung, 5 V |
3,3 V nicht verfügbar |
ZUM |
Analoger Signalausgang |
Ausgangsspannungsbereich 0-5V |
TUN |
Digitaler Ausgang |
Wenn er kleiner als der eingestellte Wert ist, wird ein hoher Pegel ausgegeben; wenn er größer als der eingestellte Wert ist, wird ein niedriger Pegel ausgegeben |
GND |
Minuspol der Versorgungsspannung |
Tabelle 2-2 TSW-30-Pin-Beschreibung
Codesegment der TSW-30-Temperaturablesungsfunktion, analoge Lesung
uint16 ReadData( void )
{
uint16 reading = 0;
P0DIR &= ~0x20; // 设置P0.5为输入方式
//asm("NOP");asm("NOP");
/* Clear ADC interrupt flag */
ADCIF = 0;
ADCCON3 = (0x20 | HAL_ADC_DEC_064 | HAL_ADC_CHANNEL_5);
/* Wait for the conversion to finish */
while ( !ADCIF );
asm("NOP");asm("NOP");
/* Read the result */
reading = ADCL;
reading |= (int16) (ADCH << 8);
reading >>= 8;
return reading;
}
3. Systemsoftware-Design
3.1 Systemflussdiagramm
Abbildung 3-1 Systemflussdiagramm
4.2 Programmierung des Host-Computers
4.2.1 Schnittdaten
Da die Datenempfangszeit verschiedener Endknoten nicht vollständig synchronisiert werden kann, kann die Datenquelle nicht genau unterschieden werden. Daher wird das Flag-Bit verwendet. Wenn das Terminal Daten sendet, werden die Flag-Bits „/c“ und „/d“ verwendet. werden unmittelbar nach den Daten hinzugefügt, wodurch die Quelle der Daten ermittelt werden kann.
Schneiden Sie die Daten ab, indem Sie die Flag-Bits „/c“ und „/d“ der gesendeten Daten kombinieren. Einzelheiten finden Sie in Zeile 14 des folgenden Codesegments. Trennen Sie die gewünschten Datenbits.
4.2.2 Daten anzeigen
Je nach Flag-Bit werden unterschiedliche Daten abgerufen, und die durch Trennung erhaltenen Daten werden speziell angezeigt. Einzelheiten finden Sie in den Zeilen 15 bis 42 des folgenden Codesegments.
private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
string data = string.Empty;
this.Invoke((EventHandler)(delegate
{
data = serialPort1.ReadExisting();
byte[] decBytes = System.Text.Encoding.Default.GetBytes(data);
string str1 = System.Text.Encoding.Default.GetString(decBytes);
string[] info = data.Split('/');
try
{
for (int i = 0; i < info.Length; i++)
{
if (info[i] == "c")
{
//浊度
float f1 = Convert.ToSingle(info[i + 1]);
label6.Text = Convert.ToString((int)f1 * 50 / 127);
chart1.Series["浊度"].Points.AddXY(zdx++, (int)f1 * 50 / 127);
if (zdx > 20)
chart1.Series["浊度"].Points.Clear();
this.listBox1.Items.Add(Time_Count.Text + "," + "浊度," + Convert.ToString((int)f1 * 50 / 127));
}
else if (info[i] == "d")
{
//温度
float f1 = Convert.ToSingle(info[i + 1]);
label7.Text = Convert.ToString(f1);
chart1.Series["温度"].Points.AddXY(wdx++, f1);
if (wdx > 20)
chart1.Series["浊度"].Points.Clear();
this.listBox2.Items.Add(Time_Count.Text + "," + "温度," + Convert.ToString(f1));
}
}
}
catch
{
}
})
);
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
MessageBox.Show(ex.Message);
}
}
Anhang
Baidu-Netzwerkfestplatte , Extraktionscode: tv6a