# Raspberry zero config ## SSH over USB With the micro SD card ready we can now plug the USB cable to our host and Pi Zero. However, note that while the Pi Zero has two micro USB port, only one supports USB On-The-Go (OTG). It is this feature that will allows us to treat the connection as an Ethernet connection. The port in question is the innermost one, the one closer to the center of the board, as shown in the image below. ![pizero-usb-host](raspzw-board) ### Set USB Gadget mode We would like to be able to access the Pi Zero through SSH from our machine using a USB cable. To do that we will have to edit two files. First, edit the file `/config.txt` and append this line at the end: ```fallback dtoverlay=dwc2 ``` Second, we will edit the file `/cmdline.txt`. After `rootwait`, we will add ```fallback modules-load=dwc2,g_ether ``` **pay attention to leave only one space between `rootwait`and the new text otherwise it might not be parsed correctly.** Note that there might already be some text after `rootwait` in which case you still must add the following immediately after `rootwait`! Again, leave a single space after `rootwait` but also after `g_ether`. The Pi Zero is fully configured, we can now configure our host. **Now create an empty file called `ssh` in the root directory** ## Configure the Rasp’s Wifi Another option is just to get your Rasberry Pi to connect your Wi-Fi network, create `wpa_supplicant.conf` file in the root directory of the SD card memory. ``` ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country= network={ ssid=“” psk=“” } ``` — My configuration for house: ``` ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=MX network={ ssid=“Haus_2.4G” psk=“7476Haus#CB2040$” } ``` GL-SFT1200-869 goodlife — and ping to your Raspberry Pi Zero by: ```sh ping raspzero.local ``` — - raspzero - gmarx - Pi7476 ### Pendings: - [x] Check if the Anavi example use wich package - [x] Check the HTU21D c example to get access to the raspberryport configuration by executing the `./HTU21d` output file - [x] Upload the precompiled package to configure raspberry - [x] Take care of the WiringPi package?? - [x] Modify the htu21d example to return a json file to use in the UI ### General procedure - [x] Install packages requirements - [x] Install/Build WiringPi - [x] Compile the sensors exacutables # Device preconfiguration In irdoer to donwload and install gitgub/git packages we need to install the next packages: ```sh sudo apt update sudo apt upgrade -y sudo apt install git build-essential sudo apt install python3-smbus i2c-tools ``` **The next step is no longer require:** - no wpa_supplicant.conf and ssh files require ## Enable i2c interface ```sh sudo raspi-config sudo i2cdetect -y 1 ``` ## The anavi example Some code examples for the sensors provided by anavi are located here: [GitHub - AnaviTechnology/anavi-examples: Examples for getting started and testing ANAVI Internet of Things and add-on boards \(HAT & pHAT\) for Raspberry Pi](https://github.com/AnaviTechnology/anavi-examples) However, to use these example for sensors the `WiringPi` package is required. **The package is no loger supported and you need to clone, build, and install it manually.** ### Wiringpi https://github.com/WiringPi/WiringPi short answer: wrong. long answer: wiringPi is not deprecated, it’s just not maintained by G.Henderson any more but still maintained by the community on github. The last apt package was for Pi3B+/Buster, for Pi4 it’s on github to download: install: git clone cd WiringPi ./build debian ls debian-template/\*deb when you already have an old apt-package and want to upgrade by gitclone, then 1st of all better make a clean uninstall of the old one. # My own header files This is a detailed guide to configure and create your own files to comunicate with each sensor used by the air-quality sensor. ## Enable I2C pheripherical ## HTU21D ### Header Create the Header File `htu21d.h` with Header Guard and Includes: ```c #ifndef HTU21D_H #define HTU21D_H // I2C Address #define HTU21D_I2C_ADDR 0x40 // Commands #define HTU21D_TEMP 0xE3 #define HTU21D_HUMID 0xE5 #define HTU21D_RESET 0xFE // Function declarations: // Temp int getTemperature(int fd, double *temperature); // Humidity int getHumidity(int fd, double *humidity); #endif // HTU21D_H ``` ### Implement the Sensor Communication `htu21d.c` ```c #include //to send commands to and receive from I2C device #include //setting up and controlling the I2C device settings #include //definitions for system calls and structures specific to I2C #include //SMBus commands in a more standardized way for I2C #include //perror #include “htu21d.h” // my own header file // Reset function: int reset(int fd) { if(0 > ioctl(fd, I2C_SLAVE, HTU21D_I2C_ADDR)) { perror(“Failed to open the bus”); return -1; } i2c_smbus_write_byte(fd, HTU21D_RESET); return 0; } // Get temperature: int getTemperature(int fd, double *temperature) { reset(fd); char buf[3]; __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_TEMP,3,buf); if(res<0) { perror(“Failed to read from the device”); return -1; } *temperature = -46.85 + 175.72 * (buf[0]*256 + buf[1]) / 65536.0; return 0; } // Get humidity: int getHumidity(int fd, double *humidity) { reset(fd); char buf[3]; __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_HUMID, 3, buf); if(res<0) { perror(“Failed to read from the device”); return -1; } *humidity = -6 + 125 * (buf[0]*256 + buf[1]) / 65536.0; return 0; } ``` ### Using the library Now let us use the library files to implement an example of its usage(`main.c`): ```c #include #include #include #include #include #include “htu21d.h” int main() { char filename[20]; snprintf(filename, 19, “/dev/i2c-%d”, 1); int fd = open(filename, O_RDWR); if (0 > fd) { fprintf(stderr, “ERROR: Unable to access HTU21D sensor module: %s\n”, strerror (errno)); exit(-1); } // Retrieve temperature and humidity double temperature = 0; double humidity = 0; if ( (0 > getHumidity(fd, &humidity)) || (0 > getTemperature(fd, &temperature)) ) { fprintf(stderr, “ERROR: HTU21D sensor module not found\n”); exit(-1); } // Print temperature and humidity on the screen printf(“HTU21D Sensor Module\n”); printf(“%5.2fC\n”, temperature); printf(“%5.2f%%rh\n”, humidity); return 0; } ``` was missing the `stdio.h`in `htu21d.c`implementaion file ```sh gcc -o example main.c htu21d.c -lbcm2835 htu21d.c: In function ‘reset’: htu21d.c:13:3: warning: implicit declaration of function ‘perror’ [-Wimplicit-function-declaration] 13 | perror(“Failed to open the bus”); | ^~~~~~ htu21d.c: In function ‘getTemperature’: htu21d.c:21:48: error: expected declaration specifiers before ‘a’ 21 | int getTemperature(int fd, double *temperature)a | ^ htu21d.c:38:1: error: expected ‘=‘, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{‘ token 38 | { | ^ htu21d.c:51: error: expected ‘{‘ at end of input 51 | | ``` Then to properly compile whiout a make file: ```sh gcc -o example main.c htu21d.c -li2c ``` or ```sh gcc -o example main.c htu21d.c -I. -li2c ``` ### Wiring htu21d to Rasp-zero Htu -> Rasp-Zero VIN -> GPIO 1 GND -> GPIO 9 or (6) SCL -> GPIO 5 SDA -> GPIO 3 ![rpiZ-08](inkdrop://file:l4s-TQxV6) # BMP180 ```sh sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: — — — — — — — — 10: — — — — — — — — — — — — — — — — 20: — — — — — — — — — — — — — — — — 30: — — — — — — — — — — — — — — — — 40: 40 — — — — — — — — — — — — — — — 50: — — — — — — — — — — — — — — — — 60: — — — — — — — — — — — — — — — — 70: — — — — — — — 77 ``` # MHZ19 ### Enable serial iterface ```sh sudo raspi-config ``` ![CleanShot 2024-04-25 at 09.20.10@2x](inkdrop://file:K67IvE_5b) ![CleanShot 2024-04-25 at 09.20.24@2x](inkdrop://file:PuQIli1pE) ![CleanShot 2024-04-25 at 09.20.49@2x](inkdrop://file:8vn6HoF0O) ### Testing MHZ with python ```sh sudo apt install python3-pip sudo pip3 install mh-z19 ``` https://chat.openai.com/share/61ea4fa0-29ff-4569-9fdc-36dd4c4c7a30