91

Introduction to SPI The Serial Peripheral Interface Bus (SPI) interface is used for communication between multiple devices over short distances, and at high speed. Typically there is a single "master" device, which initiates communications and supplies the clock which controls the data transfer rate. There can be one or more slaves. For more than one slave,...


73

Contrarily to other answers, I'd rather stay away from String for the following reasons: dynamic memory usage (that may quickly lead to heap fragmentation and memory exhaustion) quite slow due to construction/destruction/assignment operators In an embedded environment like Arduino (even for a Mega that has more SRAM), I'd rather use standard C functions: ...


33

They aren't evil per se, but they do tend to get overused where there is no good reason to use them. There are plenty of times when global variables are advantageous. Especially since programming an Arduino is, under the hood, vastly different to programming a PC. The biggest benefit to global variables is static allocation. Especially with large and ...


24

This function can be used to separate a string into pieces based on what the separating character is. String xval = getValue(myString, ':', 0); String yval = getValue(myString, ':', 1); Serial.println("Y:" + yval); Serial.print("X:" + xval); Convert String to int int xvalue = xvalue.toInt(xval); int yvalue = yvalue.toInt(yval); This Chunk of code ...


18

It's very difficult to give a definitive answer without seeing your actual code. Global variables are not evil, and they often make sense in an embedded environment where you typically do a lot of hardware access. You have only four UARTS, only one I2C port, etc. So it makes sense to use globals for variables tied to specific hardware resources. And indeed, ...


16

The best way of doing this, if you want your USB connection to still work, is to remove the P-channel MOSFET T1 from the board. You can't just disconnect the power from the USB port since that power connection goes directly to UVCC on the ATMega16U2 chip. That is used to power the internal USB peripheral (it goes to a 3.3V regulator inside the chip) and ...


15

Background The function millis () returns an unsigned long, which is the number of milliseconds since the processor was reset (until it overflows). See: http://arduino.cc/en/Reference/Millis Example: unsigned long startTime = millis (); Since there are 232 bits in an unsigned long it can count from 0 to 4294967295. Computing this in terms of days we ...


14

There are a number of techniques you could use here to get a unique ID. FTDI chips have a unique serial number programmed onto them. This can only be accessed from the PC side of the connection as far as I am aware. Some of the chips with built in USB (e.g. ATmega8U2/16U2/32U2) have a unique ID in the signature data, normally used for USB. Can easily be ...


13

The chip doesn't have any sort of unique ID as far as I know.... but you could program one into the EEPROM of your boards. EEPROM documetnation You would write to a specific address and then future sketches can read the ID and do whatever with it. You may also be able to see a unqiue ID or address on the host side. I don't know enough about USB devices to ...


12

The row of white blocks is what you get before the screen's initialized. It's normal. The shadow behind the characters is because you have the contrast turned up too high. Adjust it down a little.


11

You could do something like the following, but please take into account several things: If you use readStringUntil(), it will wait until it receives the character or timeouts. Thus, with your current string, the last position will last a little longer, as it has to wait. You can add a trailing & to avoid this timout. You can easily check this behavior ...


11

Section 16, "16-bit Timer/Counter1 with PWM" of Atmel-8271J-AVR- ATmega-Datasheet_11/2015 describes using Timer/Counter-1 for 16-bit PWM, including sample code in both C and assembler. It might take a couple of reads over that section to get familiar with the hardware and learn what else T/C-1 is used for, and that you might have to give up while using it ...


11

Those are unused resistors in resistor arrays. The arrays have 4 resistors side by side in a single package. Not all of the elements are always needed, but they have to be in the schematic anyway since they exist in real life. Elements A and D of Resistor Network 1 (RN1) Elements B and C of Resistor Network 2 (RN2) Element C of Resistor Network 3 (RN3)


10

That is most likely a Fiducial Mark for the vision system of a pick-and-place assembly robot to key off of in order to more precisely place the components on their pads. If you look carefully, you will see a second one located below the DC barrel jack. Boards like this are manufactured in a gridded panel having a number of copies in each direction, and ...


9

The link you provide looks rather old and I don't think it applies to UNO Revision 3 as it has more pins than on the diagram you show. I suggest you rather take a look at this Arduino UNO link which contains uptodate information about the UNO; in there you will see that for R3, the "power rail" has been extended and has the following pins, left to right: 1 ...


9

The simplest way is to change your value range to 0-255. You can't change analogWrite's range, since that is fixed in the core software. analogWrite(5, val >> 2); The >> 2 bit-shifts the value two bits to the right, turning a 10-bit value (0-1023) into an 8-bit value (0-255). It's by far the most efficient way of dividing by 4. On more complex ...


8

There are three power supply pins on the Arduino Uno and on the Mega: 5V - Labelled as 5V. Can be used to power other 5V devices. 3.3V - Labelled as 3.3V. Can be used to power other 3.3V devices. Vin - This also referred to as the 9V pin that is shown in the schematic. This is used to power the Arduino board itself, usually using a 9V battery.


8

Some boards, when connected to a computer, publish their serial number. My Arduino Uno R3 says [16818.451423] usb 3-2: SerialNumber: 85235353137351E02242 Though I'm not sure how unique it is.


8

Some months have passed since my previous answer and now the ESP8266 based WiFi modules are available. They get connected to your project serially (3.3V) and are controlled in a modem like way using AT commands. With a pricing of round about $5 they fit the question better than my previous OpenWrt based answer. For more information about ESP8266 ask your ...


8

What you are facing is the classic time-memory tradeoff. The bit fields will be smaller in memory, but will take more time to operate on. You can count that no matter what processor, the bit fields will be slower. You use the word efficient, but that word has no certain meaning without a metric for what is good or bad. When you only have 8 k of RAM, ...


8

The AM2301 and the DHT22(AM2303) are similar in a number of ways, both in price, specs, ranges and power consumption. They are usually cased a bit of a differently, with the DHT22/AM2303 being packaged with four pins (only three are in use), and the AM2301 (formerly called DHT21) is packaged with three cables and a small plug inside of the case. I would ...


8

I did a lengthy post about RS485. First, your use of Megas seems an overkill, unless you already have them to hand. A Uno, or one of the smaller form-factor boards would seem to be perfectly adequate to monitor a few switches and turn on a couple of lights. Even the Rpi seems unnecessary. Another Uno could easily monitor your RS485 lines and connect via ...


7

You can use Stream.readStringUntil(terminator) passing a different terminator for each part. On each part you then call String.toInt


7

You don't seem to use standard Arduino stuff since you defined your own main() which is normally avoided when programming Arduino. If you take a look at Arduino provided main() (in hardware/cores/arduino/main.cpp), you'll see how it is defined: #include <Arduino.h> int main(void) { init(); #if defined(USBCON) USBDevice.attach(); #endif ...


7

I just happened to buy the same LCD Shields a few days ago, looking for a library to use it with a MEGA 2560 board I found https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code which supports both UNO and MEGA boards. Usage is very, simple if we want to use it for MEGA we should change the header #include "uno_24_shield.h" in SWTFT.cpp to #include "...


7

As far as simplicity is concerned, HC05 would be the way to go. It is by far the most popular and there are a tonne of tutorials on using it (just a quick google search). As for the differences: The HC-05 module can build a connection to other modules. E.g. a Robot being a master and connecting to slave bluetooth module. Or in slave mode to make a wireless ...


7

Is PWM really a signal? To me, it looks like an electric current turned on and kept on for a certain time, then off for a while repeatedly. What makes this a "signal"? At the most basic, it is a signal because we call it such. Even a constant voltage can be a signal, signalling that e.g. a window has not been broken. A PWM signal indicates that we want to ...


7

This is unfortunately not valid in C++: "test" + millis() Rather than concatenating two strings, it's actually doing pointer arithmetic. It's taking the memory address where "test" is stored, and offsetting by the value retrieved from millis(). The result is a totally arbitrary memory location which gets treated like a string. Generally speaking, it's ...


7

There is not a top level, easy to use way. Sorry. It is probably easier to just store your chosen baud rate in a variable when you setup the serial port. Anyway, What you can try to do for the AVR-based, hardware UARTs is undo what Serial.begin does to set up a particular baud rate, but its a bit of a pain. This is the code for setting the baud rate: // ...


7

As explained in the previous answers, your actual problem is not the accuracy of delayMicroseconds(), but rather the resolution of micros(). However, to answer your actual question, there is a more accurate alternative to delayMicroseconds(): the function _delay_us() from the AVR-libc is cycle-accurate and, for example _delay_us(1.125); does exactly what ...


Only top voted, non community-wiki answers of a minimum length are eligible