Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Jauge de pluie à seau basculant

Composants et fournitures

Arduino Nano R3
× 1
Petit RTC I2C DS1307
× 1
Module de carte SD - Studios LC
× 1
Alimentation 7-12 VDC (ou Wall Wart)
× 1
Adafruit Standard LCD - 16x2 Blanc sur Bleu
× 1
Texas Instruments Shift Register - Série à Parallèle
× 1
Résistance 1k ohm
× 2
Résistance 330 ohm
× 2
Condensateur 100 nF
× 1
Potentiomètre à un tour - 10k ohms
× 1
Interrupteur à bouton-poussoir à contact momentané PCB
× 1
Commutateur Reed, SPST-NO
× 1
Aimant (7mm OD x 7MM long)
× 1
Carte prototype simple face 5x10CM
× 1

Outils et machines nécessaires

Imprimante 3D (générique)
Fer à souder (générique)

À propos de ce projet

Il s'agit d'un pluviomètre à augets basculeurs, basé sur les pluviomètres utilisés par les météorologues professionnels. L'appareil fonctionne en acheminant l'eau de pluie sur un seau basculant qui ressemble à une bascule, avec à chaque extrémité un seau contenant environ 2 ml d'eau de pluie. Lorsqu'un côté se remplit, le seau bascule et l'eau de pluie commence à s'accumuler dans le seau opposé. Chaque fois que le godet bascule, un commutateur à lames est temporairement activé en envoyant un signal à l'interruption matérielle Arduino. L'Arduino suit chaque « pointe » de seau et convertit les « pointes » en quantité de précipitations (pouces de pluie), en fonction du volume du seau et de la surface du réservoir de collecte (16,605 pouces carrés).

L'unité d'affichage intérieure dispose d'un menu pour afficher les totaux « heure actuelle », « heure précédente », « jour actuel » et « jour précédent ».

Pour chaque pointe de godet, un événement horodaté est écrit dans un fichier de carte SD. Ce fichier peut ensuite être importé dans Excel pour analyse et représentation graphique.

Bien que je n'aie pas de vidéo montrant le véritable « pointe du seau », cette vidéo montre une jauge enregistrant les précipitations réelles.

Étape 1

Imprimez tous les composants répertoriés. J'ai utilisé du PETG pour tous les composants car c'est un matériau bien adapté à l'exposition aux UV et à l'exposition aux températures pour une utilisation en extérieur. Pour le filtre supérieur, assurez-vous de désactiver toutes les coques horizontales (haut et bas) pour créer le détail poreux.

Étape 2

Avant de commencer l'assemblage de la carte de circuit imprimé du panneau avant, insérez l'écran LCD sur la carte PY-5 * 10CM (sans soudure) avec la broche 1 de l'écran LCD dans l'emplacement du trou C-1 sur la carte. Percez la carte perforée aux emplacements des quatre trous de montage de la carte LCD. Retirez maintenant l'écran LCD pour un assemblage ultérieur.

Étape 3

Assemblez le circuit imprimé du panneau avant. Placez le CI du registre à décalage 74HC595N, les commutateurs et les résistances comme indiqué. Acheminez tous les fils nécessaires (reportez-vous au schéma de câblage) vers les points d'emplacement qui seront attachés à l'écran LCD, ainsi qu'une longueur de 6" qui s'étendra pour être ultérieurement connecté à la deuxième carte.

Étape 4

Montez l'écran LCD sur la carte du panneau avant, en utilisant les entretoises imprimées pour soulever l'écran LCD afin de dégager le circuit intégré. Fixez à l'aide de vis à capuchon et d'écrous de 3 mm x 15 mm. (Toutes les fixations sont disponibles via Fastenal et/ou McMaster Carr)

Étape 5

Assemblez le circuit imprimé principal en insérant l'Arduino avec la broche D12 à l'emplacement du trou R27 sur le circuit imprimé. Ajoutez un condensateur et des résistances, et acheminez tout le câblage aux emplacements avant d'insérer les modules SD et RTC. Schéma de câblage de référence pour tous les détails.

Étape 6

Assemblez le lecteur SD aux emplacements des trous A-3 à B-10. Assemblez TinyRTC aux emplacements des trous C-24 à I-24. Soudez toutes les connexions.

Étape 7

Sur le boîtier de commande de l'unité intérieure, percez des trous à l'emplacement qui correspond le mieux à vos besoins pour les deux fils qui iront à l'unité extérieure, ainsi que des trous pour les fils provenant de l'alimentation externe ou de la verrue murale. Faites passer les fils dans le boîtier et soudez aux endroits appropriés. Faites glisser la carte principale dans le boîtier et fixez-la avec deux vis de 3 mm x 6 mm de long. Insérez le bouton-poussoir pour l'interrupteur à travers le couvercle avant et fixez le circuit imprimé avant au panneau avant avec des vis de 3 mm x 6 mm de long. Remarque :j'ai utilisé une petite pièce en laiton tourné pour le bouton de l'interrupteur au lieu de la partie imprimée, car j'aimais mieux la « touche ».

Étape 8

Fixez le capot avant à l'aide d'une vis à tête plate M3-0,5 x 10 mm de long

.

Étape 9

Connectez l'USB au PC et téléchargez le programme RTC pour régler l'heure. Une fois l'horloge réglée, téléchargez le programme principal. Insérez la carte SD. Testez l'unité en court-circuitant les fils qui vont à l'interrupteur à lames de l'unité extérieure. Les totaux de précipitations doivent augmenter pour chaque événement de court-circuit (contact fermé). Vérifiez que la carte SD lit la date en lisant avec un éditeur de texte tel que le Bloc-notes ou WordPad sur un ordinateur. Il devrait y avoir un fichier appelé "Text.txt". Le fichier aura un horodatage pour chaque 'tip'événement.

Étape 10

Fixez le commutateur à lames à la sous-base. Utilisez des attaches métalliques pour maintenir en place. Assemblez un aimant sur le buck et montez le seau avec un petit morceau de tube en laiton de 1/8" de diamètre (environ 2" de long). Remarque avant l'assemblage, faites passer une perceuse de 1/8" dans les trous du seau pour nettoyer. Le seau doit basculer facilement sans frottement. Utilisez une petite lime ronde dans les trous du seau si nécessaire. Ajoutez une petite rondelle de 1/8" sur le côté le plus à l'extérieur du seau pour réduire légèrement l'espacement. Déterminez comment vous allez monter l'unité extérieure. J'ai utilisé un angle en aluminium de 1 ". Fixez la base à l'angle ou au support à l'aide de boulons hexagonaux 1/4-20 installés de l'intérieur vers l'extérieur. Fixez la sous-base au bas de l'unité extérieure à l'aide de vis M3-0,5 x 10 mm.

Étape 11

Insérez l'entonnoir dans l'enceinte supérieure. Couper env. 24 morceaux de fil galvanisé de calibre 18 de 2 "de longueur. Tenir un morceau de fil avec une pince, chauffer avec une torche ou un briquet et presser soigneusement dans le dessus en plastique. Ces fils dissuaderont les oiseaux de se percher sur l'appareil. Vous voulez mesurer la quantité de pluie pas de crottes d'oiseaux. Fixez le dessus au boîtier principal avec (4) vis M3-0,5 x 6 mm. Installez le filtre dans le dessus de l'entonnoir. Ce filtre empêchera les feuilles de pénétrer et de se boucher. N'oubliez pas de vérifier de temps en temps et de nettoyer au besoin.

Étape 12

Montez l'unité extérieure et acheminez les câbles jusqu'à l'unité intérieure. Assurez-vous que le dessus de l'unité extérieure est de niveau dans les deux sens.

Étape 13

Mettez l'unité sous tension et ajoutez de l'eau à l'unité extérieure pour vérifier le fonctionnement.

Étape 14 (Facultatif)

Pour vérifier l'exactitude, vous pouvez ajouter très LENTEMENT une tasse d'eau et vérifier que l'unité mesure 0,87" de pluie. (Une tasse =14,44 pouces cubes. La superficie du collecteur est de 16,605" [Pluie =14,44 cu.in. /16,605"=0,87"]. Vous pouvez ajuster le facteur de correction dans le programme principal si votre appareil diffère du mien.

Toutes nos félicitations!! Profitez de pouvoir suivre vos précipitations.

Code

  • Code Arduino pour régler l'heure sur RTC
  • Code Arduino du programme principal pour pluviomètre
Code Arduino pour régler l'heure sur RTCArduino
Chargez d'abord ce code pour régler l'heure sur RTC. Modifiez le code avec la date et l'heure réelles avant de le télécharger sur Arduino.
#include "Wire.h"#define DS1307_I2C_ADDRESS 0x68 // l'adresse I2C de Tiny RTCbyte seconde, minute, heure, dayOfWeek, dayOfMonth, month, year ;/ / Convertir les nombres décimaux normaux en octets décimaux codés binaire decToBcd(byte val){return ( (val/10*16) + (val%10) );}// Convertir les nombres décimaux codés binaires en nombres décimaux normauxbyte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}// Fonction pour régler l'heure actuelle, changez la seconde&minute&heure à la bonne heurevoid setDateDs1307(){second =00;minute =11;hour =12;dayOfWeek =5;dayOfMonth =24;month =7;year=20;Wire.beginTransmission(DS1307_I2C_ADDRESS);Wire.write(decToBcd(0));Wire.write(decToBcd(second)); // 0 au bit 7 démarre le clockWire.write(decToBcd(minute));Wire.write(decToBcd(hour)); // Si vous voulez 12 heures am/pm, vous devez définir // bit 6 (vous devez également modifier readDateDs1307)Wire.write(decToBcd(dayOfWeek));Wire.write(decToBcd(dayOfMonth));Wire.write(decToBcd (mois));Wire.write(decToBcd(year));Wire.endTransmission();}// Fonction pour obtenir la date et l'heure du ds1307 et imprime resultvoid getDateDs1307(){// Réinitialiser le registre pointerWire.beginTransmission( DS1307_I2C_ADDRESS);Wire.write(decToBcd(0));Wire.endTransmission();Wire.requestFrom(DS1307_I2C_ADDRESS, 7);seconde =bcdToDec(Wire.read() &0x7f);minute =bcdToDec(Wire.read() );heure =bcdToDec(Wire.read() &0x3f); // Besoin de changer cela si 12 heures am/pmdayOfWeek =bcdToDec(Wire.read());dayOfMonth =bcdToDec(Wire.read());month =bcdToDec(Wire.read());year =bcdToDec(Wire. read());Serial.print(heure, DEC);Serial.print(":");Serial.print(minute, DEC);Serial.print(":");Serial.print(second, DEC); Serial.print(" ");Serial.print(month, DEC);Serial.print("/");Serial.print(dayOfMonth, DEC);Serial.print("/");Serial.print(year, DEC);Serial.print(" ");Serial.println();//Serial.print("Jour de la semaine:");}void setup() {Wire.begin();Serial.begin(19200); setDateDs1307(); //Définir l'heure actuelle ;}boucle void(){delay(2000);getDateDs1307();//obtenir les données de temps à partir du petit RTC}
Code Arduino du programme principal pour pluviomètreArduino
Programme principal pour pluviomètre. Assurez-vous d'installer toutes les bibliothèques associées avant de compiler votre programme. Site Web de référence [ https://roboindia.com/tutorials/arduino-3-pin-serial-lcd/ ] pour obtenir des instructions sur la mise à jour de la bibliothèque LiquidCrystal.
/*Tipping Bucket Rain GaugeWritten by Bob Torrence*/#include #include #include #include "RTClib.h"#include  // inclut la bibliothèque LiquidCrystal (version spéciale) ref https://roboindia.com/ tutoriels/arduino-3-pin-serial-lcd/// Définition de l'écran LCD et des broches pour l'interfaçage.LiquidCrystal_SR lcd (6, 5, 9); // Pin 6 - Data Enable/SER, Pin 5 - Clock/SCL, Pin 9 -SCKRTC_DS3231 rtc;int backlight =7; // la broche sur laquelle la LED est connectée à la broche 7 (D7) // les constantes ne changeront pas. Ils sont utilisés ici pour définir les numéros de broche:const byte interruptPin_bucket =3;const byte interruptPin_menu =2;// Les variables changeront :volatile int Bucket_Tip_Occurence;volatile int Menu_Select;float Bucket_tip_hour_total =0;float Bucket_tip_current_float_hour_total =0;float Bucket_tip_hour_total =0;float Bucket_tip_current_float_hour_total =0;;float Bucket_tip_current_day_total =0;float Bucket_tip_previous_day_total =0;int current_minute;int loop_minute;int current_hour;int loop_hour;int current_day;int loop_day;int tip_counter;float conversion_factor =.00854; // pouces de pluie par embout - calculé en mesurant le volume du seau et la surface du collecteur (16,605 pouces carrés) rétroéclairage long non signé volatilOfftime ; rétroéclairage long non signé volatilOnDuration=30000 ; // durée (en millisecondes) pendant laquelle le rétroéclairage reste activé après avoir appuyé sur le bouton de sélection du menu String print_time(DateTime timestamp) { char message[120]; int Année =horodatage.année(); int Mois =horodatage.mois(); int Jour =horodatage.jour(); int Heure =horodatage.heure(); int Minute =horodatage.minute(); int Seconde =horodatage.seconde(); sprintf(message, "%02d:%02d:%02d %02d/%02d", Heure,Minute,Seconde,Mois,Jour); return message;}Fichier monFichier;void setup() { lcd.begin(16,2); // Initialise l'interface avec l'écran LCD, et spécifie les dimensions (largeur et hauteur) de l'affichage lcd.home(); // Réglage du curseur à la maison, c'est-à-dire 0,0 rtc.begin(); // lancer l'utilisation des variables de l'horloge temps réel pinMode(10, OUTPUT); pinMode (rétroéclairage, SORTIE); // Déclare la LED comme sortie digitalWrite(backlight,HIGH); //activer le rétroéclairage lcd backlightOfftime =millis() + backlightOnDuration; //définit le délai initial pour que le rétroéclairage LCD soit activé if (!SD.begin(4)) { lcd.print("insert SD Card"); retourner; } // Configurer notre broche numérique en tant qu'interruption pour le bucket pinMode(interruptPin_bucket, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin_bucket), count, FALLING); // Configurez notre broche numérique en tant qu'interruption pour le bucket pinMode(interruptPin_menu, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin_menu), menu, RISING); monFichier =SD.open("test.txt", FILE_WRITE); if (myFile) { myFile.println("Rain Gauge Ready - unité sous tension"); monFichier.close(); } DateHeure maintenant =rtc.now(); minute_actuelle =maintenant.minute(); loop_minute =now.minute(); heure_actuelle =maintenant.heure(); loop_hour =now.hour(); lcd.setCursor (0,0); lcd.print(print_time(now)); // Imprime "Arduino" sur l'écran LCD lcd.setCursor(1,1) ; lcd.print("Pluie"); }boucle vide (){ DateTime now =rtc.now () ; minute_actuelle =maintenant.minute(); loop_minute =now.minute(); heure_actuelle =maintenant.heure(); loop_hour =now.hour(); jour_actuel =maintenant.jour(); loop_day =now.day(); // Commencer la boucle pour déterminer les totaux de la journée en cours while (loop_day - current_day ==0){ // Commencer la boucle pour déterminer les totaux de l'heure actuelle while (loop_hour - current_hour ==0){ if (millis()> backlightOfftime) { digitalWrite (rétroéclairage, FAIBLE) ; } if (Bucket_Tip_Occurence ==1) { Bucket_Tip_Occurence =0 ; tip_counter =tip_counter + 1 ; DateHeure maintenant =rtc.now(); monFichier =SD.open("test.txt", FILE_WRITE); monFichier.print("Evénement "); monFichier.print(maintenant.année(), DEC); monFichier.print('/'); monFichier.print(maintenant.mois(), DEC); monFichier.print('/'); myFile.print(now.day(), DEC); monFichier.print(" "); monFichier.print(maintenant.heure(), DEC); monFichier.print(':'); monFichier.print(maintenant.minute(), DEC); monFichier.print(':'); myFile.print(now.second(), DEC); monFichier.print(" "); monFichier.print(conversion_factor,5) ; monFichier.println(); monFichier.close(); retard (200); } else { //Vérifier l'état de l'heure actuelle DateTime now =rtc.now(); loop_hour=now.hour();} switch (Menu_Select) { case 1 :lcd.clear(); lcd.setCursor(0,0); lcd.print("Heure actuelle"); lcd.setCursor(0,1) ; lcd.print(tip_counter * conversion_factor); retard (500); Pause; cas 2 :lcd.clear(); lcd.setCursor(0,0); lcd.print("Heure précédente"); lcd.setCursor(0,1) ; lcd.print(Bucket_tip_previous_hour_total); retard (500); Pause; cas 3 :lcd.clear(); lcd.setCursor(0,0); lcd.print("Jour en cours"); lcd.setCursor(0,1) ; lcd.print(Bucket_tip_current_day_total + tip_counter * conversion_factor); retard (500); Pause; cas 4:lcd.clear(); lcd.setCursor(0,0); lcd.print("Jour précédent"); lcd.setCursor(0,1) ; lcd.print(Bucket_tip_previous_day_total); // lcd.print(print_time(now)); retard (500); Pause; } } DateHeure maintenant =rtc.now(); // Réinitialise les compteurs pour la prochaine boucle d'une heure current_hour =now.hour(); loop_day =now.day(); loop_hour=now.hour(); //Totaliser le total de l'heure actuelle Bucket_tip_previous_hour_total =tip_counter * conversion_factor; Bucket_tip_current_day_total =Bucket_tip_previous_hour_total + Bucket_tip_current_day_total ; tip_counter =0; /* Écriture de fichier facultative avec seulement le total horaire myFile =SD.open("test.txt", FILE_WRITE); monFichier.print("Résumé Horaire "); monFichier.print(Bucket_tip_previous_hour_total); monFichier.print(maintenant.année(), DEC); monFichier.print('/'); monFichier.print(maintenant.mois(), DEC); monFichier.print('/'); myFile.print(now.day(), DEC); monFichier.print(" "); monFichier.print(maintenant.heure(), DEC); monFichier.print(':'); monFichier.print(maintenant.minute(), DEC); monFichier.print(':'); myFile.print(now.second(), DEC); monFichier.print(" "); monFichier.print(Bucket_tip_previous_hour_total); monFichier.println(); monFichier.close(); retard (200); */ } //Totaliser le total de l'heure actuelle Bucket_tip_previous_day_total =Bucket_tip_current_day_total; Bucket_tip_current_day_total =0 ; Bucket_tip_current_hour_total =0 ; tip_counter =0;/* Écriture de fichier facultative avec le total de la veille uniquement myFile =SD.open("test.txt", FILE_WRITE); monFichier.print("Total du jour "); monFichier.print(Bucket_tip_previous_day_total); monFichier.print(print_time(now)); monFichier.close(); */ } // initier une interruption depuis le bucket reed switchvoid count() { static unsigned long last_interrupt_time_bucket =0; interruption_time_bucket longue non signée =millis(); // Si les interruptions arrivent plus vite que 300 ms, supposez qu'il s'agit d'un rebond et ignorez if (interrupt_time_bucket - last_interrupt_time_bucket> 300) {Bucket_Tip_Occurence =1; } last_interrupt_time_bucket =interrupt_time_bucket;}//initier une interruption depuis le menu switchvoid menu() { static non signé long last_interrupt_time_menu =0; interruption_time_menu longue non signée =millis(); // Si les interruptions arrivent plus vite que 300 ms, supposez qu'il s'agit d'un rebond et ignorez if (interrupt_time_menu - last_interrupt_time_menu> 300) { if (digitalRead(backlight)==LOW) { digitalWrite(backlight,HIGH); //active le rétroéclairage s'il était précédemment éteint } else Menu_Select =Menu_Select + 1; if(Menu_Select> 4){ Menu_Select =1 ; }backlightOfftime =millis() + backlightOnDuration;Menu_Select =Menu_Select; last_interrupt_time_menu =interrupt_time_menu; }}

Pièces et boîtiers personnalisés

STL pour impression 3D Base d'unité extérieure. J'ai imprimé avec du PETG à 30% de remplissage un fichier STL pour l'impression 3D du couvercle de l'unité extérieure. J'ai imprimé avec du PETG à 30% de remplissage Fichier STL pour l'entonnoir d'unité extérieure d'impression 3D. J'ai imprimé en utilisant du PETG à 30% de remplissage. Fichier STL pour le filtre de l'unité extérieure d'impression 3D. J'ai imprimé en PETG à 20% de remplissage. Cette partie doit être imprimée sans couche inférieure ou supérieure horizontale, créant un filtre «poreux». Fichier STL pour l'impression 3D de la sous-base à laquelle le seau se fixe via la tige de pivot. J'ai imprimé à l'aide de PETG avec 30% de remplissage. Fichier STL pour l'impression 3D du seau. J'ai imprimé à l'aide de PETG avec 30% de remplissage. Fichier STL pour imprimer le boîtier de l'unité intérieure. J'ai imprimé avec du PETG à 30% de remplissage. Fichier STL pour l'impression 3D du capot avant de l'unité intérieure. J'ai imprimé avec du PETG à 30% de remplissage. Fichier STL pour imprimer des entretoises pour maintenir l'unité LCD surélevée au-dessus du IC du registre à décalage. J'ai imprimé en utilisant du PETG à 30% de remplissage.Modèle Fusion 360 d'unité extérieure rain_gauge_assembly___smaller_profile_v15_CFg0dGwM8s.f3d.STP fichier de l'unité extérieure rain_gauge_assembly___smaller_profile_v15_jWCS0hjSDq.stepSTEP Modèle Cad de l'unité intérieure controller_box_v1_fwltgu6D0S.stepFusion 36 modèle CAO de l'unité extérieure fichier controller_box_v1_NxtSrPG4Vo.f3zSTL pour l'impression 3D du bouton poussoir Switch

Schémas

Schéma de câblage du projet rain_gauge_NtjqXF6QEw.fzz

Processus de fabrication

  1. Manomètre
  2. Stores intelligents
  3. Montrez-moi un toise numérique
  4. Comprendre la jauge à vis micrométrique
  5. Comprendre le manomètre
  6. Comprendre la jauge de contrainte
  7. Comprendre la jauge de Pirani
  8. Comprendre le manomètre à membrane
  9. Comprendre le manomètre Bourdon