/* * * * Created: 21.1.2023 15:15:24 * Author : Kryštof Keil * E-mail : keilkrys@fel.cvut.cz */ // fuses nastavit na //D9 //EF //07 #define F_CPU 8000000 #include #include #include #include #include #include #include #include #include "DHT.c" #define myUBRR 16 // (F_CPU/(16*bps))-1 -> 57600bps #define UBRR9600 104 // -> 9600bps uint32_t maxWaitycles = 1000000; void USART_init(int); int LoRa_init(void); int LoRa_send(void); void LoRa_sleep(void); void ReadPM25sensor(void); char numberToCharLow(char); char numberToCharHigh(char); int readADCbattery(void); int readPhotoResistor(void); uint8_t resetprogramu, indexRecv, alreadyRegistered, firstRun; uint16_t temperature = 22, humidity = 508; uint32_t waitCycles, counter; char recvBytes[32]; void USART_init(int givenUBRR){ UBRR0H = (unsigned char)(givenUBRR>>8); //nastaveni BAUD UBRR0L = (unsigned char)givenUBRR; //nastaveni BAUD UCSR0A = 0b00000010; //Asynchronous Double Speed mode UCSR0B = 0b00011000; //zapnut� vysilani a zapnuti prijmu UCSR0C = 0b00000110; //asynchroni, bez parity, 1stop, 8bitu } int LoRa_init(void){ //inicializace modulu PORTD &= ~(1<> 8); rx[29] = numberToCharLow(battVoltage >> 8); rx[30] = numberToCharHigh(battVoltage & 0xff); rx[31] = numberToCharLow(battVoltage & 0xff); rx[32] = numberToCharHigh(solarIntensity >> 8); rx[33] = numberToCharLow(solarIntensity >> 8); rx[34] = numberToCharHigh(solarIntensity & 0xff); rx[35] = numberToCharLow(solarIntensity & 0xff); rx[36] = numberToCharHigh(temperature >> 8); rx[37] = numberToCharLow(temperature >> 8); rx[38] = numberToCharHigh(temperature & 0xff); rx[39] = numberToCharLow(temperature & 0xff); rx[40] = numberToCharHigh(humidity >> 8); rx[41] = numberToCharLow(humidity >> 8); rx[42] = numberToCharHigh(humidity & 0xff); rx[43] = numberToCharLow(humidity & 0xff); for (int i = 0;i> 4) <= 9){ return (inChar >> 4) + 0x30; // 0x30 je ASCII kod znaku '0' nula } else if ((inChar >> 4) >= 10){ return (inChar >> 4) + 55; //65 dec je znak A a 0xa je 10 dec, tedy 55 + 10 je znak 'A' } return '0'; } char numberToCharLow(char inChar){ //funkce prevede prvni 4 bity hodnoty vyjadrenou v 8-bitovem datovem formatu do tisknutelne podoby if ((inChar & 0x0f) <= 9){ return (inChar & 0x0f) + 0x30; // 0x30 je ASCII kod znaku '0' nula } else if ((inChar & 0x0f) >= 10){ return (inChar & 0x0f) + 55; //65 dec je znak A a 0xa je 10 dec, tedy 55 + 10 je znak 'A' } return '0'; } int readADCbattery(){ uint16_t ADCvysledek; ADMUX = 0x46; ADCSRA = 0xC7; ADCSRB = 0x00; while((ADCSRA & (1 << ADIF)) == 0){} ADCvysledek = (int) ADCH << 8; ADCvysledek |= (int) ADCL; ADCSRA = 0x00; return ADCvysledek; } int readPhotoResistor(){ uint16_t ADCvysledek; ADCSRA = (1 << ADEN)|(0x07); ADMUX = 0x45; ADCSRB = 0x00; ADCSRA |= (1 << ADSC); while(ADCSRA & (1 << ADSC)){} ADCvysledek = (int) ADCH << 8; ADCvysledek |= (int) ADCL; ADCSRA = 0x00; return ADCvysledek; } int main(void) { if (~resetprogramu) { } DDRB = 0b11111111; DDRC = 0b11011111; DDRD = 0b11111110; DDRE = 0b11111011; PORTC |= (1<= 1){ while(buff != 0x0A && (waitCycles < 20*maxWaitycles)) { //vyprazdnime si buffer kde ocekavame zpravu o probuzeni LoRa modulu while (!(UCSR0A & (1<= 11*maxWaitycles) { //LoRaWAN modul se z nejakeho duvodu neprobouzi, provedeme reset while(0 == LoRa_init()){} //inicializace LoRa modulu } waitCycles = 0; TIMSK2 &= ~(1<