Components and supplies
1
Arduino UNO
1
8×8 Dot Matrix LED Display Module MAX7219
1
Male/Female Jumper Wires
Apps and platforms
1
Arduino IDE
Project description
Code
MAX7219 Boxy Thingies.
arduino
Download the "LedControl" Library on the Arduino IDE Software or Github, Select File, Examples, Find the library name, Then click "LCDemoMatrix" Or just paste this code.
1//We always have to include the library 2#include "LedControl.h" 3 4/* 5 Now we need a LedControl to work with. 6 ***** These pin numbers will probably not work with your hardware ***** 7 pin 12 is connected to the DataIn 8 pin 11 is connected to the CLK 9 pin 10 is connected to LOAD or CS 10 We have only a single MAX72XX. 11 */ 12LedControl lc=LedControl(12,11,10,1); 13 14/* we always wait a bit between updates of the display */ 15unsigned long delaytime=100; 16 17void setup() { 18 /* 19 The MAX72XX is in power-saving mode on startup, 20 we have to do a wakeup call 21 */ 22 lc.shutdown(0,false); 23 /* Set the brightness to a medium values */ 24 lc.setIntensity(0,8); 25 /* and clear the display */ 26 lc.clearDisplay(0); 27} 28 29// Go to https://xantorohara.github.io/led-matrix-editor to make or configure what you want to see on your LED matrix. 30 31 32void writeArduinoOnMatrix() { 33 /* here is the data for the characters */ 34 byte a[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; 35 byte b[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 36 byte c[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 37 byte d[8]={B00000000,B00000000,B00011000,B00011000,B00011000,B00011000,B00000000,B00000000}; 38 byte e[8]={B00000000,B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B00000000}; 39 byte f[8]={B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B00011000}; 40 byte g[8]={B00111100,B00100100,B00100100,B00100100,B00100100,B00100100,B00100100,B00111100}; 41 byte h[8]={B01111110,B01000010,B01000010,B01000010,B01000010,B01000010,B01000010,B01111110}; 42 byte i[8]={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; 43 byte j[8]={B00000000,B11111111,B10000001,B10000001,B10000001,B10000001,B11111111,B00000000}; 44 byte k[8]={B00000000,B00000000,B11111111,B10000001,B10000001,B11111111,B00000000,B00000000}; 45 byte l[8]={B00000000,B00000000,B00000000,B11111111,B11111111,B00000000,B00000000,B00000000}; 46 byte m[8]={B00000000,B00000000,B00000000,B01111110,B01111110,B00000000,B00000000,B00000000}; 47 byte n[8]={B00000000,B00000000,B00000000,B00111100,B00111100,B00000000,B00000000,B00000000}; 48 byte o[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 49 byte p[8]={B00000000,B00000000,B00111100,B00100100,B00100100,B00111100,B00000000,B00000000}; 50 byte q[8]={B00000000,B01111110,B01000010,B01000010,B01000010,B01000010,B01111110,B00000000}; 51 byte r[8]={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; 52 byte s[8]={B00000000,B01111110,B01000010,B01000010,B01000010,B01000010,B01111110,B00000000}; 53 byte t[8]={B00000000,B00000000,B00111100,B00100100,B00100100,B00111100,B00000000,B00000000}; 54 byte u[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 55 56 /* now display them one by one with a small delay */ 57 lc.setRow(0,0,a[0]); 58 lc.setRow(0,1,a[1]); 59 lc.setRow(0,2,a[2]); 60 lc.setRow(0,3,a[3]); 61 lc.setRow(0,4,a[4]); 62 lc.setRow(0,5,a[5]); 63 lc.setRow(0,6,a[6]); 64 lc.setRow(0,7,a[7]); 65 delay(delaytime); 66 lc.setRow(0,0,b[0]); 67 lc.setRow(0,1,b[1]); 68 lc.setRow(0,2,b[2]); 69 lc.setRow(0,3,b[3]); 70 lc.setRow(0,4,b[4]); 71 lc.setRow(0,5,b[5]); 72 lc.setRow(0,6,b[6]); 73 lc.setRow(0,7,b[7]); 74 delay(delaytime); 75 lc.setRow(0,0,c[0]); 76 lc.setRow(0,1,c[1]); 77 lc.setRow(0,2,c[2]); 78 lc.setRow(0,3,c[3]); 79 lc.setRow(0,4,c[4]); 80 lc.setRow(0,5,c[5]); 81 lc.setRow(0,6,c[6]); 82 lc.setRow(0,7,c[7]); 83 delay(delaytime); 84 lc.setRow(0,0,d[0]); 85 lc.setRow(0,1,d[1]); 86 lc.setRow(0,2,d[2]); 87 lc.setRow(0,3,d[3]); 88 lc.setRow(0,4,d[4]); 89 lc.setRow(0,5,d[5]); 90 lc.setRow(0,6,d[6]); 91 lc.setRow(0,7,d[7]); 92 delay(delaytime); 93 lc.setRow(0,0,e[0]); 94 lc.setRow(0,1,e[1]); 95 lc.setRow(0,2,e[2]); 96 lc.setRow(0,3,e[3]); 97 lc.setRow(0,4,e[4]); 98 lc.setRow(0,5,e[5]); 99 lc.setRow(0,6,e[6]); 100 lc.setRow(0,7,e[7]); 101 delay(delaytime); 102 lc.setRow(0,0,f[0]); 103 lc.setRow(0,1,f[1]); 104 lc.setRow(0,2,f[2]); 105 lc.setRow(0,3,f[3]); 106 lc.setRow(0,4,f[4]); 107 lc.setRow(0,5,f[5]); 108 lc.setRow(0,6,f[6]); 109 lc.setRow(0,7,f[7]); 110 delay(delaytime); 111 lc.setRow(0,0,g[0]); 112 lc.setRow(0,1,g[1]); 113 lc.setRow(0,2,g[2]); 114 lc.setRow(0,3,g[3]); 115 lc.setRow(0,4,g[4]); 116 lc.setRow(0,5,g[5]); 117 lc.setRow(0,6,g[6]); 118 lc.setRow(0,7,g[7]); 119 delay(delaytime); 120 lc.setRow(0,0,h[0]); 121 lc.setRow(0,1,h[1]); 122 lc.setRow(0,2,h[2]); 123 lc.setRow(0,3,h[3]); 124 lc.setRow(0,4,h[4]); 125 lc.setRow(0,5,h[5]); 126 lc.setRow(0,6,h[6]); 127 lc.setRow(0,7,h[7]); 128 delay(delaytime); 129 lc.setRow(0,0,i[0]); 130 lc.setRow(0,1,i[1]); 131 lc.setRow(0,2,i[2]); 132 lc.setRow(0,3,i[3]); 133 lc.setRow(0,4,i[4]); 134 lc.setRow(0,5,i[5]); 135 lc.setRow(0,6,i[6]); 136 lc.setRow(0,7,i[7]); 137 delay(delaytime); 138 lc.setRow(0,0,j[0]); 139 lc.setRow(0,1,j[1]); 140 lc.setRow(0,2,j[2]); 141 lc.setRow(0,3,j[3]); 142 lc.setRow(0,4,j[4]); 143 lc.setRow(0,5,j[5]); 144 lc.setRow(0,6,j[6]); 145 lc.setRow(0,7,j[7]); 146 delay(delaytime); 147 lc.setRow(0,0,k[0]); 148 lc.setRow(0,1,k[1]); 149 lc.setRow(0,2,k[2]); 150 lc.setRow(0,3,k[3]); 151 lc.setRow(0,4,k[4]); 152 lc.setRow(0,5,k[5]); 153 lc.setRow(0,6,k[6]); 154 lc.setRow(0,7,k[7]); 155 delay(delaytime); 156 lc.setRow(0,0,l[0]); 157 lc.setRow(0,1,l[1]); 158 lc.setRow(0,2,l[2]); 159 lc.setRow(0,3,l[3]); 160 lc.setRow(0,4,l[4]); 161 lc.setRow(0,5,l[5]); 162 lc.setRow(0,6,l[6]); 163 lc.setRow(0,7,l[7]); 164 delay(delaytime); 165 lc.setRow(0,0,m[0]); 166 lc.setRow(0,1,m[1]); 167 lc.setRow(0,2,m[2]); 168 lc.setRow(0,3,m[3]); 169 lc.setRow(0,4,m[4]); 170 lc.setRow(0,5,m[5]); 171 lc.setRow(0,6,m[6]); 172 lc.setRow(0,7,m[7]); 173 delay(delaytime); 174 lc.setRow(0,0,n[0]); 175 lc.setRow(0,1,n[1]); 176 lc.setRow(0,2,n[2]); 177 lc.setRow(0,3,n[3]); 178 lc.setRow(0,4,n[4]); 179 lc.setRow(0,5,n[5]); 180 lc.setRow(0,6,n[6]); 181 lc.setRow(0,7,n[7]); 182 delay(delaytime); 183 lc.setRow(0,0,o[0]); 184 lc.setRow(0,1,o[1]); 185 lc.setRow(0,2,o[2]); 186 lc.setRow(0,3,o[3]); 187 lc.setRow(0,4,o[4]); 188 lc.setRow(0,5,o[5]); 189 lc.setRow(0,6,o[6]); 190 lc.setRow(0,7,o[7]); 191 delay(delaytime); 192 lc.setRow(0,0,p[0]); 193 lc.setRow(0,1,p[1]); 194 lc.setRow(0,2,p[2]); 195 lc.setRow(0,3,p[3]); 196 lc.setRow(0,4,p[4]); 197 lc.setRow(0,5,p[5]); 198 lc.setRow(0,6,p[6]); 199 lc.setRow(0,7,p[7]); 200 delay(delaytime); 201 lc.setRow(0,0,q[0]); 202 lc.setRow(0,1,q[1]); 203 lc.setRow(0,2,q[2]); 204 lc.setRow(0,3,q[3]); 205 lc.setRow(0,4,q[4]); 206 lc.setRow(0,5,q[5]); 207 lc.setRow(0,6,q[6]); 208 lc.setRow(0,7,q[7]); 209 delay(delaytime); 210 lc.setRow(0,0,r[0]); 211 lc.setRow(0,1,r[1]); 212 lc.setRow(0,2,r[2]); 213 lc.setRow(0,3,r[3]); 214 lc.setRow(0,4,r[4]); 215 lc.setRow(0,5,r[5]); 216 lc.setRow(0,6,r[6]); 217 lc.setRow(0,7,r[7]); 218 delay(delaytime); 219 lc.setRow(0,0,s[0]); 220 lc.setRow(0,1,s[1]); 221 lc.setRow(0,2,s[2]); 222 lc.setRow(0,3,s[3]); 223 lc.setRow(0,4,s[4]); 224 lc.setRow(0,5,s[5]); 225 lc.setRow(0,6,s[6]); 226 lc.setRow(0,7,s[7]); 227 delay(delaytime); 228 lc.setRow(0,0,t[0]); 229 lc.setRow(0,1,t[1]); 230 lc.setRow(0,2,t[2]); 231 lc.setRow(0,3,t[3]); 232 lc.setRow(0,4,t[4]); 233 lc.setRow(0,5,t[5]); 234 lc.setRow(0,6,t[6]); 235 lc.setRow(0,7,t[7]); 236 delay(delaytime); 237 lc.setRow(0,0,u[0]); 238 lc.setRow(0,1,u[1]); 239 lc.setRow(0,2,u[2]); 240 lc.setRow(0,3,u[3]); 241 lc.setRow(0,4,u[4]); 242 lc.setRow(0,5,u[5]); 243 lc.setRow(0,6,u[6]); 244 lc.setRow(0,7,u[7]); 245 delay(delaytime); 246} 247 248void loop() { 249 writeArduinoOnMatrix(); 250} 251
MAX7219 Boxy Thingies.
arduino
Download the "LedControl" Library on the Arduino IDE Software or Github, Select File, Examples, Find the library name, Then click "LCDemoMatrix" Or just paste this code.
1//We always have to include the library 2#include "LedControl.h" 3 4/* 5 Now we need a LedControl to work with. 6 ***** These pin numbers will probably not work with your hardware ***** 7 pin 12 is connected to the DataIn 8 pin 11 is connected to the CLK 9 pin 10 is connected to LOAD or CS 10 We have only a single MAX72XX. 11 */ 12LedControl lc=LedControl(12,11,10,1); 13 14/* we always wait a bit between updates of the display */ 15unsigned long delaytime=100; 16 17void setup() { 18 /* 19 The MAX72XX is in power-saving mode on startup, 20 we have to do a wakeup call 21 */ 22 lc.shutdown(0,false); 23 /* Set the brightness to a medium values */ 24 lc.setIntensity(0,8); 25 /* and clear the display */ 26 lc.clearDisplay(0); 27} 28 29// Go to https://xantorohara.github.io/led-matrix-editor to make or configure what you want to see on your LED matrix. 30 31 32void writeArduinoOnMatrix() { 33 /* here is the data for the characters */ 34 byte a[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; 35 byte b[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 36 byte c[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 37 byte d[8]={B00000000,B00000000,B00011000,B00011000,B00011000,B00011000,B00000000,B00000000}; 38 byte e[8]={B00000000,B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B00000000}; 39 byte f[8]={B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B00011000}; 40 byte g[8]={B00111100,B00100100,B00100100,B00100100,B00100100,B00100100,B00100100,B00111100}; 41 byte h[8]={B01111110,B01000010,B01000010,B01000010,B01000010,B01000010,B01000010,B01111110}; 42 byte i[8]={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; 43 byte j[8]={B00000000,B11111111,B10000001,B10000001,B10000001,B10000001,B11111111,B00000000}; 44 byte k[8]={B00000000,B00000000,B11111111,B10000001,B10000001,B11111111,B00000000,B00000000}; 45 byte l[8]={B00000000,B00000000,B00000000,B11111111,B11111111,B00000000,B00000000,B00000000}; 46 byte m[8]={B00000000,B00000000,B00000000,B01111110,B01111110,B00000000,B00000000,B00000000}; 47 byte n[8]={B00000000,B00000000,B00000000,B00111100,B00111100,B00000000,B00000000,B00000000}; 48 byte o[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 49 byte p[8]={B00000000,B00000000,B00111100,B00100100,B00100100,B00111100,B00000000,B00000000}; 50 byte q[8]={B00000000,B01111110,B01000010,B01000010,B01000010,B01000010,B01111110,B00000000}; 51 byte r[8]={B11111111,B10000001,B10000001,B10000001,B10000001,B10000001,B10000001,B11111111}; 52 byte s[8]={B00000000,B01111110,B01000010,B01000010,B01000010,B01000010,B01111110,B00000000}; 53 byte t[8]={B00000000,B00000000,B00111100,B00100100,B00100100,B00111100,B00000000,B00000000}; 54 byte u[8]={B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000,B00000000}; 55 56 /* now display them one by one with a small delay */ 57 lc.setRow(0,0,a[0]); 58 lc.setRow(0,1,a[1]); 59 lc.setRow(0,2,a[2]); 60 lc.setRow(0,3,a[3]); 61 lc.setRow(0,4,a[4]); 62 lc.setRow(0,5,a[5]); 63 lc.setRow(0,6,a[6]); 64 lc.setRow(0,7,a[7]); 65 delay(delaytime); 66 lc.setRow(0,0,b[0]); 67 lc.setRow(0,1,b[1]); 68 lc.setRow(0,2,b[2]); 69 lc.setRow(0,3,b[3]); 70 lc.setRow(0,4,b[4]); 71 lc.setRow(0,5,b[5]); 72 lc.setRow(0,6,b[6]); 73 lc.setRow(0,7,b[7]); 74 delay(delaytime); 75 lc.setRow(0,0,c[0]); 76 lc.setRow(0,1,c[1]); 77 lc.setRow(0,2,c[2]); 78 lc.setRow(0,3,c[3]); 79 lc.setRow(0,4,c[4]); 80 lc.setRow(0,5,c[5]); 81 lc.setRow(0,6,c[6]); 82 lc.setRow(0,7,c[7]); 83 delay(delaytime); 84 lc.setRow(0,0,d[0]); 85 lc.setRow(0,1,d[1]); 86 lc.setRow(0,2,d[2]); 87 lc.setRow(0,3,d[3]); 88 lc.setRow(0,4,d[4]); 89 lc.setRow(0,5,d[5]); 90 lc.setRow(0,6,d[6]); 91 lc.setRow(0,7,d[7]); 92 delay(delaytime); 93 lc.setRow(0,0,e[0]); 94 lc.setRow(0,1,e[1]); 95 lc.setRow(0,2,e[2]); 96 lc.setRow(0,3,e[3]); 97 lc.setRow(0,4,e[4]); 98 lc.setRow(0,5,e[5]); 99 lc.setRow(0,6,e[6]); 100 lc.setRow(0,7,e[7]); 101 delay(delaytime); 102 lc.setRow(0,0,f[0]); 103 lc.setRow(0,1,f[1]); 104 lc.setRow(0,2,f[2]); 105 lc.setRow(0,3,f[3]); 106 lc.setRow(0,4,f[4]); 107 lc.setRow(0,5,f[5]); 108 lc.setRow(0,6,f[6]); 109 lc.setRow(0,7,f[7]); 110 delay(delaytime); 111 lc.setRow(0,0,g[0]); 112 lc.setRow(0,1,g[1]); 113 lc.setRow(0,2,g[2]); 114 lc.setRow(0,3,g[3]); 115 lc.setRow(0,4,g[4]); 116 lc.setRow(0,5,g[5]); 117 lc.setRow(0,6,g[6]); 118 lc.setRow(0,7,g[7]); 119 delay(delaytime); 120 lc.setRow(0,0,h[0]); 121 lc.setRow(0,1,h[1]); 122 lc.setRow(0,2,h[2]); 123 lc.setRow(0,3,h[3]); 124 lc.setRow(0,4,h[4]); 125 lc.setRow(0,5,h[5]); 126 lc.setRow(0,6,h[6]); 127 lc.setRow(0,7,h[7]); 128 delay(delaytime); 129 lc.setRow(0,0,i[0]); 130 lc.setRow(0,1,i[1]); 131 lc.setRow(0,2,i[2]); 132 lc.setRow(0,3,i[3]); 133 lc.setRow(0,4,i[4]); 134 lc.setRow(0,5,i[5]); 135 lc.setRow(0,6,i[6]); 136 lc.setRow(0,7,i[7]); 137 delay(delaytime); 138 lc.setRow(0,0,j[0]); 139 lc.setRow(0,1,j[1]); 140 lc.setRow(0,2,j[2]); 141 lc.setRow(0,3,j[3]); 142 lc.setRow(0,4,j[4]); 143 lc.setRow(0,5,j[5]); 144 lc.setRow(0,6,j[6]); 145 lc.setRow(0,7,j[7]); 146 delay(delaytime); 147 lc.setRow(0,0,k[0]); 148 lc.setRow(0,1,k[1]); 149 lc.setRow(0,2,k[2]); 150 lc.setRow(0,3,k[3]); 151 lc.setRow(0,4,k[4]); 152 lc.setRow(0,5,k[5]); 153 lc.setRow(0,6,k[6]); 154 lc.setRow(0,7,k[7]); 155 delay(delaytime); 156 lc.setRow(0,0,l[0]); 157 lc.setRow(0,1,l[1]); 158 lc.setRow(0,2,l[2]); 159 lc.setRow(0,3,l[3]); 160 lc.setRow(0,4,l[4]); 161 lc.setRow(0,5,l[5]); 162 lc.setRow(0,6,l[6]); 163 lc.setRow(0,7,l[7]); 164 delay(delaytime); 165 lc.setRow(0,0,m[0]); 166 lc.setRow(0,1,m[1]); 167 lc.setRow(0,2,m[2]); 168 lc.setRow(0,3,m[3]); 169 lc.setRow(0,4,m[4]); 170 lc.setRow(0,5,m[5]); 171 lc.setRow(0,6,m[6]); 172 lc.setRow(0,7,m[7]); 173 delay(delaytime); 174 lc.setRow(0,0,n[0]); 175 lc.setRow(0,1,n[1]); 176 lc.setRow(0,2,n[2]); 177 lc.setRow(0,3,n[3]); 178 lc.setRow(0,4,n[4]); 179 lc.setRow(0,5,n[5]); 180 lc.setRow(0,6,n[6]); 181 lc.setRow(0,7,n[7]); 182 delay(delaytime); 183 lc.setRow(0,0,o[0]); 184 lc.setRow(0,1,o[1]); 185 lc.setRow(0,2,o[2]); 186 lc.setRow(0,3,o[3]); 187 lc.setRow(0,4,o[4]); 188 lc.setRow(0,5,o[5]); 189 lc.setRow(0,6,o[6]); 190 lc.setRow(0,7,o[7]); 191 delay(delaytime); 192 lc.setRow(0,0,p[0]); 193 lc.setRow(0,1,p[1]); 194 lc.setRow(0,2,p[2]); 195 lc.setRow(0,3,p[3]); 196 lc.setRow(0,4,p[4]); 197 lc.setRow(0,5,p[5]); 198 lc.setRow(0,6,p[6]); 199 lc.setRow(0,7,p[7]); 200 delay(delaytime); 201 lc.setRow(0,0,q[0]); 202 lc.setRow(0,1,q[1]); 203 lc.setRow(0,2,q[2]); 204 lc.setRow(0,3,q[3]); 205 lc.setRow(0,4,q[4]); 206 lc.setRow(0,5,q[5]); 207 lc.setRow(0,6,q[6]); 208 lc.setRow(0,7,q[7]); 209 delay(delaytime); 210 lc.setRow(0,0,r[0]); 211 lc.setRow(0,1,r[1]); 212 lc.setRow(0,2,r[2]); 213 lc.setRow(0,3,r[3]); 214 lc.setRow(0,4,r[4]); 215 lc.setRow(0,5,r[5]); 216 lc.setRow(0,6,r[6]); 217 lc.setRow(0,7,r[7]); 218 delay(delaytime); 219 lc.setRow(0,0,s[0]); 220 lc.setRow(0,1,s[1]); 221 lc.setRow(0,2,s[2]); 222 lc.setRow(0,3,s[3]); 223 lc.setRow(0,4,s[4]); 224 lc.setRow(0,5,s[5]); 225 lc.setRow(0,6,s[6]); 226 lc.setRow(0,7,s[7]); 227 delay(delaytime); 228 lc.setRow(0,0,t[0]); 229 lc.setRow(0,1,t[1]); 230 lc.setRow(0,2,t[2]); 231 lc.setRow(0,3,t[3]); 232 lc.setRow(0,4,t[4]); 233 lc.setRow(0,5,t[5]); 234 lc.setRow(0,6,t[6]); 235 lc.setRow(0,7,t[7]); 236 delay(delaytime); 237 lc.setRow(0,0,u[0]); 238 lc.setRow(0,1,u[1]); 239 lc.setRow(0,2,u[2]); 240 lc.setRow(0,3,u[3]); 241 lc.setRow(0,4,u[4]); 242 lc.setRow(0,5,u[5]); 243 lc.setRow(0,6,u[6]); 244 lc.setRow(0,7,u[7]); 245 delay(delaytime); 246} 247 248void loop() { 249 writeArduinoOnMatrix(); 250} 251
LedControl Library
Downloadable files
Visual Wiring Diagram
Visual Wiring Diagram

Visual Wiring Diagram
Visual Wiring Diagram

Comments
Only logged in users can leave comments