hola buenas noches soy nuevo en esto de los micro controladores y estoy intentando programar un sensor dht11 y una lcd con un pic 18f4550 y tengo varias dudas con respecto a este programa que encontre
especificamente en esta parte del codigo :
------------------------------------------------------------------------------------------------------------------
RH = (RH << 8 ) | RH_Byte2;
Temp = T_Byte1;
Temp = (Temp << 8 ) | T_Byte2;
if( RH >= 1000)
Humidity[0] = '1';
else
Humidity[0] = ' ';
if(Temp > 0x8000) {
Temperature[0] = '-';
Temp = Temp & 0x7FFF;
}
else
Temperature[0] = ' ';
Temperature[1] = (Temp / 100) % 10 + 48;
Temperature[2] = (Temp / 10) % 10 + 48;
Temperature[4] = Temp % 10 + 48;
Humidity[1] = (RH / 100) % 10 + 48;
Humidity[2] = (RH / 10) % 10 + 48;
Humidity[4] = RH % 10 + 48;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mi duda es porque (Temp / 100) % 10 + 48; porque se hace esta operacion, en otros codigos hacen algo similar pero no entiendo que es
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)) porque esta condicion agrega esto "& 0xFF" tengo entendido que es suficiente con determinar la suma de los 4 bytes =checksum pero porque agrega un operador de direccion y un 255 en hexadecimal
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
no entiendo bien esta parte podrían explicarme que hace o comentar linea por linea su funcionamiento:
RH = (RH << 8 ) | RH_Byte2;
Temp = T_Byte1;
Temp = (Temp << 8 ) | T_Byte2;
if( RH >= 1000)
Humidity[0] = '1';
else
Humidity[0] = ' ';
if(Temp > 0x8000) {
Temperature[0] = '-';
Temp = Temp & 0x7FFF;
}
else
Temperature[0] = ' ';
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#define SSD1306_RST PIN_B2
// DHT22 sensor connection
#define DHT22_PIN PIN_B3
#include <18F4550.h>
#device PASS_STRINGS = IN_RAM
#fuses NOMCLR, INTRC_IO, NOWDT, NOPROTECT, NOLVP
#use delay(clock = 8MHz)
#use fast_io(B)
#use I2C(MASTER, I2C1, FAST = 400000, stream = SSD1306_STREAM) // Initialize I2C
// Include SSD1306 OLED driver source code
#include <SSD1306OLED.c>
char Temperature[] = " 00.0 C";
char Humidity[] = " 00.0 %";
int8 T_Byte1, T_Byte2, RH_Byte1, RH_Byte2, CheckSum;
int16 Temp, RH;
// Send start signal to the sensor
void Start_Signal(void) {
output_drive(DHT22_PIN); // Configure connection pin as output
output_low(DHT22_PIN); // Connection pin output low
delay_ms(25); // Wait 25 ms
output_high(DHT22_PIN); // Connection pin output high
delay_us(30); // Wait 30 us
output_float(DHT22_PIN); // Configure connection pin as input
}
// Check sensor response
int1 Check_Response(void) {
set_timer1(0); // Set Timer1 value to 0
while(!input(DHT22_PIN) && get_timer1() < 100); // Wait until DHT22_PIN becomes high (cheking of 80µs low time response)
if(get_timer1() >= 100) // If response time >= 100µS ==> Response error
return 0; // Return 0 (Device has a problem with response)
else {
set_timer1(0); // Set Timer1 value to 0
while(input(DHT22_PIN) && get_timer1() < 100); // Wait until DHT22_PIN becomes low (cheking of 80µs high time response)
if(get_timer1() >= 100) // If response time >= 100µS ==> Response error
return 0; // Return 0 (Device has a problem with response)
else
return 1; // Return 1 (response OK)
}
}
// Data read function
int1 Read_Data(int8 *dht_data) {
int8 j;
*dht_data = 0;
for(j = 0; j < 8; j++){
set_timer1(0); // Reset Timer1
while(!input(DHT22_PIN)) // Wait until DHT22_PIN becomes high
if(get_timer1() >= 100) { // If low time >= 100µs ==> Time out error (Normally it takes 50µs)
return 1;
}
set_timer1(0); // Reset Timer1
while(input(DHT22_PIN)) // Wait until DHT22_PIN becomes low
if(get_timer1() > 100) { // If high time > 100µs ==> Time out error (Normally it takes 26-28µs for 0 and 70µs for 1)
return 1; // Return 1 (timeout error)
}
if(get_timer1() > 50) // If high time > 50µS ==> Sensor sent 1
bit_set(*dht_data, (7 - j)); // Set bit (7 - j)
}
return 0; // Return 0 (data read OK)
}
// main function
void main(void) {
setup_oscillator(OSC_8MHZ); // Set internal oscillator to 8MHz
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); // Start Timer1 with internal clock source + 2 prescaler
delay_ms(1000);
// Initialize the SSD1306 OLED with an I2C addr = 0x7A (default address)
SSD1306_Begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
// Clear the buffer
SSD1306_ClearDisplay();
SSD1306_Display();
SSD1306_DrawFastHLine(0, 31, SSD1306_LCDWIDTH); // Draw a horizontal line
SSD1306_DrawText(10, 0, "DHT22 TEMPERATURE:");
SSD1306_DrawText(19, 37, "DHT22 HUMIDITY:");
SSD1306_Display();
while(TRUE) {
Start_Signal(); // Send a start signal to the sensor
if(Check_Response()) { // Check if there is a response from sensor (If OK start reding humidity and temperature data)
// Response OK ==> read (and save) data from the DHT22 sensor and check time out errors
Read_Data(&RH_Byte1); // Read humidity 1st byte and store its value in the variable RH_Byte1
Read_Data(&RH_Byte2); // Read humidity 2nd byte and store its value in the variable RH_Byte2
Read_Data(&T_Byte1); // Read temperature 1st byte and store its value in the variable T_Byte1
Read_Data(&T_Byte2); // Read temperature 2nd byte and store its value in the variable T_Byte2
Read_Data(&CheckSum); // Read checksum and store its value in the variable CheckSum
// Test if all data were sent correctly
if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)) {
RH = RH_Byte1;
RH = (RH << 8 ) | RH_Byte2;
Temp = T_Byte1;
Temp = (Temp << 8 ) | T_Byte2;
if( RH >= 1000)
Humidity[0] = '1';
else
Humidity[0] = ' ';
if(Temp > 0x8000) {
Temperature[0] = '-';
Temp = Temp & 0x7FFF;
}
else
Temperature[0] = ' ';
Temperature[1] = (Temp / 100) % 10 + 48;
Temperature[2] = (Temp / 10) % 10 + 48;
Temperature[4] = Temp % 10 + 48;
Humidity[1] = (RH / 100) % 10 + 48;
Humidity[2] = (RH / 10) % 10 + 48;
Humidity[4] = RH % 10 + 48;
}
// Checksum error
else {
Temperature[0] = Temperature[1] = Temperature[2] = Temperature[4] = 'E';
Humidity[0] = Humidity[1] = Humidity[2] = Humidity[4] = 'E';
}
}
// Sensor response error (connection error)
else {
Temperature[0] = Temperature[1] = Temperature[2] = Temperature[4] = 'E';
Humidity[0] = Humidity[1] = Humidity[2] = Humidity[4] = 'E';
}
// Display data on the display
SSD1306_DrawText(24, 12, temperature, 2); // Print temperature with text size = 2
SSD1306_DrawCircle(88, 13, 2); // Put degree symbol ( ° )
SSD1306_DrawText(24, 49, humidity, 2); // Print humidity with text size = 2
SSD1306_Display();
delay_ms(1000); // Wait 1 second between readings
}
}
// End of code.