Programming
Project #22: Synthesizer – Momentary Button – Mk09
——
#DonLucElectronics #DonLuc #Synthesizer #Mozzi #Keyboard #ADSREnvelope #Arduino #AdafruitMETROM0Express #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
Momentary Button – Panel Mount
It’s your basic black or blue action button. This is a very useful, small, panel-mount momentary switch. It is a SPST N.O. with the threaded portion being 6.75 mm in diameter. This button is perfect for basic On/Off functions. Overall length including leads and has small solder lugs for connection. These momentary buttons are rated up to 0.5A and 250VAC.
Momentary button connect two points in a circuit when you press them. Turns on and off a light emitting LED. When the button is open there is no connection between the two legs of the button, so the pin is connected to ground, through the pull-down resistor, and we read a LOW. When the button is closed, it makes a connection between its two legs, connecting the pin to 5 volts, so that we read a HIGH.
You can also wire this circuit the opposite way, with a pullup resistor keeping the input HIGH, and going LOW when the button is pressed. If so, the behavior of the sketch will be reversed, with the LED normally on and turning off when you press the button.
DL2208Mk02
1 x Adafruit METRO M0 Express
8 x Momentary Button – Panel Mount (Blue)
5 x Momentary Button – Panel Mount (Black)
13 x 10K Ohm Resistor
1 x LED Red 5mm
1 x SparkFun Cerberus USB Cable
Adafruit METRO M0 Express
KY0 – 0
KY1 – 1
KY2 – 2
KY3 – 3
KY4 – 4
KY5 – 5
KY6 – 6
KY7 – 7
KY8 – 8
LEDR – 9
KY10 – 10
KY11 – 11
KY12 – 12
KY13 – 13
VIN – +5V
GND – GND
——
DL2208Mk02p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - Momentary Button - Mk09 22-09 DL2208Mk02p.ino 1 x Adafruit METRO M0 Express 8 x Momentary Button - Panel Mount (Blue) 5 x Momentary Button - Panel Mount (Black) 13 x 1K Ohm Resistor 1 x LED Red 5mm 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Simple Keyboard // Minimum reading of the button that generates a note //const int iKeyboard0 = 0; const int iKeyboard1 = 1; const int iKeyboard2 = 2; const int iKeyboard3 = 3; const int iKeyboard4 = 4; const int iKeyboard5 = 5; const int iKeyboard6 = 6; const int iKeyboard7 = 7; const int iKeyboard8 = 8; const int iKeyboard10 = 10; const int iKeyboard11 = 11; const int iKeyboard12 = 12; const int iKeyboard13 = 13; // Button is pressed int iB0 = 1; int iB1 = 1; int iB2 = 1; int iB3 = 1; int iB4 = 1; int iB5 = 1; int iB6 = 1; int iB7 = 1; int iB8 = 1; int iB10 = 1; int iB11 = 1; int iB12 = 1; int iB13 = 1; // The number of the LED Red pin 9 const int iLedR = 9; // Software Version Information String sver = "22-09"; void loop() { // isKeyboard isKeyboard(); }
getKeyboard.ino
// getKeyboard // setupKeyboard void setupKeyboard() { // Initialize the button pin as an input // pinMode(iKeyboard0, INPUT_PULLUP); pinMode(iKeyboard1, INPUT_PULLUP); pinMode(iKeyboard2, INPUT_PULLUP); pinMode(iKeyboard3, INPUT_PULLUP); pinMode(iKeyboard4, INPUT_PULLUP); pinMode(iKeyboard5, INPUT_PULLUP); pinMode(iKeyboard6, INPUT_PULLUP); pinMode(iKeyboard7, INPUT_PULLUP); pinMode(iKeyboard8, INPUT_PULLUP); pinMode(iKeyboard10, INPUT_PULLUP); pinMode(iKeyboard11, INPUT_PULLUP); pinMode(iKeyboard12, INPUT_PULLUP); pinMode(iKeyboard13, INPUT_PULLUP); } // isKeyboard void isKeyboard() { /* // Read the state of the button value 0 if ( digitalRead(iKeyboard0) == HIGH ) { // Button is pressed - pullup keeps pin high normally 0 iB0 = iB0 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB0 = iB0 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } */ // Read the state of the button value 1 if ( digitalRead(iKeyboard1) == HIGH ) { // Button is pressed - pullup keeps pin high normally 1 iB1 = iB1 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB1 = iB1 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 2 if ( digitalRead(iKeyboard2) == HIGH ) { // Button is pressed - pullup keeps pin high normally 2 iB2 = iB2 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB2 = iB2 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 3 if ( digitalRead(iKeyboard3) == HIGH ) { // Button is pressed - pullup keeps pin high normally 3 iB3 = iB3 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB3 = iB3 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 4 if ( digitalRead(iKeyboard4) == HIGH ) { // Button is pressed - pullup keeps pin high normally 4 iB4 = iB4 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB4 = iB4 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 5 if ( digitalRead(iKeyboard5) == HIGH ) { // Button is pressed - pullup keeps pin high normally 5 iB5 = iB5 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB5 = iB5 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 6 if ( digitalRead(iKeyboard6) == HIGH ) { // Button is pressed - pullup keeps pin high normally 6 iB6 = iB6 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB6 = iB6 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 7 if ( digitalRead(iKeyboard7) == HIGH ) { // Button is pressed - pullup keeps pin high normally 7 iB7 = iB7 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB7 = iB7 - 1;// Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 8 if ( digitalRead(iKeyboard8) == HIGH ) { // Button is pressed - pullup keeps pin high normally 8 iB8 = iB8 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB8 = iB8 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 10 if ( digitalRead(iKeyboard10) == HIGH ) { // Button is pressed - pullup keeps pin high normally 10 iB10 = iB10 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB10 = iB10 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 11 if ( digitalRead(iKeyboard11) == HIGH ) { // Button is pressed - pullup keeps pin high normally 11 iB11 = iB11 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB11 = iB11 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 12 if ( digitalRead(iKeyboard12) == HIGH ) { // Button is pressed - pullup keeps pin high normally 12 iB12 = iB12 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB12 = iB12 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } // Read the state of the button value 13 if ( digitalRead(iKeyboard13) == HIGH ) { // Button is pressed - pullup keeps pin high normally 13 iB13 = iB13 + 1; // Turn LED Red on digitalWrite(iLedR, HIGH ); } else { iB13 = iB13 - 1; // Turn LED Red off digitalWrite(iLedR, LOW ); } }
setup.ino
// Setup void setup() { // Setup Keyboard setupKeyboard(); // Initialize the LED Red pin 9 as an output pinMode(iLedR, OUTPUT); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #22: Synthesizer – Slide Linear Taper Pot – Mk08
——
#DonLucElectronics #DonLuc #Synthesizer #Mozzi #Keyboard #ADSREnvelope #Arduino #AdafruitMETROM0Express #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
10k Ohm Slide Linear Taper Pot – X-Large
A simple slide potentiometer can go a long way. Rated at 10k Ohm and 0.5W. Comes with solder tab connections. The taper profile for this slide:
Length: 80 cm
Width: 15 cm
Height: 12 cm
Slide Potentiometer Knob – X-Large
This is a simple knob that connects to the extra large sized linear slide potentiometer. Each knob uses friction to secure itself to fit onto the slide pot. Once attached, this small knob provides you with an easier to use potentiometer for your project.
Adafruit METRO M0 Express
Metro is our series of microcontroller boards for use with the Arduino IDE. This new Metro M0 Express board looks a whole lot like our original Metro 328, but with a huge upgrade. This Metro features a ATSAMD21G18 chip, an ARM Cortex M0+.
At the Metro M0’s heart is an ATSAMD21G18 ARM Cortex M0 processor, clocked at 48 MHz and at 3.3V logic. This chip has a 256K of FLASH and 32K of RAM. This chip comes with built in USB so it has USB-to-Serial program.
DL2208Mk01
1 x Adafruit METRO M0 Express
5 x 10k Ohm Slide Linear Taper Pot – X-Large
5 x Slide Potentiometer Knob – X-Large
1 x SparkFun Cerberus USB Cable
Adafruit METRO M0 Express
LP0 – Analog A0 – Blue
LP1 – Analog A1 – Green
LP2 – Analog A2 – Grey
LP3 – Analog A3 – Yellow
LP4 – Analog A4 – Purple
VIN – +5V
GND – GND
DL2208Mk01p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - Slide Linear Taper Pot - Mk08 22-08 DL2208Mk01p.ino 1 x Adafruit METRO M0 Express 5 x 10k Ohm Slide Linear Taper Pot - X-Large 5 x Slide Potentiometer Knob - X-Large 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Pot int iPot0 = A0; int iPot1 = A1; int iPot2 = A2; int iPot3 = A3; int iPot4 = A4; int sensorValue0 = 0; int iValue0 = 0; int sensorValue1 = 0; int iValue1 = 0; int sensorValue2 = 0; int iValue2 = 0; int sensorValue3 = 0; int iValue3 = 0; int sensorValue4 = 0; int iValue4 = 0; // Software Version Information String sver = "22-08"; void loop() { // Pot isPot(); // Delay in between reads delay( 1000 ); }
getPot.ino
// 10k Slide Linear Taper Pot - X-Large // Pot void isPot(){ // Read the input on analog pin 0 sensorValue0 = analogRead( iPot0 ); iValue0 = map(sensorValue0, 0, 1023, 0, 255); Serial.print( "P0: " ); Serial.print( iValue0 ); // Read the input on analog pin 1 sensorValue1 = analogRead( iPot1 ); iValue1 = map(sensorValue1, 0, 1023, 0, 255); Serial.print( " P1: " ); Serial.print( iValue1 ); // Read the input on analog pin 2 sensorValue2 = analogRead( iPot2 ); iValue2 = map(sensorValue2, 0, 1023, 0, 255); Serial.print( " P2: " ); Serial.print( iValue2 ); // Read the input on analog pin 3 sensorValue3 = analogRead( iPot3 ); iValue3 = map(sensorValue3, 0, 1023, 0, 255); Serial.print( " P3: " ); Serial.print( iValue3 ); // Read the input on analog pin 4 sensorValue4 = analogRead( iPot4 ); iValue4 = map(sensorValue4, 0, 1023, 0, 255); Serial.print( " P4: " ); Serial.println( iValue4 ); }
setup.ino
// Setup void setup() { // Initialize serial communication at 9600 bits per second Serial.begin(9600); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #22: Synthesizer – Volume Sound – Mk07
——
DonLucElectronics #DonLuc #Synthesizer #UltrasonicSynth #Mozzi #Arduino #ArduinoProMini #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
Volume Sound
Volume the degree of loudness or the intensity of a sound. The volume of a sound is how loud or quiet the sound is. Sounds are vibrations that travel through the air. Volume, or loudness, is related to the strength, intensity, pressure, or power of the sound. Amplified vibrations result in louder sounds. There are a few ways of varying the volume.
I am using the Mozzi audio library to implement a simple synthesizer and using a potentiometer to control the amplitude of a sinewave with Mozzi sonification library. To convey the volume level. Volume it to an 8 bit range for efficient calculations.
DL2207Mk04
1 x Arduino Pro Mini 328 – 5V/16MHz
2 x HC-SR04 Ultrasonic Sensor
3 x 1M Ohm Potentiometer
3 x Knob
1 x Audio Jack 3.5mm
1 x SparkFun Audio Jack Breakout
1 x SparkFun USB Mini-B Breakout
1 x SPDT Slide Switch
1 x JST Jumper 2 Wire Connector
1 x JST Jumper 3 Wire Connector
1 x Insignia Speakers
1 x SparkFun Solderable Breadboard – Large
1 x SparkFun FTDI Basic Breakout – 5V
1 x SparkFun Cerberus USB Cable
Arduino Pro Mini 328 – 5V/16MHz
Ech – Digital 13
Tri – Digital 12
EcR – Digital 11
TrR – Digital 10
SPK – Digital 9
CAP – Analog A0
CAH – Analog A1
CAV – Analog A2
VIN – +5V
GND – GND
——
DL2207Mk04p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - Volume - Mk07 22-07 DL2207Mk04p.ino 1 x Arduino Pro Mini 328 - 5V/16MHz 2 x HC-SR04 Ultrasonic Sensor 3 x 1M Ohm Potentiometer 3 x Knob 1 x Audio Jack 3.5mm 1 x SparkFun Audio Jack Breakout 1 x SparkFun USB Mini-B Breakout 1 x SPDT Slide Switch 1 x JST Jumper 2 Wire Connector 1 x JST Jumper 3 Wire Connector 1 x Insignia Speakers 1 x SparkFun Solderable Breadboard - Large 1 x SparkFun FTDI Basic Breakout - 5V 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Mozzi #include <MozziGuts.h> // Oscillator #include <Oscil.h> // Table for Oscils to play #include <tables/cos2048_int8.h> // Smoothing Control #include <Smooth.h> // Maps unpredictable inputs to a range #include <AutoMap.h> // Desired carrier frequency max and min, for AutoMap const int MIN_CARRIER_FREQ = 22; const int MAX_CARRIER_FREQ = 440; // Desired intensity max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_INTENSITY = 700; const int MAX_INTENSITY = 10; // Desired mod speed max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_MOD_SPEED = 10000; const int MAX_MOD_SPEED = 1; // Maps unpredictable inputs to a range AutoMap kMapCarrierFreq(0,1023,MIN_CARRIER_FREQ,MAX_CARRIER_FREQ); AutoMap kMapIntensity(0,1023,MIN_INTENSITY,MAX_INTENSITY); AutoMap kMapModSpeed(0,1023,MIN_MOD_SPEED,MAX_MOD_SPEED); // Set the input for the knob to analog pin 0 const int KNOB_PIN = A0; // Set the analog input for fm_intensity int LDR1_PIN; // Set the analog input for mod rate int LDR2_PIN; // Table for Oscils to play Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aCarrier(COS2048_DATA); Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aModulator(COS2048_DATA); Oscil<COS2048_NUM_CELLS, CONTROL_RATE> kIntensityMod(COS2048_DATA); // Harmonics (Brightness) int iModRatio = A1; int mod_ratio; // Carries control info from updateControl to updateAudio long fm_intensity; // Smoothing for intensity to remove clicks on transitions float smoothness = 0.95f; Smooth <long> aSmoothIntensity(smoothness); // Trigger pin 12 to pitch distance sensor const int iTrigPitch = 12; // Echo Receive pin 13 to pitch distance sensor const int iEchoPitch = 13; // Define the useable range of the pitch sensor const int pitchLowThreshold = 45; const int pitchHighThreshold = 2; // Stores the distance measured by the distance sensor float distance = 0; // Trigger pin 10 to rate distance sensor const int iTrigRate = 10; // Echo Receive pin 13 to pitch distance sensor const int iEchoRate = 11; // Define the useable range of the pitch sensor const int rateLowThreshold = 45; const int rateHighThreshold = 2; // Stores the distance measured by the distance sensor float rate = 0; // Volume // Set the input for the knob to analog pin 2 const int iVolKnob = A2; // To convey the Volume level from updateControl() to updateAudio() byte bVolume; // Mini Speaker int SPK = 9; // Software Version Information String sver = "22-07"; void loop() { // Audio Hook audioHook(); }
getHC-SR04.ino
// HC-SR04 Ultrasonic Sensor // Setup HC-SR04 void setupHCSR04() { // The trigger iTrig Pitch will output pulses of electricity pinMode(iTrigPitch, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoPitch, INPUT); // The trigger iTrig Rate will output pulses of electricity pinMode(iTrigRate, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoRate, INPUT); } // Distance float isDistance() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigPitch, HIGH); delayMicroseconds(10); digitalWrite(iTrigPitch, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoPitch, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) calculatedDistance = echoTime * 0.034 / 2; // Send back the distance that was calculated return calculatedDistance; } // Rate float isRate() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigRate, HIGH); delayMicroseconds(10); digitalWrite(iTrigRate, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoRate, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) // cm = 58.0 calculatedDistance = echoTime * 0.034 / 2; // Send back the distance that was calculated return calculatedDistance; }
getMozzi.ino
// Mozzi // Update Control void updateControl(){ // Variable to store the distance measured by the sensor distance = isDistance(); // Low Threshold if ( distance >= pitchLowThreshold) { // pitchLowThreshold distance = pitchLowThreshold; } // High Threshold if ( distance < pitchHighThreshold){ // pitchHighThreshold distance = pitchHighThreshold; } // Variable to store the distance measured by the sensor rate = isRate(); // Low Threshold if ( rate >= rateLowThreshold) { // rateLowThreshold rate = rateLowThreshold; } // High Threshold if ( rate < rateHighThreshold){ // rateHighThreshold rate = rateHighThreshold; } // Map distance = map(distance, 45, 2, 0, 1023); rate = map(rate, 45, 2, 0, 1023); // Read the knob // Value is 0-1023 int knob_value = mozziAnalogRead(KNOB_PIN); // Read the mod_ratio // Value is 0-1023 mod_ratio = mozziAnalogRead(iModRatio); // Map mod_ratio = map(mod_ratio, 0, 1023, 2, 15); // Map the knob to carrier frequency int carrier_freq = kMapCarrierFreq(knob_value); // Calculate the modulation frequency to stay in ratio int mod_freq = carrier_freq * mod_ratio; // Set the FM oscillator frequencies aCarrier.setFreq(carrier_freq); aModulator.setFreq(mod_freq); // Read the light dependent resistor on the width LDR1_PIN = distance; int LDR1_value = LDR1_PIN; int LDR1_calibrated = kMapIntensity(LDR1_value); // Calculate the fm_intensity // Shift back to range after 8 bit multiply fm_intensity = ((long)LDR1_calibrated * (kIntensityMod.next()+128))>>8; // Read the light dependent resistor on the speed LDR2_PIN = rate; int LDR2_value= LDR2_PIN; // Use a float here for low frequencies float mod_speed = (float)kMapModSpeed(LDR2_value)/1000; kIntensityMod.setFreq(mod_speed); // Read the variable resistor for volume // Value is 0-1023 int iVolValue = mozziAnalogRead(iVolKnob); // map it to an 8 bit range for efficient calculations in updateAudio bVolume = map(iVolValue, 0, 1023, 155, 1); } // Update Audio int updateAudio() { // Update Audio long modulation = aSmoothIntensity.next(fm_intensity) * aModulator.next() * bVolume; return aCarrier.phMod(modulation); }
setup.ino
// Setup void setup() { // Setup HC-SR04 setupHCSR04(); // Delay delay( 200 ); // Mozzi Start startMozzi(); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #22: Synthesizer – Envelope – Mk06
——
#DonLucElectronics #DonLuc #Synthesizer #Mozzi #Keyboard #ADSREnvelope #Arduino #ArduinoProMini #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
Envelope (Music)
In sound and music, an envelope describes how a sound changes over time. It may relate to elements such as amplitude (Volume), frequencies (with the use of filters) or pitch. For example, a piano key, when struck and held, creates a near-immediate initial sound which gradually decreases in volume to zero.
Envelope generators, which allow users to control the different stages of a sound, are common features of synthesizers, samplers, and other electronic musical instruments. The most common form of envelope generator is controlled with four parameters: attack, decay, sustain and release (ADSR).
A Simple ADSR Envelope Generator
This implementation has separate update() and next() methods, where next() interpolates values between each update(). The “normal” way to use this would be with update() in updateControl(), where it calculates a new internal state each control step, and then next() is in updateAudio(), called much more often, where it interpolates between the control values. This also allows the ADSR updates to be made even more sparsely if desired, eg. every 3rd control update.
noteOn()
Start the attack phase of the ADSR. This will restart the ADSR no matter what phase it is up to. True, the envelope will start from 0, even if it is still playing, often useful for effect envelopes. If false, the envelope will start rising from the current level, which could be non-zero, if it is still playing, most useful for note envelopes.
DL2207Mk01
1 x Arduino Pro Mini 328 – 5V/16MHz
8 x Tactile Button
3 x 1K Ohm Potentiometer
3 x Knob
1 x JST Jumper 3 Wire Connector
1 x Solderable Breadboard
1 x SparkFun FTDI Basic Breakout – 5V
1 x SparkFun Cerberus USB Cable
Arduino Pro Mini 328 – 5V/16MHz
KY2 – Digital 2
KY3 – Digital 3
KY4 – Digital 4
KY5 – Digital 5
KY6 – Digital 6
KY7 – Digital 7
KY8 – Digital 8
SPK – Digital 9
KY9 – Digital 10
PFR – Analog A3
CDE – Analog A2
CAT – Analog A1
VIN – +5V
GND – GND
DL2207Mk01p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - Envelope - Mk06 22-06 DL2207Mk01p.ino 1 x Arduino Pro Mini 328 - 5V/16MHz 8 x Tactile Button 3 x 1K Ohm Potentiometer 3 x Knob 4 x SPDT Slide Switch 1 x JST Jumper 3 Wire 1 x Insignia Speakers 1 x Solderable Breadboard 1 x SparkFun FTDI Basic Breakout - 5V 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Pitches #include "pitches.h" // Mozzi #include <MozziGuts.h> // Oscillator #include <Oscil.h> // Table for Oscils to play #include <tables/sin2048_int8.h> // ADSR envelope generator #include <ADSR.h> // Simple Keyboard // Minimum reading of the button that generates a note const int iKeyboard2 = 2; const int iKeyboard3 = 3; const int iKeyboard4 = 4; const int iKeyboard5 = 5; const int iKeyboard6 = 6; const int iKeyboard7 = 7; const int iKeyboard8 = 8; const int iKeyboard9 = 10; // Button is pressed int aa = 1; int bb = 1; int cc = 1; int dd = 1; int ee = 1; int ff = 1; int gg = 1; int hh = 1; //Oscillator Functions declared for output envelope 1 // Sine Wave Oscil <2048, AUDIO_RATE> aSin1(SIN2048_DATA); // ADSR declaration/definition // Comment out to use control rate of 128 #define CONTROL_RATE 128 ADSR <CONTROL_RATE, CONTROL_RATE> envelope1; // Set the input for the potentiometer Attack to analog pin 1 const int potAttack = A1; // Attack int attack_level = 0; int iAttack = 0; // Set the input for the potentiometer for Decay to analog pin 2 const int potDecay = A2; // Decay int decay_level = 0; int iDecay = 0; // Set the input for the potentiometer for Frequency to analog pin 3 const int potFreq = A3; int iFreg = 1; int iNoteA = 0; int iNoteB = 0; int iNoteC = 0; int iNoteD = 0; int iNoteE = 0; int iNoteF = 0; int iNoteG = 0; int iNoteAA = 0; // Software Version Information String sver = "22-06"; void loop() { // Audio Hook audioHook(); }
getKeyboard.ino
// getKeyboard // setupKeyboard void setupKeyboard() { // Initialize the pushbutton pin as an input pinMode(iKeyboard2, INPUT_PULLUP); pinMode(iKeyboard3, INPUT_PULLUP); pinMode(iKeyboard4, INPUT_PULLUP); pinMode(iKeyboard5, INPUT_PULLUP); pinMode(iKeyboard6, INPUT_PULLUP); pinMode(iKeyboard7, INPUT_PULLUP); pinMode(iKeyboard8, INPUT_PULLUP); pinMode(iKeyboard9, INPUT_PULLUP); } // isKeyboard void isKeyboard() { // Choose envelope levels // attack_level iAttack = mozziAnalogRead( potAttack ); attack_level = map( iAttack, 0, 1023, 0, 255); // decay_level iDecay = mozziAnalogRead( potDecay ); decay_level = map( iDecay, 0, 1023, 0, 255); // set AD Levels envelope1.setADLevels(attack_level,decay_level); // Read the state of the pushbutton value if ( digitalRead(iKeyboard2) == LOW ) { // Button is pressed - pullup keeps pin high normally aa = aa + 1; // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteA); } else { aa = aa - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard3) == LOW ) { // Button is pressed - pullup keeps pin high normally bb = bb + 1; // Waveform envelope1.noteOn(); aSin1.setFreq(iNoteB); } else { bb = bb - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard4) == LOW ) { // Button is pressed - pullup keeps pin high normally cc = cc + 1; // Waveform // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteC); } else { cc = cc - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard5) == LOW ) { // Button is pressed - pullup keeps pin high normally dd = dd + 1; // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteD); } else { dd = dd - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard6) == LOW ) { // Button is pressed - pullup keeps pin high normally ee = ee + 1; // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteE); } else { ee = ee - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard7) == LOW ) { // Button is pressed - pullup keeps pin high normally ff = ff + 1; // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteF); } else { ff = ff - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard8) == LOW ) { // Button is pressed - pullup keeps pin high normally gg = gg + 1; // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteG); } else { gg = gg - 1; } // Read the state of the pushbutton value if ( digitalRead(iKeyboard9) == LOW ) { // Button is pressed - pullup keeps pin high normally hh = hh + 1; // ADSR declaration/definition envelope1.noteOn(); aSin1.setFreq(iNoteAA); } else { hh = hh - 1; } }
getMozzi.ino
// Mozzi // Update Control void updateControl(){ // Frequency isPitches(); // Keyboard isKeyboard(); } // Update Audio int updateAudio() { // Update Audio // ADSR declaration/definition envelope1.update(); // >>8 for AUDIO_MODE STANDARD return (int) (envelope1.next() * aSin1.next())>>8; }
getPitches.ino
// Pitches // isPitches void isPitches(){ // Frequency // Value is 0-1023 iFreg = mozziAnalogRead(potFreq); iFreg = map(iFreg, 0, 1023, 3, 6); // Range Frequency Note Low => High switch ( iFreg ) { case 1: // NOTE A1 iNoteA = NOTE_A1; iNoteB = NOTE_B1; iNoteC = NOTE_C2; iNoteD = NOTE_D2; iNoteE = NOTE_E2; iNoteF = NOTE_F2; iNoteG = NOTE_G2; iNoteAA = NOTE_A2; break; case 2: // NOTE A2 iNoteA = NOTE_A2; iNoteB = NOTE_B2; iNoteC = NOTE_C3; iNoteD = NOTE_D3; iNoteE = NOTE_E3; iNoteF = NOTE_F3; iNoteG = NOTE_G3; iNoteAA = NOTE_A3; break; case 3: // NOTE A3 iNoteA = NOTE_A3; iNoteB = NOTE_B3; iNoteC = NOTE_C4; iNoteD = NOTE_D4; iNoteE = NOTE_E4; iNoteF = NOTE_F4; iNoteG = NOTE_G4; iNoteAA = NOTE_A4; break; case 4: // NOTE A4 iNoteA = NOTE_A4; iNoteB = NOTE_B4; iNoteC = NOTE_C5; iNoteD = NOTE_D5; iNoteE = NOTE_E5; iNoteF = NOTE_F5; iNoteG = NOTE_G5; iNoteAA = NOTE_A5; break; case 5: // NOTE A5 iNoteA = NOTE_A5; iNoteB = NOTE_B5; iNoteC = NOTE_C6; iNoteD = NOTE_D6; iNoteE = NOTE_E6; iNoteF = NOTE_F6; iNoteG = NOTE_G6; iNoteAA = NOTE_A6; break; case 6: // NOTE A6 iNoteA = NOTE_A6; iNoteB = NOTE_B6; iNoteC = NOTE_C7; iNoteD = NOTE_D7; iNoteE = NOTE_E7; iNoteF = NOTE_F7; iNoteG = NOTE_G7; iNoteAA = NOTE_A7; break; } }
pitches.h
/***************************************************************** * Pitches NOTE_B0 <=> NOTE_DS8 - NOTE_A4 is "A" measured at 440Hz *****************************************************************/ #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978
setup.ino
// Setup void setup() { // Setup Keyboard setupKeyboard(); // Mozzi Start startMozzi( CONTROL_RATE ); // Sets Attack and Decay Levels; assumes Sustain, Decay, and Idle times envelope1.setADLevels(200,200); // Sets Decay time in milliseconds envelope1.setDecayTime(100); // Sustain Time setting for envelope1 envelope1.setSustainTime(32500); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #22: Synthesizer – Harmonics – Mk05
——
#DonLucElectronics #DonLuc #Synthesizer #UltrasonicSynth #Mozzi #Arduino #ArduinoProMini #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
Harmonics – Brightness
Nearly all signals contain energy at harmonic frequencies, in addition to the energy at the fundamental frequency. If it contains all the energy in a signal at the fundamental frequency, then that signal is a perfect sine wave. If the signal is not a perfect sine wave, then some energy is contained in the harmonics. Some waveforms contain large amounts of energy at harmonic frequencies.
Ratio
So in the harmonic series, we have a fundamental (pitch/note) and a succession of harmonics that stem from the fundamental which also hold other pitches within themselves.
Arduino – Map
map(value, fromLow, fromHigh, toLow, toHigh)
Re-maps a number from one range to another. That is, a value of fromLow would get mapped to toLow, a value of fromHigh to toHigh, values in-between to values in-between, etc…
DL2206Mk03
1 x Arduino Pro Mini 328 – 5V/16MHz
2 x HC-SR04 Ultrasonic Sensor
2 x 1M Ohm Potentiometer
2 x Knob
1 x Audio Jack 3.5mm
1 x SparkFun Audio Jack Breakout
1 x SparkFun USB Mini-B Breakout
1 x SPDT Slide Switch
1 x JST Jumper 2 Wire Connector
1 x JST Jumper 3 Wire Connector
1 x Insignia Speakers
1 x SparkFun Solderable Breadboard – Large
1 x SparkFun FTDI Basic Breakout – 5V
1 x SparkFun Cerberus USB Cable
Arduino Pro Mini 328 – 5V/16MHz
Ech – Digital 13
Tri – Digital 12
EcR – Digital 11
TrR – Digital 10
SPK – Digital 9
CAP – Analog A0
CAH – Analog A1
VIN – +5V
GND – GND
——
DL2206Mk03p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - Harmonics - Mk05 22-05 DL2206Mk03p.ino 1 x Arduino Pro Mini 328 - 5V/16MHz 2 x HC-SR04 Ultrasonic Sensor 2 x 1M Ohm Potentiometer 2 x Knob 1 x Audio Jack 3.5mm 1 x SparkFun Audio Jack Breakout 1 x SparkFun USB Mini-B Breakout 1 x SPDT Slide Switch 1 x JST Jumper 2 Wire Connector 1 x JST Jumper 3 Wire Connector 1 x Insignia Speakers 1 x SparkFun Solderable Breadboard - Large 1 x SparkFun FTDI Basic Breakout - 5V 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Mozzi #include <MozziGuts.h> // Oscillator #include <Oscil.h> // Table for Oscils to play #include <tables/cos2048_int8.h> // Smoothing Control #include <Smooth.h> // Maps unpredictable inputs to a range #include <AutoMap.h> // Desired carrier frequency max and min, for AutoMap const int MIN_CARRIER_FREQ = 22; const int MAX_CARRIER_FREQ = 440; // Desired intensity max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_INTENSITY = 700; const int MAX_INTENSITY = 10; // Desired mod speed max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_MOD_SPEED = 10000; const int MAX_MOD_SPEED = 1; // Maps unpredictable inputs to a range AutoMap kMapCarrierFreq(0,1023,MIN_CARRIER_FREQ,MAX_CARRIER_FREQ); AutoMap kMapIntensity(0,1023,MIN_INTENSITY,MAX_INTENSITY); AutoMap kMapModSpeed(0,1023,MIN_MOD_SPEED,MAX_MOD_SPEED); // Set the input for the knob to analog pin 0 const int KNOB_PIN = A0; // Set the analog input for fm_intensity int LDR1_PIN; // Set the analog input for mod rate int LDR2_PIN; // Table for Oscils to play Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aCarrier(COS2048_DATA); Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aModulator(COS2048_DATA); Oscil<COS2048_NUM_CELLS, CONTROL_RATE> kIntensityMod(COS2048_DATA); // Harmonics (Brightness) int iModRatio = A1; int mod_ratio; // Carries control info from updateControl to updateAudio long fm_intensity; // Smoothing for intensity to remove clicks on transitions float smoothness = 0.95f; Smooth <long> aSmoothIntensity(smoothness); // Trigger pin 12 to pitch distance sensor const int iTrigPitch = 12; // Echo Receive pin 13 to pitch distance sensor const int iEchoPitch = 13; // Define the useable range of the pitch sensor const int pitchLowThreshold = 45; const int pitchHighThreshold = 2; // Stores the distance measured by the distance sensor float distance = 0; // Trigger pin 10 to rate distance sensor const int iTrigRate = 10; // Echo Receive pin 13 to pitch distance sensor const int iEchoRate = 11; // Define the useable range of the pitch sensor const int rateLowThreshold = 45; const int rateHighThreshold = 2; // Stores the distance measured by the distance sensor float rate = 0; // Mini Speaker int SPK = 9; // Software Version Information String sver = "22-05"; void loop() { // Audio Hook audioHook(); }
getHC-SR04.ino
// HC-SR04 Ultrasonic Sensor // Setup HC-SR04 void setupHCSR04() { // The trigger iTrig Pitch will output pulses of electricity pinMode(iTrigPitch, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoPitch, INPUT); // The trigger iTrig Rate will output pulses of electricity pinMode(iTrigRate, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoRate, INPUT); } // Distance float isDistance() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigPitch, HIGH); delayMicroseconds(10); digitalWrite(iTrigPitch, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoPitch, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) calculatedDistance = echoTime * 0.034 / 2; // Send back the distance that was calculated return calculatedDistance; } // Rate float isRate() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigRate, HIGH); delayMicroseconds(10); digitalWrite(iTrigRate, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoRate, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) // cm = 58.0 calculatedDistance = echoTime * 0.034 / 2; // Send back the distance that was calculated return calculatedDistance; }
getMozzi.ino
// Mozzi // Update Control void updateControl(){ // Variable to store the distance measured by the sensor distance = isDistance(); // Low Threshold if ( distance >= pitchLowThreshold) { // pitchLowThreshold distance = pitchLowThreshold; } // High Threshold if ( distance < pitchHighThreshold){ // pitchHighThreshold distance = pitchHighThreshold; } // Variable to store the distance measured by the sensor rate = isRate(); // Low Threshold if ( rate >= rateLowThreshold) { // rateLowThreshold rate = rateLowThreshold; } // High Threshold if ( rate < rateHighThreshold){ // rateHighThreshold rate = rateHighThreshold; } // Map distance = map(distance, 45, 2, 0, 1023); rate = map(rate, 45, 2, 0, 1023); // Read the knob // Value is 0-1023 int knob_value = mozziAnalogRead(KNOB_PIN); // Read the mod_ratio // Value is 0-1023 mod_ratio = mozziAnalogRead(iModRatio); // Map mod_ratio = map(mod_ratio, 0, 1023, 2, 15); // Map the knob to carrier frequency int carrier_freq = kMapCarrierFreq(knob_value); // Calculate the modulation frequency to stay in ratio int mod_freq = carrier_freq * mod_ratio; // Set the FM oscillator frequencies aCarrier.setFreq(carrier_freq); aModulator.setFreq(mod_freq); // Read the light dependent resistor on the width LDR1_PIN = distance; int LDR1_value = LDR1_PIN; int LDR1_calibrated = kMapIntensity(LDR1_value); // Calculate the fm_intensity // Shift back to range after 8 bit multiply fm_intensity = ((long)LDR1_calibrated * (kIntensityMod.next()+128))>>8; // Read the light dependent resistor on the speed LDR2_PIN = rate; int LDR2_value= LDR2_PIN; // Use a float here for low frequencies float mod_speed = (float)kMapModSpeed(LDR2_value)/1000; kIntensityMod.setFreq(mod_speed); } // Update Audio int updateAudio() { // Update Audio long modulation = aSmoothIntensity.next(fm_intensity) * aModulator.next(); return aCarrier.phMod(modulation); }
setup.ino
// Setup void setup() { // Setup HC-SR04 setupHCSR04(); // Delay delay( 200 ); // Mozzi Start startMozzi(); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #22: Synthesizer – Solderable Breadboard – Large – Mk04
——
#DonLucElectronics #DonLuc #Synthesizer #UltrasonicSynth #Arduino #ArduinoProMini #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
SparkFun Solderable Breadboard – Large
This is the Large SparkFun Solderable Breadboard. A bare PCB that is the exact size as our full-size breadboard with the same connections to pins and power rails. This board is especially useful for preserving a prototype or experiment you just created on a solderless breadboard by soldering all the pieces in place. The large solderable breadboard also includes real estate for screw terminal connectors and a trace down the center gutter for ground.
DL2206Mk02
1 x Arduino Pro Mini 328 – 5V/16MHz
2 x HC-SR04 Ultrasonic Sensor
1 x 1M Ohm Potentiometer
1 x Knob
1 x Audio Jack 3.5mm
1 x SparkFun Audio Jack Breakout
1 x SparkFun USB Mini-B Breakout
1 x SPDT Slide Switch
1 x JST Jumper 2 Wire Connector
1 x JST Jumper 3 Wire Connector
1 x Insignia Speakers
1 x SparkFun Solderable Breadboard – Large
1 x SparkFun FTDI Basic Breakout – 5V
1 x SparkFun Cerberus USB Cable
Arduino Pro Mini 328 – 5V/16MHz
Ech – Digital 13
Tri – Digital 12
EcR – Digital 11
TrR – Digital 10
SPK – Digital 9
CAP – Analog A0
VIN – +5V
GND – GND
——
DL2206Mk02p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - Solderable Breadboard - Large - Mk04 22-04 DL2206Mk02p.ino 1 x Arduino Pro Mini 328 - 5V/16MHz 2 x HC-SR04 Ultrasonic Sensor 1 x 1M Ohm Potentiometer 1 x Knob 1 x Audio Jack 3.5mm 1 x SparkFun Audio Jack Breakout 1 x SparkFun USB Mini-B Breakout 1 x SPDT Slide Switch 1 x JST Jumper 2 Wire Connector 1 x JST Jumper 3 Wire Connector 1 x Insignia Speakers 1 x SparkFun Solderable Breadboard - Large 1 x SparkFun FTDI Basic Breakout - 5V 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Mozzi #include <MozziGuts.h> // Oscillator #include <Oscil.h> // Table for Oscils to play #include <tables/cos2048_int8.h> // Smoothing Control #include <Smooth.h> // Maps unpredictable inputs to a range #include <AutoMap.h> // Desired carrier frequency max and min, for AutoMap const int MIN_CARRIER_FREQ = 22; const int MAX_CARRIER_FREQ = 440; // Desired intensity max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_INTENSITY = 700; const int MAX_INTENSITY = 10; // Desired mod speed max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_MOD_SPEED = 10000; const int MAX_MOD_SPEED = 1; // Maps unpredictable inputs to a range AutoMap kMapCarrierFreq(0,1023,MIN_CARRIER_FREQ,MAX_CARRIER_FREQ); AutoMap kMapIntensity(0,1023,MIN_INTENSITY,MAX_INTENSITY); AutoMap kMapModSpeed(0,1023,MIN_MOD_SPEED,MAX_MOD_SPEED); // Set the input for the knob to analog pin 0 const int KNOB_PIN = A0; // Set the analog input for fm_intensity int LDR1_PIN; // Set the analog input for mod rate int LDR2_PIN; // Table for Oscils to play Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aCarrier(COS2048_DATA); Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aModulator(COS2048_DATA); Oscil<COS2048_NUM_CELLS, CONTROL_RATE> kIntensityMod(COS2048_DATA); // Brightness (harmonics) int mod_ratio = 5; // Carries control info from updateControl to updateAudio long fm_intensity; // Smoothing for intensity to remove clicks on transitions float smoothness = 0.95f; Smooth <long> aSmoothIntensity(smoothness); // Trigger pin 12 to pitch distance sensor const int iTrigPitch = 12; // Echo Receive pin 13 to pitch distance sensor const int iEchoPitch = 13; // Define the useable range of the pitch sensor const int pitchLowThreshold = 45; const int pitchHighThreshold = 2; // Stores the distance measured by the distance sensor float distance = 0; // Trigger pin 10 to rate distance sensor const int iTrigRate = 10; // Echo Receive pin 13 to pitch distance sensor const int iEchoRate = 11; // Define the useable range of the pitch sensor const int rateLowThreshold = 45; const int rateHighThreshold = 2; // Stores the distance measured by the distance sensor float rate = 0; // Mini Speaker int SPK = 9; // Software Version Information String sver = "22-04"; void loop() { // Audio Hook audioHook(); }
getHC-SR04.ino
// HC-SR04 Ultrasonic Sensor // Setup HC-SR04 void setupHCSR04() { // The trigger iTrig Pitch will output pulses of electricity pinMode(iTrigPitch, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoPitch, INPUT); // The trigger iTrig Rate will output pulses of electricity pinMode(iTrigRate, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoRate, INPUT); } // Distance float isDistance() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigPitch, HIGH); delayMicroseconds(10); digitalWrite(iTrigPitch, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoPitch, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) calculatedDistance = echoTime * 0.034 / 2; // Send back the distance that was calculated return calculatedDistance; } // Rate float isRate() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigRate, HIGH); delayMicroseconds(10); digitalWrite(iTrigRate, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoRate, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) // cm = 58.0 calculatedDistance = echoTime * 0.034 / 2; // Send back the distance that was calculated return calculatedDistance; }
getMozzi.ino
// Mozzi // Update Control void updateControl(){ // Variable to store the distance measured by the sensor distance = isDistance(); // Low Threshold if ( distance >= pitchLowThreshold) { // pitchLowThreshold distance = pitchLowThreshold; } // High Threshold if ( distance < pitchHighThreshold){ // pitchHighThreshold distance = pitchHighThreshold; } // Variable to store the distance measured by the sensor rate = isRate(); // Low Threshold if ( rate >= rateLowThreshold) { // rateLowThreshold rate = rateLowThreshold; } // High Threshold if ( rate < rateHighThreshold){ // rateHighThreshold rate = rateHighThreshold; } // Read the knob // Value is 0-1023 int knob_value = mozziAnalogRead(KNOB_PIN); // Map the knob to carrier frequency int carrier_freq = kMapCarrierFreq(knob_value); // Calculate the modulation frequency to stay in ratio int mod_freq = carrier_freq * mod_ratio; // Set the FM oscillator frequencies aCarrier.setFreq(carrier_freq); aModulator.setFreq(mod_freq); // Read the light dependent resistor on the width LDR1_PIN = distance; int LDR1_value = LDR1_PIN; int LDR1_calibrated = kMapIntensity(LDR1_value); // Calculate the fm_intensity // Shift back to range after 8 bit multiply fm_intensity = ((long)LDR1_calibrated * (kIntensityMod.next()+128))>>8; // Read the light dependent resistor on the speed LDR2_PIN = rate; int LDR2_value= LDR2_PIN; // Use a float here for low frequencies float mod_speed = (float)kMapModSpeed(LDR2_value)/1000; kIntensityMod.setFreq(mod_speed); } // Update Audio int updateAudio() { // Update Audio long modulation = aSmoothIntensity.next(fm_intensity) * aModulator.next(); return aCarrier.phMod(modulation); }
setup.ino
// Setup void setup() { // Setup HC-SR04 setupHCSR04(); // Delay delay( 200 ); // Mozzi Start startMozzi(); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #22: Synthesizer – UltrasonicSynth – Mk03
——
#DonLucElectronics #DonLuc #Synthesizer #UltrasonicSynth #Arduino #ArduinoProMini #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
UltrasonicSynth Mozzi
Oscil
Oscil plays a wavetable, cycling through the table to generate an audio or control signal. The frequency of the signal can be set or changed, and the output of an Oscil can be produced with for a simple cycling oscillator, or for a particular sample in the table.
Soundtables
Look-up-tables and python scripts to generate tables or convert sounds. Includes ready-to-use wave tables and a few example samples. Also check out the other scripts in the python folder for templates to use if you want to do your own thing.
Smooth
A simple infinite impulse response low pass filter for smoothing control or audio signals. Smoothness sets how much smoothing the filter will apply to its input. Use a float in the range 0 – 1, where 0 is not very smooth and 0.99 is very smooth.
AutoMap
Automatically map an input value to an output range without knowing the precise range of inputs beforehand.
DL2204Mk01
1 x Arduino Pro Mini 328 – 5V/16MHz
2 x HC-SR04 Ultrasonic Sensor
1 x 1M Ohm Potentiometer
1 x Knob
1 x Audio Jack 3.5mm
1 x SparkFun Audio Jack Breakout
1 x Insignia Speakers
1 x Full-Size Breadboard
1 x Half-Size Breadboard
1 x SparkFun FTDI Basic Breakout – 5V
1 x SparkFun Cerberus USB Cable
Arduino Pro Mini 328 – 5V/16MHz
Ech – Digital 13
Tri – Digital 12
EcR – Digital 11
TrR – Digital 10
SPK – Digital 9
CAP – Analog A0
VIN – +5V
GND – GND
——
DL2206Mk01p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #22: Synthesizer - UltrasonicSynth - Mk03 22-03 DL2206Mk01p.ino 1 x Arduino Pro Mini 328 - 5V/16MHz 2 x HC-SR04 Ultrasonic Sensor 1 x 1M Ohm Potentiometer 1 x Knob 1 x Audio Jack 3.5mm 1 x SparkFun Audio Jack Breakout 1 x Insignia Speakers 1 x Full-Size Breadboard 1 x Half-Size Breadboard 1 x SparkFun FTDI Basic Breakout - 5V 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Mozzi #include <MozziGuts.h> // Oscillator #include <Oscil.h> // Table for Oscils to play #include <tables/cos2048_int8.h> // Smoothing Control #include <Smooth.h> // Maps unpredictable inputs to a range #include <AutoMap.h> // Desired carrier frequency max and min, for AutoMap const int MIN_CARRIER_FREQ = 22; const int MAX_CARRIER_FREQ = 440; // Desired intensity max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_INTENSITY = 450; const int MAX_INTENSITY = 50; // Desired mod speed max and min, for AutoMap, note they're inverted for reverse dynamics const int MIN_MOD_SPEED = 450; const int MAX_MOD_SPEED = 50; // Maps unpredictable inputs to a range AutoMap kMapCarrierFreq(0,1023,MIN_CARRIER_FREQ,MAX_CARRIER_FREQ); AutoMap kMapIntensity(0,1023,MIN_INTENSITY,MAX_INTENSITY); AutoMap kMapModSpeed(0,1023,MIN_MOD_SPEED,MAX_MOD_SPEED); // Set the input for the knob to analog pin 0 const int KNOB_PIN = A0; // Set the analog input for fm_intensity int LDR1_PIN; // Set the analog input for mod rate int LDR2_PIN; // Table for Oscils to play Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aCarrier(COS2048_DATA); Oscil<COS2048_NUM_CELLS, AUDIO_RATE> aModulator(COS2048_DATA); Oscil<COS2048_NUM_CELLS, CONTROL_RATE> kIntensityMod(COS2048_DATA); // Brightness (harmonics) int mod_ratio = 5; // Carries control info from updateControl to updateAudio long fm_intensity; // Smoothing for intensity to remove clicks on transitions float smoothness = 0.95f; Smooth <long> aSmoothIntensity(smoothness); // Trigger pin 12 to pitch distance sensor const int iTrigPitch = 12; // Echo Receive pin 13 to pitch distance sensor const int iEchoPitch = 13; // Define the useable range of the pitch sensor const int pitchLowThreshold = 450; const int pitchHighThreshold = 50; // Stores the distance measured by the distance sensor float distance = 0; // Trigger pin 10 to rate distance sensor const int iTrigRate = 10; // Echo Receive pin 13 to pitch distance sensor const int iEchoRate = 11; // Define the useable range of the pitch sensor const int rateLowThreshold = 450; const int rateHighThreshold = 50; // Stores the distance measured by the distance sensor float rate = 0; // Mini Speaker int SPK = 9; // Software Version Information String sver = "22-03"; void loop() { // Audio Hook audioHook(); }
getHC-SR04.ino
// HC-SR04 Ultrasonic Sensor // Setup HC-SR04 void setupHCSR04() { // The trigger iTrig Pitch will output pulses of electricity pinMode(iTrigPitch, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoPitch, INPUT); // The trigger iTrig Rate will output pulses of electricity pinMode(iTrigRate, OUTPUT); // The echo iEcho will measure the duration of pulses coming back from the distance sensor pinMode(iEchoRate, INPUT); } // Distance float isDistance() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigPitch, HIGH); delayMicroseconds(10); digitalWrite(iTrigPitch, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoPitch, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) // cm = 58.0 calculatedDistance = echoTime / 58.0; // Send back the distance that was calculated return calculatedDistance; } // Rate float isRate() { // Variable to store the time it takes for a ping to bounce off an object float echoTime; // Variable to store the distance calculated from the echo time float calculatedDistance; // Send out an ultrasonic pulse that's 10ms long digitalWrite(iTrigRate, HIGH); delayMicroseconds(10); digitalWrite(iTrigRate, LOW); // Use the pulseIn command to see how long it takes for the // pulse to bounce back to the sensor echoTime = pulseIn(iEchoRate, HIGH); // Calculate the distance of the object that reflected the pulse // (half the bounce time multiplied by the speed of sound) // cm = 58.0 calculatedDistance = echoTime / 58.0; // Send back the distance that was calculated return calculatedDistance; }
getMozzi.ino
// Mozzi // Update Control void updateControl(){ // Variable to store the distance measured by the sensor distance = isDistance(); // Low Threshold if ( distance >= pitchLowThreshold) { // pitchLowThreshold distance = pitchLowThreshold; } // High Threshold if ( distance < pitchHighThreshold){ // pitchHighThreshold distance = pitchHighThreshold; } // Variable to store the distance measured by the sensor rate = isRate(); // Low Threshold if ( rate >= rateLowThreshold) { // rateLowThreshold rate = rateLowThreshold; } // High Threshold if ( rate < rateHighThreshold){ // rateHighThreshold rate = rateHighThreshold; } // Read the knob // Value is 0-1023 int knob_value = mozziAnalogRead(KNOB_PIN); // Map the knob to carrier frequency int carrier_freq = kMapCarrierFreq(knob_value); // Calculate the modulation frequency to stay in ratio int mod_freq = carrier_freq * mod_ratio; // Set the FM oscillator frequencies aCarrier.setFreq(carrier_freq); aModulator.setFreq(mod_freq); // Read the light dependent resistor on the width LDR1_PIN = distance; int LDR1_value = LDR1_PIN; int LDR1_calibrated = kMapIntensity(LDR1_value); // Calculate the fm_intensity // Shift back to range after 8 bit multiply fm_intensity = ((long)LDR1_calibrated * (kIntensityMod.next()+128))>>8; // Read the light dependent resistor on the speed LDR2_PIN = rate; int LDR2_value= LDR2_PIN; // Use a float here for low frequencies float mod_speed = (float)kMapModSpeed(LDR2_value)/1000; kIntensityMod.setFreq(mod_speed); } // Update Audio int updateAudio() { // Update Audio long modulation = aSmoothIntensity.next(fm_intensity) * aModulator.next(); return aCarrier.phMod(modulation); }
setup.ino
// Setup void setup() { // Setup HC-SR04 setupHCSR04(); // Delay delay( 200 ); // Mozzi Start startMozzi(); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #23: E-Textiles – Coin Cell Battery – Mk08
——
#DonLucElectronics #DonLuc #ETextiles #Wearable #FLORA #BME280 #CCS811 #CoinCell #RTC #SD #Arduino #Project #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
Coin Cell Battery Holder – 2 x CR2032 (Enclosed)
This is a simple coin cell battery holder that can enclose two CR2032 batteries inside itself, and safely kept closed via two phillips head screws. Each battery holder will run batteries in series, output up to 6V, and is equipped with an On/Off slide switch and two 6″ power wires (one positive and one negative) on the back.
DL2205Mk03
1 x FLORA – Version 1.0a
1 x SparkFun Environmental Combo CCS811/BME280
1 x DS3231 Precision RTC FeatherWing
1 x MicroSD card breakout board+
1 x MicroSD card 8 Gb
1 x CR1220 Coin Cell Battery
1 x LED Red
1 x 220 Ohm
1 x Coin Cell Battery Holder – 2 x CR2032
2 x CR2032 Coin Cell Battery
1 x SparkFun Cerberus USB Cable
FLORA – Version 1.0a
CLK – ICSP 3
DO – ICSP 1
DI – ICSP 4
CS – Digital 10
LER – Digital 6
SCL – Digital 3
SDA – Digital 2
VIN – +5V
VIN – +3.3V
GND – GND
——
DL2205Mk03p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #23: E-Textiles - Coin Cell Battery - Mk08 23-08 DL2205Mk03p.ino 1 x FLORA - Version 1.0a 1 x SparkFun Environmental Combo CCS811/BME280 1 x DS3231 Precision RTC FeatherWing 1 x MicroSD card breakout board+ 1 x MicroSD card 8 Gb 1 x CR1220 Coin Cell Battery 1 x LED Red 1 x 220 Ohm 1 x Coin Cell Battery Holder - 2 x CR2032 2 x CR2032 Coin Cell Battery 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Wire #include <Wire.h> // SparkFun BME280 - Humidity, Temperature, Altitude and Barometric Pressure #include <SparkFunBME280.h> // SparkFun CCS811 - eCO2 & tVOC #include <SparkFunCCS811.h> // Date and time DS3231 RTC #include <RTClib.h> // Serial Peripheral Interface (SPI) #include <SPI.h> // Secure Digital (SD Card) #include <SD.h> // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure BME280 myBME280; // Temperature Celsius float BMEtempC = 0; // Humidity float BMEhumid = 0; // Altitude Meters float BMEaltitudeM = 0; // Barometric Pressure float BMEpressure = 0; // SparkFun CCS811 - eCO2 & tVOC // Default I2C Address #define CCS811_ADDR 0x5B CCS811 myCCS811(CCS811_ADDR); // eCO2 float CCS811CO2 = 0; // TVOC float CCS811TVOC = 0; // Date and time functions using a DS3231 RTC RTC_DS3231 RTC; String sDate; String sTime; // Secure Digital (SD Card) const int chipSelect = 10; String zzzzzz = ""; // LED Red const int iLEDR = 6; // Software Version Information String sver = "23-08"; void loop() { // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure isBME280(); // SparkFun CCS811 - eCO2 & tVOC isCCS811(); // Dates and Time timeRTC(); // MicroSD Card isSD(); // 1 Seconds delay( 1000 ); }
getBME280.ino
// SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure // isBME280 - Temperature, Humidity, Altitude and Barometric Pressure void isBME280(){ // Temperature Celsius BMEtempC = myBME280.readTempC(); // Humidity BMEhumid = myBME280.readFloatHumidity() ; // Altitude Meters BMEaltitudeM = myBME280.readFloatAltitudeMeters(); // Barometric Pressure BMEpressure = myBME280.readFloatPressure(); }
getCCS811.ino
// CCS811 - eCO2 & tVOC // isCCS811 - eCO2 & tVOC void isCCS811(){ // This sends the temperature & humidity data to the CCS811 myCCS811.setEnvironmentalData(BMEhumid, BMEtempC); // Calling this function updates the global tVOC and eCO2 variables myCCS811.readAlgorithmResults(); // eCO2 Concentration CCS811CO2 = myCCS811.getCO2(); // tVOC Concentration CCS811TVOC = myCCS811.getTVOC(); }
getRTCDS3231.ino
// DS3231 Precision RTC // Setup RTC void setupRTC() { // DS3231 Precision RTC RTC.begin(); if (! RTC.begin()) { while (1); } DateTime now = RTC.now(); if (RTC.lostPower()) { // Following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // August 2, 2021 at 13:53:0 you would call: // RTC.adjust(DateTime(2022, 4, 26, 11, 39, 0)); } } // timeRTC void timeRTC() { // DS3231 Precision RTC sDate = ""; sTime = ""; // Date Time DateTime now = RTC.now(); // sData sDate += String(now.year(), DEC); sDate += "/"; sDate += String(now.month(), DEC); sDate += "/"; sDate += String(now.day(), DEC); // sTime sTime += String(now.hour(), DEC); sTime += ":"; sTime += String(now.minute(), DEC); sTime += ":"; sTime += String(now.second(), DEC); }
getSD.ino
// MicroSD Card // MicroSD Setup void setupSD() { // MicroSD Card // See if the card is present and can be initialized: if (!SD.begin(chipSelect)) { // Don't do anything more: while (1); } } // MicroSD Card void isSD() { zzzzzz = ""; // Version|Date|Time|Temperature Celsius|Humidity|Altitude Meters|Barometric Pressure //|eCO2 Concentration|tVOC Concentration| zzzzzz = sver + "|" + sDate + "|" + sTime + "|" + BMEtempC + "|" + BMEhumid + "|" + BMEaltitudeM + "|" + BMEpressure + "|" + CCS811CO2 + "|" + CCS811TVOC + "|"; // Open the file. Note that only one file can be open at a time, // so you have to close this one before opening another. File dataFile = SD.open("DLE22Log.txt", FILE_WRITE); // If the file is available, write to it: if (dataFile) { // Write dataFile.println( zzzzzz ); dataFile.close(); } }
setup.ino
// Setup void setup() { // Delay delay( 100 ); // Set up I2C bus Wire.begin(); // Delay delay( 50 ); // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure myBME280.begin(); // CCS811 - eCO2 & tVOC myCCS811.begin(); // Setup RTC setupRTC(); //MicroSD Card setupSD(); // LED Red pinMode( iLEDR , OUTPUT); // Turn the LED Red on HIGH digitalWrite( iLEDR , HIGH); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #23: E-Textiles – MicroSD Card – Mk07
——
#DonLucElectronics #DonLuc #ETextiles #Wearable #FLORA #BME280 #CCS811 #RTC #SD #Arduino #Project #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
MicroSD Card Breakout Board+
Not just a simple breakout board, this microSD adapter goes the extra mile designed for ease of use.
- Onboard 5 Volt – 3 Volt regulator provides 150mA for power-hungry cards.
- 3 Volt level shifting means you can use this with ease on either 3 Volt or 5 Volt systems.
- Uses a proper level shifting chip, not resistors, less problems, and faster read/write access.
- Use 3 or 4 digital pins to read and write 8 Gb of storage.
- Activity LED lights up when the SD card is being read or written.
- Push-push socket with card slightly over the edge of the PCB so its easy to insert and remove.
- Comes with 0.1″ header, unattached, so you can get it on a breadboard or use wires your choice.
To use with an Arduino, connect GND to ground, 5 Volt – 3 Volt to 5 Volt – 3 Volt, CLK to pin 13, DO to pin 12, DI to pin 11, and CS to pin 10. Then you can use the Arduino IDE’s SD library which supports FAT and FAT32 SD cards.
DL2205Mk01
1 x FLORA – Version 1.0a
1 x SparkFun Environmental Combo CCS811/BME280
1 x DS3231 Precision RTC FeatherWing
1 x MicroSD card breakout board+
1 x MicroSD card 8 Gb
1 x CR1220 Coin Cell Battery
1 x LED Red
1 x 220 Ohm
1 x SparkFun Cerberus USB Cable
FLORA – Version 1.0a
CLK – ICSP 3
DO – ICSP 1
DI – ICSP 4
CS – Digital 10
LER – Digital 6
SCL – Digital 3
SDA – Digital 2
VIN – +5V
VIN – +3.3V
GND – GND
——
DL2205Mk01p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #23: E-Textiles - MicroSD Card - Mk07 23-07 DL2205Mk01p.ino 1 x FLORA - Version 1.0a 1 x SparkFun Environmental Combo CCS811/BME280 1 x DS3231 Precision RTC FeatherWing 1 x MicroSD card breakout board+ 1 x MicroSD card 8 Gb 1 x CR1220 Coin Cell Battery 1 x LED Red 1 x 220 Ohm 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Wire #include <Wire.h> // SparkFun BME280 - Humidity, Temperature, Altitude and Barometric Pressure #include <SparkFunBME280.h> // SparkFun CCS811 - eCO2 & tVOC #include <SparkFunCCS811.h> // Date and time DS3231 RTC #include <RTClib.h> // Serial Peripheral Interface (SPI) #include <SPI.h> // Secure Digital (SD Card) #include <SD.h> // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure BME280 myBME280; // Temperature Celsius float BMEtempC = 0; // Humidity float BMEhumid = 0; // Altitude Meters float BMEaltitudeM = 0; // Barometric Pressure float BMEpressure = 0; // SparkFun CCS811 - eCO2 & tVOC // Default I2C Address #define CCS811_ADDR 0x5B CCS811 myCCS811(CCS811_ADDR); // eCO2 float CCS811CO2 = 0; // TVOC float CCS811TVOC = 0; // Date and time functions using a DS3231 RTC RTC_DS3231 RTC; String sDate; String sTime; // Secure Digital (SD Card) const int chipSelect = 10; String zzzzzz = ""; // LED Red const int iLEDR = 6; // Software Version Information String sver = "23-07"; void loop() { // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure isBME280(); // SparkFun CCS811 - eCO2 & tVOC isCCS811(); // Dates and Time timeRTC(); // MicroSD Card isSD(); // 1 Seconds delay( 1000 ); }
getBME280.ino
// SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure // isBME280 - Temperature, Humidity, Altitude and Barometric Pressure void isBME280(){ // Temperature Celsius BMEtempC = myBME280.readTempC(); // Humidity BMEhumid = myBME280.readFloatHumidity() ; // Altitude Meters BMEaltitudeM = myBME280.readFloatAltitudeMeters(); // Barometric Pressure BMEpressure = myBME280.readFloatPressure(); }
getCCS811.ino
// CCS811 - eCO2 & tVOC // isCCS811 - eCO2 & tVOC void isCCS811(){ // This sends the temperature & humidity data to the CCS811 myCCS811.setEnvironmentalData(BMEhumid, BMEtempC); // Calling this function updates the global tVOC and eCO2 variables myCCS811.readAlgorithmResults(); // eCO2 Concentration CCS811CO2 = myCCS811.getCO2(); // tVOC Concentration CCS811TVOC = myCCS811.getTVOC(); }
getRTCDS3231.ino
// DS3231 Precision RTC // Setup RTC void setupRTC() { // DS3231 Precision RTC RTC.begin(); if (! RTC.begin()) { while (1); } DateTime now = RTC.now(); if (RTC.lostPower()) { // Following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // August 2, 2021 at 13:53:0 you would call: // RTC.adjust(DateTime(2022, 4, 26, 11, 39, 0)); } } // timeRTC void timeRTC() { // DS3231 Precision RTC sDate = ""; sTime = ""; // Date Time DateTime now = RTC.now(); // sData sDate += String(now.year(), DEC); sDate += "/"; sDate += String(now.month(), DEC); sDate += "/"; sDate += String(now.day(), DEC); // sTime sTime += String(now.hour(), DEC); sTime += ":"; sTime += String(now.minute(), DEC); sTime += ":"; sTime += String(now.second(), DEC); }
getSD.ino
// MicroSD Card // MicroSD Setup void setupSD() { // MicroSD Card // See if the card is present and can be initialized: if (!SD.begin(chipSelect)) { // Don't do anything more: while (1); } } // MicroSD Card void isSD() { zzzzzz = ""; // Version|Date|Time|Temperature Celsius|Humidity|Altitude Meters|Barometric Pressure //|eCO2 Concentration|tVOC Concentration| zzzzzz = sver + "|" + sDate + "|" + sTime + "|" + BMEtempC + "|" + BMEhumid + "|" + BMEaltitudeM + "|" + BMEpressure + "|" + CCS811CO2 + "|" + CCS811TVOC + "|"; // Open the file. Note that only one file can be open at a time, // so you have to close this one before opening another. File dataFile = SD.open("DLE22Log.txt", FILE_WRITE); // If the file is available, write to it: if (dataFile) { // Write dataFile.println( zzzzzz ); dataFile.close(); } }
setup.ino
// Setup void setup() { // Delay delay( 100 ); // Set up I2C bus Wire.begin(); // Delay delay( 50 ); // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure myBME280.begin(); // CCS811 - eCO2 & tVOC myCCS811.begin(); // Setup RTC setupRTC(); //MicroSD Card setupSD(); // LED Red pinMode( iLEDR , OUTPUT); // Turn the LED Red on HIGH digitalWrite( iLEDR , HIGH); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc
Project #23: E-Textiles – DS3231 Precision RTC – Mk06
——
#DonLucElectronics #DonLuc #ETextiles #Wearable #FLORA #MicroOLED #BME280 #CCS811 #RTC #Arduino #Project #Programming #Electronics #Microcontrollers #Consultant
——
——
——
——
DS3231 Precision RTC FeatherWing
A Feather board without ambition is a Feather board without FeatherWings. This is the DS3231 Precision RTC FeatherWing it adds an extremely accurate I2C-integrated Real Time Clock (RTC) with a Temperature Compensated Crystal Oscillator (TCXO). This RTC is the most precise you can get in a small, low power package.
Most RTCs use an external 32kHz timing crystal that is used to keep time with low current draw. And that’s all well and good, but those crystals have slight drift, particularly when the temperature changes, the temperature changes the oscillation frequency very very very slightly but it does add up. This RTC is in a beefy package because the crystal is inside the chip, and right next to the integrated crystal is a temperature sensor. That sensor compensates for the frequency changes by adding or removing clock ticks so that the timekeeping stays on schedule.
With a CR1220 12mm coin cell plugged into the top of the FeatherWing, you can get years of precision time keeping, even when main power is lost. Great for datalogging and clocks or anything where you need to really know the time.
DL2204Mk06
1 x FLORA – Version 1.0a
1 x SparkFun Micro OLED
1 x SparkFun Environmental Combo CCS811/BME280
1 x DS3231 Precision RTC FeatherWing
1 x CR1220 Coin Cell Battery
1 x RGB Smart NeoPixel
1 x Half-Size Breadboard
1 x SparkFun Cerberus USB Cable
FLORA – Version 1.0a
SDA – Digital 2
SCL – Digital 3
NEO – Digital 6
VIN – +5V
GND – GND
——
DL2204Mk06p.ino
/* ***** Don Luc Electronics © ***** Software Version Information Project #23: E-Textiles - DS3231 Precision RTC - Mk06 23-06 DL2204Mk06p.ino 1 x FLORA - Version 1.0a 1 x SparkFun Micro OLED 1 x SparkFun Environmental Combo CCS811/BME280 1 x DS3231 Precision RTC FeatherWing 1 x CR1220 Coin Cell Battery 1 x RGB Smart NeoPixel 1 x Half-Size Breadboard 1 x SparkFun Cerberus USB Cable */ // Include the Library Code // Wire #include <Wire.h> // NeoPixels #include <Adafruit_NeoPixel.h> // SparkFun Micro OLED #include <SFE_MicroOLED.h> // SparkFun BME280 - Humidity, Temperature, Altitude and Barometric Pressure #include <SparkFunBME280.h> // SparkFun CCS811 - eCO2 & tVOC #include <SparkFunCCS811.h> // Date and time DS3231 RTC #include <RTClib.h> // NeoPixels // On digital pin 6 #define PIN 6 // NeoPixels NUMPIXELS = 1 #define NUMPIXELS 1 // Pixels Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Red int red = 0; // Green int green = 0; // Blue int blue = 0; // Neopix int iNeo = 0; // Value int zz = 0; // SparkFun Micro OLED #define PIN_RESET 9 #define DC_JUMPER 1 // I2C declaration MicroOLED oled(PIN_RESET, DC_JUMPER); // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure BME280 myBME280; // Temperature Celsius float BMEtempC = 0; // Humidity float BMEhumid = 0; // Altitude Meters float BMEaltitudeM = 0; // Barometric Pressure float BMEpressure = 0; // SparkFun CCS811 - eCO2 & tVOC // Default I2C Address #define CCS811_ADDR 0x5B CCS811 myCCS811(CCS811_ADDR); // eCO2 float CCS811CO2 = 0; // TVOC float CCS811TVOC = 0; // Date and time functions using a DS3231 RTC RTC_DS3231 RTC; String sDate; String sTime; // Software Version Information String sver = "23-06"; void loop() { // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure isBME280(); // SparkFun CCS811 - eCO2 & tVOC isCCS811(); // FLORA isFLORA(); // Dates and Time timeRTC(); // Micro OLED isMicroOLED(); }
getBME280.ino
// SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure // isBME280 - Temperature, Humidity, Altitude and Barometric Pressure void isBME280(){ // Temperature Celsius BMEtempC = myBME280.readTempC(); // Humidity BMEhumid = myBME280.readFloatHumidity() ; // Altitude Meters BMEaltitudeM = myBME280.readFloatAltitudeMeters(); // Barometric Pressure BMEpressure = myBME280.readFloatPressure(); }
getCCS811.ino
// CCS811 - eCO2 & tVOC // isCCS811 - eCO2 & tVOC void isCCS811(){ // This sends the temperature & humidity data to the CCS811 myCCS811.setEnvironmentalData(BMEhumid, BMEtempC); // Calling this function updates the global tVOC and eCO2 variables myCCS811.readAlgorithmResults(); // eCO2 Concentration CCS811CO2 = myCCS811.getCO2(); // tVOC Concentration CCS811TVOC = myCCS811.getTVOC(); }
getFLORA.ino
// FLORA // isFLORA void isFLORA() { // FLORA = Temperature Celsius // BMEtempC // FLORA = Temperature Celsius if ( BMEtempC >= 50 ) { // 40 <= Temperature Celsius < 50~~~ zz = 2; isNUMPIXELS(); } else if ( BMEtempC >= 40 ) { // 30 <= Temperature Celsius < 40 zz = 3; isNUMPIXELS(); } else if ( BMEtempC >= 30 ) { // 20 <= Temperature Celsius < 30 zz = 4; isNUMPIXELS(); } else if ( BMEtempC >= 20 ) { // 10 <= Temperature Celsius < 20 zz = 0; isNUMPIXELS(); } else if ( BMEtempC >= 10 ) { // ~~~0 <= Temperature Celsius < 10 zz = 1; isNUMPIXELS(); } }
getMicroOLED.ino
// SparkFun Micro OLED // Setup Micro OLED void setupMicroOLED() { // Initialize the OLED oled.begin(); // Clear the display's internal memory oled.clear(ALL); // Display what's in the buffer (splashscreen) oled.display(); // Delay 1000 ms delay(1000); // Clear the buffer. oled.clear(PAGE); } // Micro OLED void isMicroOLED() { // Text Display BME280 // Clear the display oled.clear(PAGE); // Set cursor to top-left oled.setCursor(0, 0); // Set font to type 0 oled.setFontType(0); // Temperature Celsius oled.print("T: "); oled.print(BMEtempC, 2); oled.setCursor(0, 10); // Humidity oled.print("H: "); oled.print(BMEhumid, 0); oled.setCursor(0, 20); // Altitude Meters oled.print("A: "); oled.print(BMEaltitudeM, 1); oled.setCursor(0, 30); // Barometric Pressure oled.print("P: "); oled.print(BMEpressure, 0); oled.display(); // Delay delay( 2000 ); // Text Display CCS811 // Clear the display oled.clear(PAGE); // Set cursor to top-left oled.setCursor(0, 0); // Set font to type 0 oled.setFontType(0); // Date oled.setCursor(0, 0); oled.print(sDate); // Time oled.setCursor(0, 10); oled.print(sTime); // eCO2 Concentration oled.setCursor(0, 20); oled.print("C: "); oled.print(CCS811CO2, 0); // tVOC Concentration oled.setCursor(0, 30); oled.print("V: "); oled.print(CCS811TVOC, 0); oled.display(); // Delay delay( 2000 ); }
getNeopix.ino
// NeoPixels // Neopix void isNeopix() { // Pixels pixels.setBrightness( 150 ); // Pixels color takes RGB values, from 0,0,0 up to 255,255,255 pixels.setPixelColor( iNeo, pixels.Color(red,green,blue) ); // This sends the updated pixel color to the hardware pixels.show(); // Delay for a period of time (in milliseconds) delay(50); } // isNUMPIXELS void isNUMPIXELS() { // Neopix Value switch ( zz ) { case 0: // NeoPixels Green // Red red = 0; // Green green = 255; // Blue blue = 0; // Neopix iNeo = 0; isNeopix(); break; case 1: // NeoPixels Blue // Red red = 0; // Green green = 0; // Blue blue = 255; // Neopix iNeo = 0; isNeopix(); break; case 2: // NeoPixels Red // Red red = 255; // Green green = 0; // Blue blue = 0; // Neopix iNeo = 0; isNeopix(); break; case 3: // NeoPixels Yellow // Red red = 255; // Green green = 255; // Blue blue = 0; // Neopix iNeo = 0; isNeopix(); break; case 4: // NeoPixels Magenta // Red red = 255; // Green green = 0; // Blue blue = 255; // Neopix iNeo = 0; isNeopix(); break; case 5: // NeoPixels Cyan // Red red = 0; // Green green = 255; // Blue blue = 255; // Neopix iNeo = 0; isNeopix(); break; case 6: // NeoPixels White // Red red = 255; // Green green = 255; // Blue blue = 255; // Neopix iNeo = 0; isNeopix(); break; } } // isNUMPIXELSoff void isNUMPIXELSoff() { // Black Off // NeoPixels // Red red = 0; // Green green = 0; // Blue blue = 0; isNeopix(); }
getRTCDS3231.ino
// DS3231 Precision RTC // Setup RTC void setupRTC() { // DS3231 Precision RTC RTC.begin(); if (! RTC.begin()) { while (1); } DateTime now = RTC.now(); if (RTC.lostPower()) { // Following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // August 2, 2021 at 13:53:0 you would call: // RTC.adjust(DateTime(2022, 4, 26, 11, 39, 0)); } } // timeRTC void timeRTC() { // DS3231 Precision RTC sDate = ""; sTime = ""; // Date Time DateTime now = RTC.now(); // sData sDate += String(now.year(), DEC); sDate += "/"; sDate += String(now.month(), DEC); sDate += "/"; sDate += String(now.day(), DEC); // sTime sTime += String(now.hour(), DEC); sTime += ":"; sTime += String(now.minute(), DEC); sTime += ":"; sTime += String(now.second(), DEC); }
setup.ino
// Setup void setup() { // NeoPixels // This initializes the NeoPixel library pixels.begin(); // Delay for a period of time (in milliseconds) delay(50); // isNUMPIXELS Off isNUMPIXELSoff(); // Set up I2C bus Wire.begin(); // Delay for a period of time (in milliseconds) delay(50); // SparkFun BME280 - Temperature, Humidity, Altitude and Barometric Pressure myBME280.begin(); // CCS811 - eCO2 & tVOC myCCS811.begin(); // Setup RTC setupRTC(); // Setup Micro OLED setupMicroOLED(); }
——
People can contact us: https://www.donluc.com/?page_id=1927
Technology Experience
- Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi,Espressif, etc…)
- IoT
- Robotics
- Camera and Video Capture Receiver Stationary, Wheel/Tank and Underwater Vehicle
- Unmanned Vehicles Terrestrial and Marine
- Research & Development (R & D)
- Desktop Applications (Windows, OSX, Linux, Multi-OS, Multi-Tier, etc…)
- Mobile Applications (Android, iOS, Blackberry, Windows Mobile, Windows CE, etc…)
- Web Applications (LAMP, Scripting, Java, ASP, ASP.NET, RoR, Wakanda, etc…)
- Social Media Programming & Integration (Facebook, Twitter, YouTube, Pinterest, etc…)
- Content Management Systems (WordPress, Drupal, Joomla, Moodle, etc…)
- Bulletin Boards (phpBB, SMF, Vanilla, jobberBase, etc…)
- eCommerce (WooCommerce, OSCommerce, ZenCart, PayPal Shopping Cart, etc…)
Instructor and E-Mentor
- IoT
- PIC Microcontrollers
- Arduino
- Raspberry Pi
- Espressif
- Robotics
- DOS, Windows, OSX, Linux, iOS, Android, Multi-OS
- Linux-Apache-PHP-MySQL
Follow Us
J. Luc Paquin – Curriculum Vitae – 2022 English & Español
https://www.jlpconsultants.com/luc/
Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/channel/UC5eRjrGn1CqkkGfZy0jxEdA
Twitter: https://twitter.com/labs_steam
Pinterest: https://www.pinterest.com/NeoSteamLabs/
Instagram: https://www.instagram.com/neosteamlabs/
Don Luc